CCStdIncCheck
@@ -1063,6 +1070,45 @@
Bootlib
+
+ cmsis
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_armcc.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_armclang.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_compiler.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_gcc.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_iccarm.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\cmsis_version.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\core_cm4.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\mpu_armv7.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Device\TI\TM4C123\system_TM4C123.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Device\TI\TM4C123\TM4C123.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Device\TI\TM4C123\TM4C123GH6PGE.h
+
+
+ $PROJ_DIR$\..\lib\cmsis\Include\tz_context.h
+
+ driverlib
@@ -1319,190 +1365,130 @@
- usblib
+ tinyusb
- config
+ cfg
- $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.c
+ $PROJ_DIR$\..\lib\tinyusb\cfg\tusb_config.h
- $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.h
+ $PROJ_DIR$\..\lib\tinyusb\cfg\usb_descriptors.c
- device
-
- $PROJ_DIR$\..\lib\usblib\device\usbdaudio.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdaudio.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdbulk.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdbulk.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdcdc.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdcdc.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdcdesc.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdcomp.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdcomp.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdconfig.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbddfu-rt.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbddfu-rt.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdenum.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdevice.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdevicepriv.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhandler.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhid.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhid.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhidkeyb.c
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhidkeyb.h
-
-
- $PROJ_DIR$\..\lib\usblib\device\usbdhidmouse.c
-
+ port
- $PROJ_DIR$\..\lib\usblib\device\usbdhidmouse.h
+ $PROJ_DIR$\..\lib\tinyusb\port\mentor\musb\dcd_musb.c
- $PROJ_DIR$\..\lib\usblib\device\usbdmsc.c
+ $PROJ_DIR$\..\lib\tinyusb\port\mentor\musb\musb_tm4c.h
- $PROJ_DIR$\..\lib\usblib\device\usbdmsc.h
+ $PROJ_DIR$\..\lib\tinyusb\port\mentor\musb\musb_type.h
- host
-
- $PROJ_DIR$\..\lib\usblib\host\usbhaudio.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhaudio.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhid.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhid.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhidkeyboard.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhidkeyboard.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhidmouse.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhidmouse.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhub.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhhub.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhmsc.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhmsc.h
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhost.h
-
+ src
+
+ class
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\hid\hid.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\hid\hid_device.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\hid\hid_device.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\hid\hid_host.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\hid\hid_host.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\vendor\vendor_device.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\vendor\vendor_device.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\vendor\vendor_host.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\class\vendor\vendor_host.h
+
+
+
+ common
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_common.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_compiler.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_debug.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_fifo.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_fifo.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_mcu.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_private.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_timeout.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_types.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\common\tusb_verify.h
+
+
+
+ device
+
+ $PROJ_DIR$\..\lib\tinyusb\src\device\dcd.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\device\usbd.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\device\usbd.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\device\usbd_control.c
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\device\usbd_pvt.h
+
+
+
+ osal
+
+ $PROJ_DIR$\..\lib\tinyusb\src\osal\osal.h
+
+
+ $PROJ_DIR$\..\lib\tinyusb\src\osal\osal_none.h
+
+
- $PROJ_DIR$\..\lib\usblib\host\usbhostenum.c
+ $PROJ_DIR$\..\lib\tinyusb\src\tusb.c
- $PROJ_DIR$\..\lib\usblib\host\usbhostpriv.h
+ $PROJ_DIR$\..\lib\tinyusb\src\tusb.h
- $PROJ_DIR$\..\lib\usblib\host\usbhscsi.c
-
-
- $PROJ_DIR$\..\lib\usblib\host\usbhscsi.h
+ $PROJ_DIR$\..\lib\tinyusb\src\tusb_option.h
-
- $PROJ_DIR$\..\lib\usblib\usb-ids.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbaudio.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbbuffer.c
-
-
- $PROJ_DIR$\..\lib\usblib\usbcdc.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbdesc.c
-
-
- $PROJ_DIR$\..\lib\usblib\usbdfu.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbdma.c
-
-
- $PROJ_DIR$\..\lib\usblib\usbhid.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbkeyboardmap.c
-
-
- $PROJ_DIR$\..\lib\usblib\usblib.h
-
-
- $PROJ_DIR$\..\lib\usblib\usblibpriv.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbmode.c
-
-
- $PROJ_DIR$\..\lib\usblib\usbmsc.h
-
-
- $PROJ_DIR$\..\lib\usblib\usbringbuf.c
-
-
- $PROJ_DIR$\..\lib\usblib\usbtick.c
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123.h
new file mode 100644
index 000000000..079a33a66
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123.h
@@ -0,0 +1,121 @@
+/**************************************************************************//**
+ * @file TM4C123.h
+ * @brief CMSIS Device System Header File for
+ * Texas Instruments Tiva TM4C123 Device Series
+ * @version V12591
+ * @date 12. February 2014
+ *
+ * @note
+ * modified by Keil
+ ******************************************************************************/
+
+#ifndef TM4C123_H
+#define TM4C123_H
+
+#if defined(TM4C1230C3PM)
+ #include "TM4C1230C3PM.h"
+#elif defined(TM4C1230D5PM)
+ #include "TM4C1230D5PM.h"
+#elif defined(TM4C1230E6PM)
+ #include "TM4C1230E6PM.h"
+#elif defined(TM4C1230H6PM)
+ #include "TM4C1230H6PM.h"
+#elif defined(TM4C1231C3PM)
+ #include "TM4C1231C3PM.h"
+#elif defined(TM4C1231D5PM)
+ #include "TM4C1231D5PM.h"
+#elif defined(TM4C1231D5PZ)
+ #include "TM4C1231D5PZ.h"
+#elif defined(TM4C1231E6PM)
+ #include "TM4C1231E6PM.h"
+#elif defined(TM4C1231E6PZ)
+ #include "TM4C1231E6PZ.h"
+#elif defined(TM4C1231H6PM)
+ #include "TM4C1231H6PM.h"
+#elif defined(TM4C1231H6PZ)
+ #include "TM4C1231H6PZ.h"
+#elif defined(TM4C1232C3PM)
+ #include "TM4C1232C3PM.h"
+#elif defined(TM4C1232D5PM)
+ #include "TM4C1232D5PM.h"
+#elif defined(TM4C1232E6PM)
+ #include "TM4C1232E6PM.h"
+#elif defined(TM4C1232H6PM)
+ #include "TM4C1232H6PM.h"
+#elif defined(TM4C1233C3PM)
+ #include "TM4C1233C3PM.h"
+#elif defined(TM4C1233D5PM)
+ #include "TM4C1233D5PM.h"
+#elif defined(TM4C1233D5PZ)
+ #include "TM4C1233D5PZ.h"
+#elif defined(TM4C1233E6PM)
+ #include "TM4C1233E6PM.h"
+#elif defined(TM4C1233E6PZ)
+ #include "TM4C1233E6PZ.h"
+#elif defined(TM4C1233H6PM)
+ #include "TM4C1233H6PM.h"
+#elif defined(TM4C1233H6PZ)
+ #include "TM4C1233H6PZ.h"
+#elif defined(TM4C1236D5PM)
+ #include "TM4C1236D5PM.h"
+#elif defined(TM4C1236E6PM)
+ #include "TM4C1236E6PM.h"
+#elif defined(TM4C1236H6PM)
+ #include "TM4C1236H6PM.h"
+#elif defined(TM4C1237D5PM)
+ #include "TM4C1237D5PM.h"
+#elif defined(TM4C1237D5PZ)
+ #include "TM4C1237D5PZ.h"
+#elif defined(TM4C1237E6PM)
+ #include "TM4C1237E6PM.h"
+#elif defined(TM4C1237E6PZ)
+ #include "TM4C1237E6PZ.h"
+#elif defined(TM4C1237H6PM)
+ #include "TM4C1237H6PM.h"
+#elif defined(TM4C1237H6PZ)
+ #include "TM4C1237H6PZ.h"
+#elif defined(TM4C123AE6PM)
+ #include "TM4C123AE6PM.h"
+#elif defined(TM4C123AH6PM)
+ #include "TM4C123AH6PM.h"
+#elif defined(TM4C123BE6PM)
+ #include "TM4C123BE6PM.h"
+#elif defined(TM4C123BE6PZ)
+ #include "TM4C123BE6PZ.h"
+#elif defined(TM4C123BH6PM)
+ #include "TM4C123BH6PM.h"
+#elif defined(TM4C123BH6PZ)
+ #include "TM4C123BH6PZ.h"
+#elif defined(TM4C123FE6PM)
+ #include "TM4C123FE6PM.h"
+#elif defined(TM4C123FH6PM)
+ #include "TM4C123FH6PM.h"
+#elif defined(TM4C123GE6PM)
+ #include "TM4C123GE6PM.h"
+#elif defined(TM4C123GE6PZ)
+ #include "TM4C123GE6PZ.h"
+#elif defined(TM4C123GH6PM)
+ #include "TM4C123GH6PM.h"
+#elif defined(TM4C123GH6PZ)
+ #include "TM4C123GH6PZ.h"
+#elif defined(TM4C1231H6PGE)
+ #include "TM4C1231H6PGE.h"
+#elif defined(TM4C1233H6PGE)
+ #include "TM4C1233H6PGE.h"
+#elif defined(TM4C1237H6PGE)
+ #include "TM4C1237H6PGE.h"
+#elif defined(TM4C123BH6PGE)
+ #include "TM4C123BH6PGE.h"
+#elif defined(TM4C123BH6ZRB)
+ #include "TM4C123BH6ZRB.h"
+#elif defined(TM4C123GH6PGE)
+ #include "TM4C123GH6PGE.h"
+#elif defined(TM4C123GH6ZRB)
+ #include "TM4C123GH6ZRB.h"
+#elif defined(TM4C123GH6ZXR)
+ #include "TM4C123GH6ZXR.h"
+#else
+#error "TM4C123.h: TM4C123 Device NOT specified"
+#endif
+
+#endif /* TM4C123_H */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123GH6PGE.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123GH6PGE.h
new file mode 100644
index 000000000..80853d51a
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/TM4C123GH6PGE.h
@@ -0,0 +1,1731 @@
+
+/****************************************************************************************************//**
+ * @file TM4C123GH6PGE.h
+ *
+ * @brief CMSIS Cortex-M4 Peripheral Access Layer Header File for
+ * TM4C123GH6PGE from Texas Instruments.
+ *
+ * @version V12591
+ * @date 23. March 2015
+ *
+ * @note Generated with SVDConv V2.84c
+ * from CMSIS SVD File 'TM4C123GH6PGE.svd' Version 12591,
+ *
+ * @par
+ * Software License Agreement
+ *
+ * Texas Instruments (TI) is supplying this software for use solely and
+ * exclusively on TI's microcontroller products. The software is owned by
+ * TI and/or its suppliers, and is protected under applicable copyright
+ * laws. You may not combine this software with "viral" open-source
+ * software in order to form a larger program.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+ * 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. TI SHALL NOT, UNDER ANY
+ * CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+ * DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ *
+ *
+ *******************************************************************************************************/
+
+
+
+/** @addtogroup Texas Instruments
+ * @{
+ */
+
+/** @addtogroup TM4C123GH6PGE
+ * @{
+ */
+
+#ifndef TM4C123GH6PGE_H
+#define TM4C123GH6PGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* ------------------------- Interrupt Number Definition ------------------------ */
+
+typedef enum {
+/* ------------------- Cortex-M4 Processor Exceptions Numbers ------------------- */
+ Reset_IRQn = -15, /*!< 1 Reset Vector, invoked on Power up and warm reset */
+ NonMaskableInt_IRQn = -14, /*!< 2 Non maskable Interrupt, cannot be stopped or preempted */
+ HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */
+ MemoryManagement_IRQn = -12, /*!< 4 Memory Management, MPU mismatch, including Access Violation
+ and No Match */
+ BusFault_IRQn = -11, /*!< 5 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory
+ related Fault */
+ UsageFault_IRQn = -10, /*!< 6 Usage Fault, i.e. Undef Instruction, Illegal State Transition */
+ SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */
+ DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor */
+ PendSV_IRQn = -2, /*!< 14 Pendable request for system service */
+ SysTick_IRQn = -1, /*!< 15 System Tick Timer */
+/* ------------------ TM4C123GH6PGE Specific Interrupt Numbers ------------------ */
+ GPIOA_IRQn = 0, /*!< 0 GPIOA */
+ GPIOB_IRQn = 1, /*!< 1 GPIOB */
+ GPIOC_IRQn = 2, /*!< 2 GPIOC */
+ GPIOD_IRQn = 3, /*!< 3 GPIOD */
+ GPIOE_IRQn = 4, /*!< 4 GPIOE */
+ UART0_IRQn = 5, /*!< 5 UART0 */
+ UART1_IRQn = 6, /*!< 6 UART1 */
+ SSI0_IRQn = 7, /*!< 7 SSI0 */
+ I2C0_IRQn = 8, /*!< 8 I2C0 */
+ PWM0_FAULT_IRQn = 9, /*!< 9 PWM0_FAULT */
+ PWM0_0_IRQn = 10, /*!< 10 PWM0_0 */
+ PWM0_1_IRQn = 11, /*!< 11 PWM0_1 */
+ PWM0_2_IRQn = 12, /*!< 12 PWM0_2 */
+ QEI0_IRQn = 13, /*!< 13 QEI0 */
+ ADC0SS0_IRQn = 14, /*!< 14 ADC0SS0 */
+ ADC0SS1_IRQn = 15, /*!< 15 ADC0SS1 */
+ ADC0SS2_IRQn = 16, /*!< 16 ADC0SS2 */
+ ADC0SS3_IRQn = 17, /*!< 17 ADC0SS3 */
+ WATCHDOG0_IRQn = 18, /*!< 18 WATCHDOG0 */
+ TIMER0A_IRQn = 19, /*!< 19 TIMER0A */
+ TIMER0B_IRQn = 20, /*!< 20 TIMER0B */
+ TIMER1A_IRQn = 21, /*!< 21 TIMER1A */
+ TIMER1B_IRQn = 22, /*!< 22 TIMER1B */
+ TIMER2A_IRQn = 23, /*!< 23 TIMER2A */
+ TIMER2B_IRQn = 24, /*!< 24 TIMER2B */
+ COMP0_IRQn = 25, /*!< 25 COMP0 */
+ COMP1_IRQn = 26, /*!< 26 COMP1 */
+ COMP2_IRQn = 27, /*!< 27 COMP2 */
+ SYSCTL_IRQn = 28, /*!< 28 SYSCTL */
+ FLASH_CTRL_IRQn = 29, /*!< 29 FLASH_CTRL */
+ GPIOF_IRQn = 30, /*!< 30 GPIOF */
+ GPIOG_IRQn = 31, /*!< 31 GPIOG */
+ GPIOH_IRQn = 32, /*!< 32 GPIOH */
+ UART2_IRQn = 33, /*!< 33 UART2 */
+ SSI1_IRQn = 34, /*!< 34 SSI1 */
+ TIMER3A_IRQn = 35, /*!< 35 TIMER3A */
+ TIMER3B_IRQn = 36, /*!< 36 TIMER3B */
+ I2C1_IRQn = 37, /*!< 37 I2C1 */
+ QEI1_IRQn = 38, /*!< 38 QEI1 */
+ CAN0_IRQn = 39, /*!< 39 CAN0 */
+ CAN1_IRQn = 40, /*!< 40 CAN1 */
+ HIB_IRQn = 43, /*!< 43 HIB */
+ USB0_IRQn = 44, /*!< 44 USB0 */
+ PWM0_3_IRQn = 45, /*!< 45 PWM0_3 */
+ UDMA_IRQn = 46, /*!< 46 UDMA */
+ UDMAERR_IRQn = 47, /*!< 47 UDMAERR */
+ ADC1SS0_IRQn = 48, /*!< 48 ADC1SS0 */
+ ADC1SS1_IRQn = 49, /*!< 49 ADC1SS1 */
+ ADC1SS2_IRQn = 50, /*!< 50 ADC1SS2 */
+ ADC1SS3_IRQn = 51, /*!< 51 ADC1SS3 */
+ GPIOJ_IRQn = 54, /*!< 54 GPIOJ */
+ GPIOK_IRQn = 55, /*!< 55 GPIOK */
+ GPIOL_IRQn = 56, /*!< 56 GPIOL */
+ SSI2_IRQn = 57, /*!< 57 SSI2 */
+ SSI3_IRQn = 58, /*!< 58 SSI3 */
+ UART3_IRQn = 59, /*!< 59 UART3 */
+ UART4_IRQn = 60, /*!< 60 UART4 */
+ UART5_IRQn = 61, /*!< 61 UART5 */
+ UART6_IRQn = 62, /*!< 62 UART6 */
+ UART7_IRQn = 63, /*!< 63 UART7 */
+ I2C2_IRQn = 68, /*!< 68 I2C2 */
+ I2C3_IRQn = 69, /*!< 69 I2C3 */
+ TIMER4A_IRQn = 70, /*!< 70 TIMER4A */
+ TIMER4B_IRQn = 71, /*!< 71 TIMER4B */
+ TIMER5A_IRQn = 92, /*!< 92 TIMER5A */
+ TIMER5B_IRQn = 93, /*!< 93 TIMER5B */
+ WTIMER0A_IRQn = 94, /*!< 94 WTIMER0A */
+ WTIMER0B_IRQn = 95, /*!< 95 WTIMER0B */
+ WTIMER1A_IRQn = 96, /*!< 96 WTIMER1A */
+ WTIMER1B_IRQn = 97, /*!< 97 WTIMER1B */
+ WTIMER2A_IRQn = 98, /*!< 98 WTIMER2A */
+ WTIMER2B_IRQn = 99, /*!< 99 WTIMER2B */
+ WTIMER3A_IRQn = 100, /*!< 100 WTIMER3A */
+ WTIMER3B_IRQn = 101, /*!< 101 WTIMER3B */
+ WTIMER4A_IRQn = 102, /*!< 102 WTIMER4A */
+ WTIMER4B_IRQn = 103, /*!< 103 WTIMER4B */
+ WTIMER5A_IRQn = 104, /*!< 104 WTIMER5A */
+ WTIMER5B_IRQn = 105, /*!< 105 WTIMER5B */
+ SYSEXC_IRQn = 106, /*!< 106 SYSEXC */
+ I2C4_IRQn = 109, /*!< 109 I2C4 */
+ I2C5_IRQn = 110, /*!< 110 I2C5 */
+ GPIOM_IRQn = 111, /*!< 111 GPIOM */
+ GPION_IRQn = 112, /*!< 112 GPION */
+ GPIOP0_IRQn = 116, /*!< 116 GPIOP0 */
+ GPIOP1_IRQn = 117, /*!< 117 GPIOP1 */
+ GPIOP2_IRQn = 118, /*!< 118 GPIOP2 */
+ GPIOP3_IRQn = 119, /*!< 119 GPIOP3 */
+ GPIOP4_IRQn = 120, /*!< 120 GPIOP4 */
+ GPIOP5_IRQn = 121, /*!< 121 GPIOP5 */
+ GPIOP6_IRQn = 122, /*!< 122 GPIOP6 */
+ GPIOP7_IRQn = 123, /*!< 123 GPIOP7 */
+ PWM1_0_IRQn = 134, /*!< 134 PWM1_0 */
+ PWM1_1_IRQn = 135, /*!< 135 PWM1_1 */
+ PWM1_2_IRQn = 136, /*!< 136 PWM1_2 */
+ PWM1_3_IRQn = 137, /*!< 137 PWM1_3 */
+ PWM1_FAULT_IRQn = 138 /*!< 138 PWM1_FAULT */
+} IRQn_Type;
+
+
+/** @addtogroup Configuration_of_CMSIS
+ * @{
+ */
+
+
+/* ================================================================================ */
+/* ================ Processor and Core Peripheral Section ================ */
+/* ================================================================================ */
+
+/* ----------------Configuration of the Cortex-M4 Processor and Core Peripherals---------------- */
+#define __CM4_REV 0x0102 /*!< Cortex-M4 Core Revision */
+#define __MPU_PRESENT 1 /*!< MPU present or not */
+#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */
+#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
+#define __FPU_PRESENT 1 /*!< FPU present or not */
+/** @} */ /* End of group Configuration_of_CMSIS */
+
+#include "core_cm4.h" /*!< Cortex-M4 processor and core peripherals */
+#include "system_TM4C123.h" /*!< TM4C123GH6PGE System */
+
+
+/* ================================================================================ */
+/* ================ Device Specific Peripheral Section ================ */
+/* ================================================================================ */
+
+
+/** @addtogroup Device_Peripheral_Registers
+ * @{
+ */
+
+
+/* ------------------- Start of section using anonymous unions ------------------ */
+#if defined(__CC_ARM)
+ #pragma push
+ #pragma anon_unions
+#elif defined(__ICCARM__)
+ #pragma language=extended
+#elif defined(__GNUC__)
+ /* anonymous unions are enabled by default */
+#elif defined(__TMS470__)
+/* anonymous unions are enabled by default */
+#elif defined(__TASKING__)
+ #pragma warning 586
+#else
+ #warning Not supported compiler type
+#endif
+
+
+
+/* ================================================================================ */
+/* ================ WATCHDOG0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for WATCHDOG0 peripheral (WATCHDOG0)
+ */
+
+typedef struct { /*!< WATCHDOG0 Structure */
+ __IO uint32_t LOAD; /*!< Watchdog Load */
+ __IO uint32_t VALUE; /*!< Watchdog Value */
+ __IO uint32_t CTL; /*!< Watchdog Control */
+ __O uint32_t ICR; /*!< Watchdog Interrupt Clear */
+ __IO uint32_t RIS; /*!< Watchdog Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< Watchdog Masked Interrupt Status */
+ __I uint32_t RESERVED[256];
+ __IO uint32_t TEST; /*!< Watchdog Test */
+ __I uint32_t RESERVED1[505];
+ __IO uint32_t LOCK; /*!< Watchdog Lock */
+} WATCHDOG0_Type;
+
+
+/* ================================================================================ */
+/* ================ GPIOA ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for GPIOA peripheral (GPIOA)
+ */
+
+typedef struct { /*!< GPIOA Structure */
+ __I uint32_t RESERVED[255];
+ __IO uint32_t DATA; /*!< GPIO Data */
+ __IO uint32_t DIR; /*!< GPIO Direction */
+ __IO uint32_t IS; /*!< GPIO Interrupt Sense */
+ __IO uint32_t IBE; /*!< GPIO Interrupt Both Edges */
+ __IO uint32_t IEV; /*!< GPIO Interrupt Event */
+ __IO uint32_t IM; /*!< GPIO Interrupt Mask */
+ __IO uint32_t RIS; /*!< GPIO Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< GPIO Masked Interrupt Status */
+ __O uint32_t ICR; /*!< GPIO Interrupt Clear */
+ __IO uint32_t AFSEL; /*!< GPIO Alternate Function Select */
+ __I uint32_t RESERVED1[55];
+ __IO uint32_t DR2R; /*!< GPIO 2-mA Drive Select */
+ __IO uint32_t DR4R; /*!< GPIO 4-mA Drive Select */
+ __IO uint32_t DR8R; /*!< GPIO 8-mA Drive Select */
+ __IO uint32_t ODR; /*!< GPIO Open Drain Select */
+ __IO uint32_t PUR; /*!< GPIO Pull-Up Select */
+ __IO uint32_t PDR; /*!< GPIO Pull-Down Select */
+ __IO uint32_t SLR; /*!< GPIO Slew Rate Control Select */
+ __IO uint32_t DEN; /*!< GPIO Digital Enable */
+ __IO uint32_t LOCK; /*!< GPIO Lock */
+ __IO uint32_t CR; /*!< GPIO Commit */
+ __IO uint32_t AMSEL; /*!< GPIO Analog Mode Select */
+ __IO uint32_t PCTL; /*!< GPIO Port Control */
+ __IO uint32_t ADCCTL; /*!< GPIO ADC Control */
+ __IO uint32_t DMACTL; /*!< GPIO DMA Control */
+ __IO uint32_t SI; /*!< GPIO Select Interrupt */
+} GPIOA_Type;
+
+
+/* ================================================================================ */
+/* ================ SSI0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for SSI0 peripheral (SSI0)
+ */
+
+typedef struct { /*!< SSI0 Structure */
+ __IO uint32_t CR0; /*!< SSI Control 0 */
+ __IO uint32_t CR1; /*!< SSI Control 1 */
+ __IO uint32_t DR; /*!< SSI Data */
+ __IO uint32_t SR; /*!< SSI Status */
+ __IO uint32_t CPSR; /*!< SSI Clock Prescale */
+ __IO uint32_t IM; /*!< SSI Interrupt Mask */
+ __IO uint32_t RIS; /*!< SSI Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< SSI Masked Interrupt Status */
+ __O uint32_t ICR; /*!< SSI Interrupt Clear */
+ __IO uint32_t DMACTL; /*!< SSI DMA Control */
+ __I uint32_t RESERVED[1000];
+ __IO uint32_t CC; /*!< SSI Clock Configuration */
+} SSI0_Type;
+
+
+/* ================================================================================ */
+/* ================ UART0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for UART0 peripheral (UART0)
+ */
+
+typedef struct { /*!< UART0 Structure */
+ __IO uint32_t DR; /*!< UART Data */
+
+ union {
+ __IO uint32_t ECR_UART_ALT; /*!< UART Receive Status/Error Clear */
+ __IO uint32_t RSR; /*!< UART Receive Status/Error Clear */
+ };
+ __I uint32_t RESERVED[4];
+ __IO uint32_t FR; /*!< UART Flag */
+ __I uint32_t RESERVED1;
+ __IO uint32_t ILPR; /*!< UART IrDA Low-Power Register */
+ __IO uint32_t IBRD; /*!< UART Integer Baud-Rate Divisor */
+ __IO uint32_t FBRD; /*!< UART Fractional Baud-Rate Divisor */
+ __IO uint32_t LCRH; /*!< UART Line Control */
+ __IO uint32_t CTL; /*!< UART Control */
+ __IO uint32_t IFLS; /*!< UART Interrupt FIFO Level Select */
+ __IO uint32_t IM; /*!< UART Interrupt Mask */
+ __IO uint32_t RIS; /*!< UART Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< UART Masked Interrupt Status */
+ __O uint32_t ICR; /*!< UART Interrupt Clear */
+ __IO uint32_t DMACTL; /*!< UART DMA Control */
+ __I uint32_t RESERVED2[22];
+ __IO uint32_t _9BITADDR; /*!< UART 9-Bit Self Address */
+ __IO uint32_t _9BITAMASK; /*!< UART 9-Bit Self Address Mask */
+ __I uint32_t RESERVED3[965];
+ __IO uint32_t PP; /*!< UART Peripheral Properties */
+ __I uint32_t RESERVED4;
+ __IO uint32_t CC; /*!< UART Clock Configuration */
+} UART0_Type;
+
+
+/* ================================================================================ */
+/* ================ I2C0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for I2C0 peripheral (I2C0)
+ */
+
+typedef struct { /*!< I2C0 Structure */
+ __IO uint32_t MSA; /*!< I2C Master Slave Address */
+
+ union {
+ __IO uint32_t MCS_I2C0_ALT; /*!< I2C Master Control/Status */
+ __IO uint32_t MCS; /*!< I2C Master Control/Status */
+ };
+ __IO uint32_t MDR; /*!< I2C Master Data */
+ __IO uint32_t MTPR; /*!< I2C Master Timer Period */
+ __IO uint32_t MIMR; /*!< I2C Master Interrupt Mask */
+ __IO uint32_t MRIS; /*!< I2C Master Raw Interrupt Status */
+ __IO uint32_t MMIS; /*!< I2C Master Masked Interrupt Status */
+ __O uint32_t MICR; /*!< I2C Master Interrupt Clear */
+ __IO uint32_t MCR; /*!< I2C Master Configuration */
+ __IO uint32_t MCLKOCNT; /*!< I2C Master Clock Low Timeout Count */
+ __I uint32_t RESERVED;
+ __IO uint32_t MBMON; /*!< I2C Master Bus Monitor */
+ __I uint32_t RESERVED1[2];
+ __IO uint32_t MCR2; /*!< I2C Master Configuration 2 */
+ __I uint32_t RESERVED2[497];
+ __IO uint32_t SOAR; /*!< I2C Slave Own Address */
+
+ union {
+ __IO uint32_t SCSR_I2C0_ALT; /*!< I2C Slave Control/Status */
+ __IO uint32_t SCSR; /*!< I2C Slave Control/Status */
+ };
+ __IO uint32_t SDR; /*!< I2C Slave Data */
+ __IO uint32_t SIMR; /*!< I2C Slave Interrupt Mask */
+ __IO uint32_t SRIS; /*!< I2C Slave Raw Interrupt Status */
+ __IO uint32_t SMIS; /*!< I2C Slave Masked Interrupt Status */
+ __O uint32_t SICR; /*!< I2C Slave Interrupt Clear */
+ __IO uint32_t SOAR2; /*!< I2C Slave Own Address 2 */
+ __IO uint32_t SACKCTL; /*!< I2C Slave ACK Control */
+ __I uint32_t RESERVED3[487];
+ __IO uint32_t PP; /*!< I2C Peripheral Properties */
+ __IO uint32_t PC; /*!< I2C Peripheral Configuration */
+} I2C0_Type;
+
+
+/* ================================================================================ */
+/* ================ PWM0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for PWM0 peripheral (PWM0)
+ */
+
+typedef struct { /*!< PWM0 Structure */
+ __IO uint32_t CTL; /*!< PWM Master Control */
+ __IO uint32_t SYNC; /*!< PWM Time Base Sync */
+ __IO uint32_t ENABLE; /*!< PWM Output Enable */
+ __IO uint32_t INVERT; /*!< PWM Output Inversion */
+ __IO uint32_t FAULT; /*!< PWM Output Fault */
+ __IO uint32_t INTEN; /*!< PWM Interrupt Enable */
+ __IO uint32_t RIS; /*!< PWM Raw Interrupt Status */
+ __IO uint32_t ISC; /*!< PWM Interrupt Status and Clear */
+ __IO uint32_t STATUS; /*!< PWM Status */
+ __IO uint32_t FAULTVAL; /*!< PWM Fault Condition Value */
+ __IO uint32_t ENUPD; /*!< PWM Enable Update */
+ __I uint32_t RESERVED[5];
+ __IO uint32_t _0_CTL; /*!< PWM0 Control */
+ __IO uint32_t _0_INTEN; /*!< PWM0 Interrupt and Trigger Enable */
+ __IO uint32_t _0_RIS; /*!< PWM0 Raw Interrupt Status */
+ __IO uint32_t _0_ISC; /*!< PWM0 Interrupt Status and Clear */
+ __IO uint32_t _0_LOAD; /*!< PWM0 Load */
+ __IO uint32_t _0_COUNT; /*!< PWM0 Counter */
+ __IO uint32_t _0_CMPA; /*!< PWM0 Compare A */
+ __IO uint32_t _0_CMPB; /*!< PWM0 Compare B */
+ __IO uint32_t _0_GENA; /*!< PWM0 Generator A Control */
+ __IO uint32_t _0_GENB; /*!< PWM0 Generator B Control */
+ __IO uint32_t _0_DBCTL; /*!< PWM0 Dead-Band Control */
+ __IO uint32_t _0_DBRISE; /*!< PWM0 Dead-Band Rising-Edge Delay */
+ __IO uint32_t _0_DBFALL; /*!< PWM0 Dead-Band Falling-Edge-Delay */
+ __IO uint32_t _0_FLTSRC0; /*!< PWM0 Fault Source 0 */
+ __IO uint32_t _0_FLTSRC1; /*!< PWM0 Fault Source 1 */
+ __IO uint32_t _0_MINFLTPER; /*!< PWM0 Minimum Fault Period */
+ __IO uint32_t _1_CTL; /*!< PWM1 Control */
+ __IO uint32_t _1_INTEN; /*!< PWM1 Interrupt and Trigger Enable */
+ __IO uint32_t _1_RIS; /*!< PWM1 Raw Interrupt Status */
+ __IO uint32_t _1_ISC; /*!< PWM1 Interrupt Status and Clear */
+ __IO uint32_t _1_LOAD; /*!< PWM1 Load */
+ __IO uint32_t _1_COUNT; /*!< PWM1 Counter */
+ __IO uint32_t _1_CMPA; /*!< PWM1 Compare A */
+ __IO uint32_t _1_CMPB; /*!< PWM1 Compare B */
+ __IO uint32_t _1_GENA; /*!< PWM1 Generator A Control */
+ __IO uint32_t _1_GENB; /*!< PWM1 Generator B Control */
+ __IO uint32_t _1_DBCTL; /*!< PWM1 Dead-Band Control */
+ __IO uint32_t _1_DBRISE; /*!< PWM1 Dead-Band Rising-Edge Delay */
+ __IO uint32_t _1_DBFALL; /*!< PWM1 Dead-Band Falling-Edge-Delay */
+ __IO uint32_t _1_FLTSRC0; /*!< PWM1 Fault Source 0 */
+ __IO uint32_t _1_FLTSRC1; /*!< PWM1 Fault Source 1 */
+ __IO uint32_t _1_MINFLTPER; /*!< PWM1 Minimum Fault Period */
+ __IO uint32_t _2_CTL; /*!< PWM2 Control */
+ __IO uint32_t _2_INTEN; /*!< PWM2 Interrupt and Trigger Enable */
+ __IO uint32_t _2_RIS; /*!< PWM2 Raw Interrupt Status */
+ __IO uint32_t _2_ISC; /*!< PWM2 Interrupt Status and Clear */
+ __IO uint32_t _2_LOAD; /*!< PWM2 Load */
+ __IO uint32_t _2_COUNT; /*!< PWM2 Counter */
+ __IO uint32_t _2_CMPA; /*!< PWM2 Compare A */
+ __IO uint32_t _2_CMPB; /*!< PWM2 Compare B */
+ __IO uint32_t _2_GENA; /*!< PWM2 Generator A Control */
+ __IO uint32_t _2_GENB; /*!< PWM2 Generator B Control */
+ __IO uint32_t _2_DBCTL; /*!< PWM2 Dead-Band Control */
+ __IO uint32_t _2_DBRISE; /*!< PWM2 Dead-Band Rising-Edge Delay */
+ __IO uint32_t _2_DBFALL; /*!< PWM2 Dead-Band Falling-Edge-Delay */
+ __IO uint32_t _2_FLTSRC0; /*!< PWM2 Fault Source 0 */
+ __IO uint32_t _2_FLTSRC1; /*!< PWM2 Fault Source 1 */
+ __IO uint32_t _2_MINFLTPER; /*!< PWM2 Minimum Fault Period */
+ __IO uint32_t _3_CTL; /*!< PWM3 Control */
+ __IO uint32_t _3_INTEN; /*!< PWM3 Interrupt and Trigger Enable */
+ __IO uint32_t _3_RIS; /*!< PWM3 Raw Interrupt Status */
+ __IO uint32_t _3_ISC; /*!< PWM3 Interrupt Status and Clear */
+ __IO uint32_t _3_LOAD; /*!< PWM3 Load */
+ __IO uint32_t _3_COUNT; /*!< PWM3 Counter */
+ __IO uint32_t _3_CMPA; /*!< PWM3 Compare A */
+ __IO uint32_t _3_CMPB; /*!< PWM3 Compare B */
+ __IO uint32_t _3_GENA; /*!< PWM3 Generator A Control */
+ __IO uint32_t _3_GENB; /*!< PWM3 Generator B Control */
+ __IO uint32_t _3_DBCTL; /*!< PWM3 Dead-Band Control */
+ __IO uint32_t _3_DBRISE; /*!< PWM3 Dead-Band Rising-Edge Delay */
+ __IO uint32_t _3_DBFALL; /*!< PWM3 Dead-Band Falling-Edge-Delay */
+ __IO uint32_t _3_FLTSRC0; /*!< PWM3 Fault Source 0 */
+ __IO uint32_t _3_FLTSRC1; /*!< PWM3 Fault Source 1 */
+ __IO uint32_t _3_MINFLTPER; /*!< PWM3 Minimum Fault Period */
+ __I uint32_t RESERVED1[432];
+ __IO uint32_t _0_FLTSEN; /*!< PWM0 Fault Pin Logic Sense */
+ __I uint32_t _0_FLTSTAT0; /*!< PWM0 Fault Status 0 */
+ __I uint32_t _0_FLTSTAT1; /*!< PWM0 Fault Status 1 */
+ __I uint32_t RESERVED2[29];
+ __IO uint32_t _1_FLTSEN; /*!< PWM1 Fault Pin Logic Sense */
+ __I uint32_t _1_FLTSTAT0; /*!< PWM1 Fault Status 0 */
+ __I uint32_t _1_FLTSTAT1; /*!< PWM1 Fault Status 1 */
+ __I uint32_t RESERVED3[29];
+ __IO uint32_t _2_FLTSEN; /*!< PWM2 Fault Pin Logic Sense */
+ __I uint32_t _2_FLTSTAT0; /*!< PWM2 Fault Status 0 */
+ __I uint32_t _2_FLTSTAT1; /*!< PWM2 Fault Status 1 */
+ __I uint32_t RESERVED4[29];
+ __IO uint32_t _3_FLTSEN; /*!< PWM3 Fault Pin Logic Sense */
+ __I uint32_t _3_FLTSTAT0; /*!< PWM3 Fault Status 0 */
+ __I uint32_t _3_FLTSTAT1; /*!< PWM3 Fault Status 1 */
+ __I uint32_t RESERVED5[397];
+ __IO uint32_t PP; /*!< PWM Peripheral Properties */
+} PWM0_Type;
+
+
+/* ================================================================================ */
+/* ================ QEI0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for QEI0 peripheral (QEI0)
+ */
+
+typedef struct { /*!< QEI0 Structure */
+ __IO uint32_t CTL; /*!< QEI Control */
+ __IO uint32_t STAT; /*!< QEI Status */
+ __IO uint32_t POS; /*!< QEI Position */
+ __IO uint32_t MAXPOS; /*!< QEI Maximum Position */
+ __IO uint32_t LOAD; /*!< QEI Timer Load */
+ __IO uint32_t TIME; /*!< QEI Timer */
+ __IO uint32_t COUNT; /*!< QEI Velocity Counter */
+ __IO uint32_t SPEED; /*!< QEI Velocity */
+ __IO uint32_t INTEN; /*!< QEI Interrupt Enable */
+ __IO uint32_t RIS; /*!< QEI Raw Interrupt Status */
+ __IO uint32_t ISC; /*!< QEI Interrupt Status and Clear */
+} QEI0_Type;
+
+
+/* ================================================================================ */
+/* ================ TIMER0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for TIMER0 peripheral (TIMER0)
+ */
+
+typedef struct { /*!< TIMER0 Structure */
+ __IO uint32_t CFG; /*!< GPTM Configuration */
+ __IO uint32_t TAMR; /*!< GPTM Timer A Mode */
+ __IO uint32_t TBMR; /*!< GPTM Timer B Mode */
+ __IO uint32_t CTL; /*!< GPTM Control */
+ __IO uint32_t SYNC; /*!< GPTM Synchronize */
+ __I uint32_t RESERVED;
+ __IO uint32_t IMR; /*!< GPTM Interrupt Mask */
+ __IO uint32_t RIS; /*!< GPTM Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< GPTM Masked Interrupt Status */
+ __O uint32_t ICR; /*!< GPTM Interrupt Clear */
+ __IO uint32_t TAILR; /*!< GPTM Timer A Interval Load */
+ __IO uint32_t TBILR; /*!< GPTM Timer B Interval Load */
+ __IO uint32_t TAMATCHR; /*!< GPTM Timer A Match */
+ __IO uint32_t TBMATCHR; /*!< GPTM Timer B Match */
+ __IO uint32_t TAPR; /*!< GPTM Timer A Prescale */
+ __IO uint32_t TBPR; /*!< GPTM Timer B Prescale */
+ __IO uint32_t TAPMR; /*!< GPTM TimerA Prescale Match */
+ __IO uint32_t TBPMR; /*!< GPTM TimerB Prescale Match */
+ __IO uint32_t TAR; /*!< GPTM Timer A */
+ __IO uint32_t TBR; /*!< GPTM Timer B */
+ __IO uint32_t TAV; /*!< GPTM Timer A Value */
+ __IO uint32_t TBV; /*!< GPTM Timer B Value */
+ __IO uint32_t RTCPD; /*!< GPTM RTC Predivide */
+ __IO uint32_t TAPS; /*!< GPTM Timer A Prescale Snapshot */
+ __IO uint32_t TBPS; /*!< GPTM Timer B Prescale Snapshot */
+ __IO uint32_t TAPV; /*!< GPTM Timer A Prescale Value */
+ __IO uint32_t TBPV; /*!< GPTM Timer B Prescale Value */
+ __I uint32_t RESERVED1[981];
+ __IO uint32_t PP; /*!< GPTM Peripheral Properties */
+} TIMER0_Type;
+
+
+/* ================================================================================ */
+/* ================ WTIMER0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for WTIMER0 peripheral (WTIMER0)
+ */
+
+typedef struct { /*!< WTIMER0 Structure */
+ __IO uint32_t CFG; /*!< GPTM Configuration */
+ __IO uint32_t TAMR; /*!< GPTM Timer A Mode */
+ __IO uint32_t TBMR; /*!< GPTM Timer B Mode */
+ __IO uint32_t CTL; /*!< GPTM Control */
+ __IO uint32_t SYNC; /*!< GPTM Synchronize */
+ __I uint32_t RESERVED;
+ __IO uint32_t IMR; /*!< GPTM Interrupt Mask */
+ __IO uint32_t RIS; /*!< GPTM Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< GPTM Masked Interrupt Status */
+ __O uint32_t ICR; /*!< GPTM Interrupt Clear */
+ __IO uint32_t TAILR; /*!< GPTM Timer A Interval Load */
+ __IO uint32_t TBILR; /*!< GPTM Timer B Interval Load */
+ __IO uint32_t TAMATCHR; /*!< GPTM Timer A Match */
+ __IO uint32_t TBMATCHR; /*!< GPTM Timer B Match */
+ __IO uint32_t TAPR; /*!< GPTM Timer A Prescale */
+ __IO uint32_t TBPR; /*!< GPTM Timer B Prescale */
+ __IO uint32_t TAPMR; /*!< GPTM TimerA Prescale Match */
+ __IO uint32_t TBPMR; /*!< GPTM TimerB Prescale Match */
+ __IO uint32_t TAR; /*!< GPTM Timer A */
+ __IO uint32_t TBR; /*!< GPTM Timer B */
+ __IO uint32_t TAV; /*!< GPTM Timer A Value */
+ __IO uint32_t TBV; /*!< GPTM Timer B Value */
+ __IO uint32_t RTCPD; /*!< GPTM RTC Predivide */
+ __IO uint32_t TAPS; /*!< GPTM Timer A Prescale Snapshot */
+ __IO uint32_t TBPS; /*!< GPTM Timer B Prescale Snapshot */
+ __IO uint32_t TAPV; /*!< GPTM Timer A Prescale Value */
+ __IO uint32_t TBPV; /*!< GPTM Timer B Prescale Value */
+ __I uint32_t RESERVED1[981];
+ __IO uint32_t PP; /*!< GPTM Peripheral Properties */
+} WTIMER0_Type;
+
+
+/* ================================================================================ */
+/* ================ ADC0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for ADC0 peripheral (ADC0)
+ */
+
+typedef struct { /*!< ADC0 Structure */
+ __IO uint32_t ACTSS; /*!< ADC Active Sample Sequencer */
+ __IO uint32_t RIS; /*!< ADC Raw Interrupt Status */
+ __IO uint32_t IM; /*!< ADC Interrupt Mask */
+ __IO uint32_t ISC; /*!< ADC Interrupt Status and Clear */
+ __IO uint32_t OSTAT; /*!< ADC Overflow Status */
+ __IO uint32_t EMUX; /*!< ADC Event Multiplexer Select */
+ __IO uint32_t USTAT; /*!< ADC Underflow Status */
+ __IO uint32_t TSSEL; /*!< ADC Trigger Source Select */
+ __IO uint32_t SSPRI; /*!< ADC Sample Sequencer Priority */
+ __IO uint32_t SPC; /*!< ADC Sample Phase Control */
+ __IO uint32_t PSSI; /*!< ADC Processor Sample Sequence Initiate */
+ __I uint32_t RESERVED;
+ __IO uint32_t SAC; /*!< ADC Sample Averaging Control */
+ __IO uint32_t DCISC; /*!< ADC Digital Comparator Interrupt Status and Clear */
+ __IO uint32_t CTL; /*!< ADC Control */
+ __I uint32_t RESERVED1;
+ __IO uint32_t SSMUX0; /*!< ADC Sample Sequence Input Multiplexer Select 0 */
+ __IO uint32_t SSCTL0; /*!< ADC Sample Sequence Control 0 */
+ __IO uint32_t SSFIFO0; /*!< ADC Sample Sequence Result FIFO 0 */
+ __IO uint32_t SSFSTAT0; /*!< ADC Sample Sequence FIFO 0 Status */
+ __IO uint32_t SSOP0; /*!< ADC Sample Sequence 0 Operation */
+ __IO uint32_t SSDC0; /*!< ADC Sample Sequence 0 Digital Comparator Select */
+ __IO uint32_t SSEMUX0; /*!< ADC Sample Sequence Extended Input Multiplexer Select 0 */
+ __I uint32_t RESERVED2;
+ __IO uint32_t SSMUX1; /*!< ADC Sample Sequence Input Multiplexer Select 1 */
+ __IO uint32_t SSCTL1; /*!< ADC Sample Sequence Control 1 */
+ __IO uint32_t SSFIFO1; /*!< ADC Sample Sequence Result FIFO 1 */
+ __IO uint32_t SSFSTAT1; /*!< ADC Sample Sequence FIFO 1 Status */
+ __IO uint32_t SSOP1; /*!< ADC Sample Sequence 1 Operation */
+ __IO uint32_t SSDC1; /*!< ADC Sample Sequence 1 Digital Comparator Select */
+ __IO uint32_t SSEMUX1; /*!< ADC Sample Sequence Extended Input Multiplexer Select 1 */
+ __I uint32_t RESERVED3;
+ __IO uint32_t SSMUX2; /*!< ADC Sample Sequence Input Multiplexer Select 2 */
+ __IO uint32_t SSCTL2; /*!< ADC Sample Sequence Control 2 */
+ __IO uint32_t SSFIFO2; /*!< ADC Sample Sequence Result FIFO 2 */
+ __IO uint32_t SSFSTAT2; /*!< ADC Sample Sequence FIFO 2 Status */
+ __IO uint32_t SSOP2; /*!< ADC Sample Sequence 2 Operation */
+ __IO uint32_t SSDC2; /*!< ADC Sample Sequence 2 Digital Comparator Select */
+ __IO uint32_t SSEMUX2; /*!< ADC Sample Sequence Extended Input Multiplexer Select 2 */
+ __I uint32_t RESERVED4;
+ __IO uint32_t SSMUX3; /*!< ADC Sample Sequence Input Multiplexer Select 3 */
+ __IO uint32_t SSCTL3; /*!< ADC Sample Sequence Control 3 */
+ __IO uint32_t SSFIFO3; /*!< ADC Sample Sequence Result FIFO 3 */
+ __IO uint32_t SSFSTAT3; /*!< ADC Sample Sequence FIFO 3 Status */
+ __IO uint32_t SSOP3; /*!< ADC Sample Sequence 3 Operation */
+ __IO uint32_t SSDC3; /*!< ADC Sample Sequence 3 Digital Comparator Select */
+ __IO uint32_t SSEMUX3; /*!< ADC Sample Sequence Extended Input Multiplexer Select 3 */
+ __I uint32_t RESERVED5[785];
+ __O uint32_t DCRIC; /*!< ADC Digital Comparator Reset Initial Conditions */
+ __I uint32_t RESERVED6[63];
+ __IO uint32_t DCCTL0; /*!< ADC Digital Comparator Control 0 */
+ __IO uint32_t DCCTL1; /*!< ADC Digital Comparator Control 1 */
+ __IO uint32_t DCCTL2; /*!< ADC Digital Comparator Control 2 */
+ __IO uint32_t DCCTL3; /*!< ADC Digital Comparator Control 3 */
+ __IO uint32_t DCCTL4; /*!< ADC Digital Comparator Control 4 */
+ __IO uint32_t DCCTL5; /*!< ADC Digital Comparator Control 5 */
+ __IO uint32_t DCCTL6; /*!< ADC Digital Comparator Control 6 */
+ __IO uint32_t DCCTL7; /*!< ADC Digital Comparator Control 7 */
+ __I uint32_t RESERVED7[8];
+ __IO uint32_t DCCMP0; /*!< ADC Digital Comparator Range 0 */
+ __IO uint32_t DCCMP1; /*!< ADC Digital Comparator Range 1 */
+ __IO uint32_t DCCMP2; /*!< ADC Digital Comparator Range 2 */
+ __IO uint32_t DCCMP3; /*!< ADC Digital Comparator Range 3 */
+ __IO uint32_t DCCMP4; /*!< ADC Digital Comparator Range 4 */
+ __IO uint32_t DCCMP5; /*!< ADC Digital Comparator Range 5 */
+ __IO uint32_t DCCMP6; /*!< ADC Digital Comparator Range 6 */
+ __IO uint32_t DCCMP7; /*!< ADC Digital Comparator Range 7 */
+ __I uint32_t RESERVED8[88];
+ __IO uint32_t PP; /*!< ADC Peripheral Properties */
+ __IO uint32_t PC; /*!< ADC Peripheral Configuration */
+ __IO uint32_t CC; /*!< ADC Clock Configuration */
+} ADC0_Type;
+
+
+/* ================================================================================ */
+/* ================ COMP ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for COMP peripheral (COMP)
+ */
+
+typedef struct { /*!< COMP Structure */
+ __IO uint32_t ACMIS; /*!< Analog Comparator Masked Interrupt Status */
+ __IO uint32_t ACRIS; /*!< Analog Comparator Raw Interrupt Status */
+ __IO uint32_t ACINTEN; /*!< Analog Comparator Interrupt Enable */
+ __I uint32_t RESERVED;
+ __IO uint32_t ACREFCTL; /*!< Analog Comparator Reference Voltage Control */
+ __I uint32_t RESERVED1[3];
+ __IO uint32_t ACSTAT0; /*!< Analog Comparator Status 0 */
+ __IO uint32_t ACCTL0; /*!< Analog Comparator Control 0 */
+ __I uint32_t RESERVED2[6];
+ __IO uint32_t ACSTAT1; /*!< Analog Comparator Status 1 */
+ __IO uint32_t ACCTL1; /*!< Analog Comparator Control 1 */
+ __I uint32_t RESERVED3[6];
+ __IO uint32_t ACSTAT2; /*!< Analog Comparator Status 2 */
+ __IO uint32_t ACCTL2; /*!< Analog Comparator Control 2 */
+ __I uint32_t RESERVED4[982];
+ __IO uint32_t PP; /*!< Analog Comparator Peripheral Properties */
+} COMP_Type;
+
+
+/* ================================================================================ */
+/* ================ CAN0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for CAN0 peripheral (CAN0)
+ */
+
+typedef struct { /*!< CAN0 Structure */
+ __IO uint32_t CTL; /*!< CAN Control */
+ __IO uint32_t STS; /*!< CAN Status */
+ __IO uint32_t ERR; /*!< CAN Error Counter */
+ __IO uint32_t BIT; /*!< CAN Bit Timing */
+ __IO uint32_t INT; /*!< CAN Interrupt */
+ __IO uint32_t TST; /*!< CAN Test */
+ __IO uint32_t BRPE; /*!< CAN Baud Rate Prescaler Extension */
+ __I uint32_t RESERVED;
+ __IO uint32_t IF1CRQ; /*!< CAN IF1 Command Request */
+
+ union {
+ __IO uint32_t IF1CMSK_CAN0_ALT; /*!< CAN IF1 Command Mask */
+ __IO uint32_t IF1CMSK; /*!< CAN IF1 Command Mask */
+ };
+ __IO uint32_t IF1MSK1; /*!< CAN IF1 Mask 1 */
+ __IO uint32_t IF1MSK2; /*!< CAN IF1 Mask 2 */
+ __IO uint32_t IF1ARB1; /*!< CAN IF1 Arbitration 1 */
+ __IO uint32_t IF1ARB2; /*!< CAN IF1 Arbitration 2 */
+ __IO uint32_t IF1MCTL; /*!< CAN IF1 Message Control */
+ __IO uint32_t IF1DA1; /*!< CAN IF1 Data A1 */
+ __IO uint32_t IF1DA2; /*!< CAN IF1 Data A2 */
+ __IO uint32_t IF1DB1; /*!< CAN IF1 Data B1 */
+ __IO uint32_t IF1DB2; /*!< CAN IF1 Data B2 */
+ __I uint32_t RESERVED1[13];
+ __IO uint32_t IF2CRQ; /*!< CAN IF2 Command Request */
+
+ union {
+ __IO uint32_t IF2CMSK_CAN0_ALT; /*!< CAN IF2 Command Mask */
+ __IO uint32_t IF2CMSK; /*!< CAN IF2 Command Mask */
+ };
+ __IO uint32_t IF2MSK1; /*!< CAN IF2 Mask 1 */
+ __IO uint32_t IF2MSK2; /*!< CAN IF2 Mask 2 */
+ __IO uint32_t IF2ARB1; /*!< CAN IF2 Arbitration 1 */
+ __IO uint32_t IF2ARB2; /*!< CAN IF2 Arbitration 2 */
+ __IO uint32_t IF2MCTL; /*!< CAN IF2 Message Control */
+ __IO uint32_t IF2DA1; /*!< CAN IF2 Data A1 */
+ __IO uint32_t IF2DA2; /*!< CAN IF2 Data A2 */
+ __IO uint32_t IF2DB1; /*!< CAN IF2 Data B1 */
+ __IO uint32_t IF2DB2; /*!< CAN IF2 Data B2 */
+ __I uint32_t RESERVED2[21];
+ __IO uint32_t TXRQ1; /*!< CAN Transmission Request 1 */
+ __IO uint32_t TXRQ2; /*!< CAN Transmission Request 2 */
+ __I uint32_t RESERVED3[6];
+ __IO uint32_t NWDA1; /*!< CAN New Data 1 */
+ __IO uint32_t NWDA2; /*!< CAN New Data 2 */
+ __I uint32_t RESERVED4[6];
+ __IO uint32_t MSG1INT; /*!< CAN Message 1 Interrupt Pending */
+ __IO uint32_t MSG2INT; /*!< CAN Message 2 Interrupt Pending */
+ __I uint32_t RESERVED5[6];
+ __IO uint32_t MSG1VAL; /*!< CAN Message 1 Valid */
+ __IO uint32_t MSG2VAL; /*!< CAN Message 2 Valid */
+} CAN0_Type;
+
+
+/* ================================================================================ */
+/* ================ USB0 ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for USB0 peripheral (USB0)
+ */
+
+typedef struct { /*!< USB0 Structure */
+ __IO uint8_t FADDR; /*!< USB Device Functional Address */
+ __IO uint8_t POWER; /*!< USB Power */
+ __IO uint16_t TXIS; /*!< USB Transmit Interrupt Status */
+ __IO uint16_t RXIS; /*!< USB Receive Interrupt Status */
+ __IO uint16_t TXIE; /*!< USB Transmit Interrupt Enable */
+ __IO uint16_t RXIE; /*!< USB Receive Interrupt Enable */
+
+ union {
+ __IO uint8_t IS_USB0_ALT; /*!< USB General Interrupt Status */
+ __IO uint8_t IS; /*!< USB General Interrupt Status */
+ };
+
+ union {
+ __IO uint8_t IE_USB0_ALT; /*!< USB Interrupt Enable */
+ __IO uint8_t IE; /*!< USB Interrupt Enable */
+ };
+ __IO uint16_t FRAME; /*!< USB Frame Value */
+ __IO uint8_t EPIDX; /*!< USB Endpoint Index */
+ __IO uint8_t TEST; /*!< USB Test Mode */
+ __I uint32_t RESERVED[4];
+ __IO uint32_t FIFO0; /*!< USB FIFO Endpoint 0 */
+ __IO uint32_t FIFO1; /*!< USB FIFO Endpoint 1 */
+ __IO uint32_t FIFO2; /*!< USB FIFO Endpoint 2 */
+ __IO uint32_t FIFO3; /*!< USB FIFO Endpoint 3 */
+ __IO uint32_t FIFO4; /*!< USB FIFO Endpoint 4 */
+ __IO uint32_t FIFO5; /*!< USB FIFO Endpoint 5 */
+ __IO uint32_t FIFO6; /*!< USB FIFO Endpoint 6 */
+ __IO uint32_t FIFO7; /*!< USB FIFO Endpoint 7 */
+ __I uint32_t RESERVED1[8];
+ __IO uint8_t DEVCTL; /*!< USB Device Control */
+ __I uint8_t RESERVED2;
+ __IO uint8_t TXFIFOSZ; /*!< USB Transmit Dynamic FIFO Sizing */
+ __IO uint8_t RXFIFOSZ; /*!< USB Receive Dynamic FIFO Sizing */
+ __IO uint16_t TXFIFOADD; /*!< USB Transmit FIFO Start Address */
+ __IO uint16_t RXFIFOADD; /*!< USB Receive FIFO Start Address */
+ __I uint16_t RESERVED3[9];
+ __IO uint8_t CONTIM; /*!< USB Connect Timing */
+ __IO uint8_t VPLEN; /*!< USB OTG VBUS Pulse Timing */
+ __I uint8_t RESERVED4;
+ __IO uint8_t FSEOF; /*!< USB Full-Speed Last Transaction to End of Frame Timing */
+ __IO uint8_t LSEOF; /*!< USB Low-Speed Last Transaction to End of Frame Timing */
+ __I uint8_t RESERVED5;
+ __IO uint8_t TXFUNCADDR0; /*!< USB Transmit Functional Address Endpoint 0 */
+ __I uint8_t RESERVED6;
+ __IO uint8_t TXHUBADDR0; /*!< USB Transmit Hub Address Endpoint 0 */
+ __IO uint8_t TXHUBPORT0; /*!< USB Transmit Hub Port Endpoint 0 */
+ __I uint32_t RESERVED7;
+ __IO uint8_t TXFUNCADDR1; /*!< USB Transmit Functional Address Endpoint 1 */
+ __I uint8_t RESERVED8;
+ __IO uint8_t TXHUBADDR1; /*!< USB Transmit Hub Address Endpoint 1 */
+ __IO uint8_t TXHUBPORT1; /*!< USB Transmit Hub Port Endpoint 1 */
+ __IO uint8_t RXFUNCADDR1; /*!< USB Receive Functional Address Endpoint 1 */
+ __I uint8_t RESERVED9;
+ __IO uint8_t RXHUBADDR1; /*!< USB Receive Hub Address Endpoint 1 */
+ __IO uint8_t RXHUBPORT1; /*!< USB Receive Hub Port Endpoint 1 */
+ __IO uint8_t TXFUNCADDR2; /*!< USB Transmit Functional Address Endpoint 2 */
+ __I uint8_t RESERVED10;
+ __IO uint8_t TXHUBADDR2; /*!< USB Transmit Hub Address Endpoint 2 */
+ __IO uint8_t TXHUBPORT2; /*!< USB Transmit Hub Port Endpoint 2 */
+ __IO uint8_t RXFUNCADDR2; /*!< USB Receive Functional Address Endpoint 2 */
+ __I uint8_t RESERVED11;
+ __IO uint8_t RXHUBADDR2; /*!< USB Receive Hub Address Endpoint 2 */
+ __IO uint8_t RXHUBPORT2; /*!< USB Receive Hub Port Endpoint 2 */
+ __IO uint8_t TXFUNCADDR3; /*!< USB Transmit Functional Address Endpoint 3 */
+ __I uint8_t RESERVED12;
+ __IO uint8_t TXHUBADDR3; /*!< USB Transmit Hub Address Endpoint 3 */
+ __IO uint8_t TXHUBPORT3; /*!< USB Transmit Hub Port Endpoint 3 */
+ __IO uint8_t RXFUNCADDR3; /*!< USB Receive Functional Address Endpoint 3 */
+ __I uint8_t RESERVED13;
+ __IO uint8_t RXHUBADDR3; /*!< USB Receive Hub Address Endpoint 3 */
+ __IO uint8_t RXHUBPORT3; /*!< USB Receive Hub Port Endpoint 3 */
+ __IO uint8_t TXFUNCADDR4; /*!< USB Transmit Functional Address Endpoint 4 */
+ __I uint8_t RESERVED14;
+ __IO uint8_t TXHUBADDR4; /*!< USB Transmit Hub Address Endpoint 4 */
+ __IO uint8_t TXHUBPORT4; /*!< USB Transmit Hub Port Endpoint 4 */
+ __IO uint8_t RXFUNCADDR4; /*!< USB Receive Functional Address Endpoint 4 */
+ __I uint8_t RESERVED15;
+ __IO uint8_t RXHUBADDR4; /*!< USB Receive Hub Address Endpoint 4 */
+ __IO uint8_t RXHUBPORT4; /*!< USB Receive Hub Port Endpoint 4 */
+ __IO uint8_t TXFUNCADDR5; /*!< USB Transmit Functional Address Endpoint 5 */
+ __I uint8_t RESERVED16;
+ __IO uint8_t TXHUBADDR5; /*!< USB Transmit Hub Address Endpoint 5 */
+ __IO uint8_t TXHUBPORT5; /*!< USB Transmit Hub Port Endpoint 5 */
+ __IO uint8_t RXFUNCADDR5; /*!< USB Receive Functional Address Endpoint 5 */
+ __I uint8_t RESERVED17;
+ __IO uint8_t RXHUBADDR5; /*!< USB Receive Hub Address Endpoint 5 */
+ __IO uint8_t RXHUBPORT5; /*!< USB Receive Hub Port Endpoint 5 */
+ __IO uint8_t TXFUNCADDR6; /*!< USB Transmit Functional Address Endpoint 6 */
+ __I uint8_t RESERVED18;
+ __IO uint8_t TXHUBADDR6; /*!< USB Transmit Hub Address Endpoint 6 */
+ __IO uint8_t TXHUBPORT6; /*!< USB Transmit Hub Port Endpoint 6 */
+ __IO uint8_t RXFUNCADDR6; /*!< USB Receive Functional Address Endpoint 6 */
+ __I uint8_t RESERVED19;
+ __IO uint8_t RXHUBADDR6; /*!< USB Receive Hub Address Endpoint 6 */
+ __IO uint8_t RXHUBPORT6; /*!< USB Receive Hub Port Endpoint 6 */
+ __IO uint8_t TXFUNCADDR7; /*!< USB Transmit Functional Address Endpoint 7 */
+ __I uint8_t RESERVED20;
+ __IO uint8_t TXHUBADDR7; /*!< USB Transmit Hub Address Endpoint 7 */
+ __IO uint8_t TXHUBPORT7; /*!< USB Transmit Hub Port Endpoint 7 */
+ __IO uint8_t RXFUNCADDR7; /*!< USB Receive Functional Address Endpoint 7 */
+ __I uint8_t RESERVED21;
+ __IO uint8_t RXHUBADDR7; /*!< USB Receive Hub Address Endpoint 7 */
+ __IO uint8_t RXHUBPORT7; /*!< USB Receive Hub Port Endpoint 7 */
+ __I uint16_t RESERVED22[33];
+
+ union {
+ __O uint8_t CSRL0_USB0_ALT; /*!< USB Control and Status Endpoint 0 Low */
+ __O uint8_t CSRL0; /*!< USB Control and Status Endpoint 0 Low */
+ };
+ __O uint8_t CSRH0; /*!< USB Control and Status Endpoint 0 High */
+ __I uint32_t RESERVED23;
+ __IO uint8_t COUNT0; /*!< USB Receive Byte Count Endpoint 0 */
+ __I uint8_t RESERVED24;
+ __IO uint8_t TYPE0; /*!< USB Type Endpoint 0 */
+ __IO uint8_t NAKLMT; /*!< USB NAK Limit */
+ __I uint32_t RESERVED25;
+ __IO uint16_t TXMAXP1; /*!< USB Maximum Transmit Data Endpoint 1 */
+
+ union {
+ __IO uint8_t TXCSRL1_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 1 Low */
+ __IO uint8_t TXCSRL1; /*!< USB Transmit Control and Status Endpoint 1 Low */
+ };
+ __IO uint8_t TXCSRH1; /*!< USB Transmit Control and Status Endpoint 1 High */
+ __IO uint16_t RXMAXP1; /*!< USB Maximum Receive Data Endpoint 1 */
+
+ union {
+ __IO uint8_t RXCSRL1_USB0_ALT; /*!< USB Receive Control and Status Endpoint 1 Low */
+ __IO uint8_t RXCSRL1; /*!< USB Receive Control and Status Endpoint 1 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH1_USB0_ALT; /*!< USB Receive Control and Status Endpoint 1 High */
+ __IO uint8_t RXCSRH1; /*!< USB Receive Control and Status Endpoint 1 High */
+ };
+ __IO uint16_t RXCOUNT1; /*!< USB Receive Byte Count Endpoint 1 */
+ __IO uint8_t TXTYPE1; /*!< USB Host Transmit Configure Type Endpoint 1 */
+
+ union {
+ __IO uint8_t TXINTERVAL1_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 1 */
+ __IO uint8_t TXINTERVAL1; /*!< USB Host Transmit Interval Endpoint 1 */
+ };
+ __IO uint8_t RXTYPE1; /*!< USB Host Configure Receive Type Endpoint 1 */
+
+ union {
+ __IO uint8_t RXINTERVAL1_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 1 */
+ __IO uint8_t RXINTERVAL1; /*!< USB Host Receive Polling Interval Endpoint 1 */
+ };
+ __I uint16_t RESERVED26;
+ __IO uint16_t TXMAXP2; /*!< USB Maximum Transmit Data Endpoint 2 */
+
+ union {
+ __IO uint8_t TXCSRL2_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 2 Low */
+ __IO uint8_t TXCSRL2; /*!< USB Transmit Control and Status Endpoint 2 Low */
+ };
+ __IO uint8_t TXCSRH2; /*!< USB Transmit Control and Status Endpoint 2 High */
+ __IO uint16_t RXMAXP2; /*!< USB Maximum Receive Data Endpoint 2 */
+
+ union {
+ __IO uint8_t RXCSRL2_USB0_ALT; /*!< USB Receive Control and Status Endpoint 2 Low */
+ __IO uint8_t RXCSRL2; /*!< USB Receive Control and Status Endpoint 2 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH2_USB0_ALT; /*!< USB Receive Control and Status Endpoint 2 High */
+ __IO uint8_t RXCSRH2; /*!< USB Receive Control and Status Endpoint 2 High */
+ };
+ __IO uint16_t RXCOUNT2; /*!< USB Receive Byte Count Endpoint 2 */
+ __IO uint8_t TXTYPE2; /*!< USB Host Transmit Configure Type Endpoint 2 */
+
+ union {
+ __IO uint8_t TXINTERVAL2_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 2 */
+ __IO uint8_t TXINTERVAL2; /*!< USB Host Transmit Interval Endpoint 2 */
+ };
+ __IO uint8_t RXTYPE2; /*!< USB Host Configure Receive Type Endpoint 2 */
+
+ union {
+ __IO uint8_t RXINTERVAL2_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 2 */
+ __IO uint8_t RXINTERVAL2; /*!< USB Host Receive Polling Interval Endpoint 2 */
+ };
+ __I uint16_t RESERVED27;
+ __IO uint16_t TXMAXP3; /*!< USB Maximum Transmit Data Endpoint 3 */
+
+ union {
+ __IO uint8_t TXCSRL3_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 3 Low */
+ __IO uint8_t TXCSRL3; /*!< USB Transmit Control and Status Endpoint 3 Low */
+ };
+ __IO uint8_t TXCSRH3; /*!< USB Transmit Control and Status Endpoint 3 High */
+ __IO uint16_t RXMAXP3; /*!< USB Maximum Receive Data Endpoint 3 */
+
+ union {
+ __IO uint8_t RXCSRL3_USB0_ALT; /*!< USB Receive Control and Status Endpoint 3 Low */
+ __IO uint8_t RXCSRL3; /*!< USB Receive Control and Status Endpoint 3 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH3_USB0_ALT; /*!< USB Receive Control and Status Endpoint 3 High */
+ __IO uint8_t RXCSRH3; /*!< USB Receive Control and Status Endpoint 3 High */
+ };
+ __IO uint16_t RXCOUNT3; /*!< USB Receive Byte Count Endpoint 3 */
+ __IO uint8_t TXTYPE3; /*!< USB Host Transmit Configure Type Endpoint 3 */
+
+ union {
+ __IO uint8_t TXINTERVAL3_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 3 */
+ __IO uint8_t TXINTERVAL3; /*!< USB Host Transmit Interval Endpoint 3 */
+ };
+ __IO uint8_t RXTYPE3; /*!< USB Host Configure Receive Type Endpoint 3 */
+
+ union {
+ __IO uint8_t RXINTERVAL3_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 3 */
+ __IO uint8_t RXINTERVAL3; /*!< USB Host Receive Polling Interval Endpoint 3 */
+ };
+ __I uint16_t RESERVED28;
+ __IO uint16_t TXMAXP4; /*!< USB Maximum Transmit Data Endpoint 4 */
+
+ union {
+ __IO uint8_t TXCSRL4_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 4 Low */
+ __IO uint8_t TXCSRL4; /*!< USB Transmit Control and Status Endpoint 4 Low */
+ };
+ __IO uint8_t TXCSRH4; /*!< USB Transmit Control and Status Endpoint 4 High */
+ __IO uint16_t RXMAXP4; /*!< USB Maximum Receive Data Endpoint 4 */
+
+ union {
+ __IO uint8_t RXCSRL4_USB0_ALT; /*!< USB Receive Control and Status Endpoint 4 Low */
+ __IO uint8_t RXCSRL4; /*!< USB Receive Control and Status Endpoint 4 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH4_USB0_ALT; /*!< USB Receive Control and Status Endpoint 4 High */
+ __IO uint8_t RXCSRH4; /*!< USB Receive Control and Status Endpoint 4 High */
+ };
+ __IO uint16_t RXCOUNT4; /*!< USB Receive Byte Count Endpoint 4 */
+ __IO uint8_t TXTYPE4; /*!< USB Host Transmit Configure Type Endpoint 4 */
+
+ union {
+ __IO uint8_t TXINTERVAL4_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 4 */
+ __IO uint8_t TXINTERVAL4; /*!< USB Host Transmit Interval Endpoint 4 */
+ };
+ __IO uint8_t RXTYPE4; /*!< USB Host Configure Receive Type Endpoint 4 */
+
+ union {
+ __IO uint8_t RXINTERVAL4_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 4 */
+ __IO uint8_t RXINTERVAL4; /*!< USB Host Receive Polling Interval Endpoint 4 */
+ };
+ __I uint16_t RESERVED29;
+ __IO uint16_t TXMAXP5; /*!< USB Maximum Transmit Data Endpoint 5 */
+
+ union {
+ __IO uint8_t TXCSRL5_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 5 Low */
+ __IO uint8_t TXCSRL5; /*!< USB Transmit Control and Status Endpoint 5 Low */
+ };
+ __IO uint8_t TXCSRH5; /*!< USB Transmit Control and Status Endpoint 5 High */
+ __IO uint16_t RXMAXP5; /*!< USB Maximum Receive Data Endpoint 5 */
+
+ union {
+ __IO uint8_t RXCSRL5_USB0_ALT; /*!< USB Receive Control and Status Endpoint 5 Low */
+ __IO uint8_t RXCSRL5; /*!< USB Receive Control and Status Endpoint 5 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH5_USB0_ALT; /*!< USB Receive Control and Status Endpoint 5 High */
+ __IO uint8_t RXCSRH5; /*!< USB Receive Control and Status Endpoint 5 High */
+ };
+ __IO uint16_t RXCOUNT5; /*!< USB Receive Byte Count Endpoint 5 */
+ __IO uint8_t TXTYPE5; /*!< USB Host Transmit Configure Type Endpoint 5 */
+
+ union {
+ __IO uint8_t TXINTERVAL5_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 5 */
+ __IO uint8_t TXINTERVAL5; /*!< USB Host Transmit Interval Endpoint 5 */
+ };
+ __IO uint8_t RXTYPE5; /*!< USB Host Configure Receive Type Endpoint 5 */
+
+ union {
+ __IO uint8_t RXINTERVAL5_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 5 */
+ __IO uint8_t RXINTERVAL5; /*!< USB Host Receive Polling Interval Endpoint 5 */
+ };
+ __I uint16_t RESERVED30;
+ __IO uint16_t TXMAXP6; /*!< USB Maximum Transmit Data Endpoint 6 */
+
+ union {
+ __IO uint8_t TXCSRL6_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 6 Low */
+ __IO uint8_t TXCSRL6; /*!< USB Transmit Control and Status Endpoint 6 Low */
+ };
+ __IO uint8_t TXCSRH6; /*!< USB Transmit Control and Status Endpoint 6 High */
+ __IO uint16_t RXMAXP6; /*!< USB Maximum Receive Data Endpoint 6 */
+
+ union {
+ __IO uint8_t RXCSRL6_USB0_ALT; /*!< USB Receive Control and Status Endpoint 6 Low */
+ __IO uint8_t RXCSRL6; /*!< USB Receive Control and Status Endpoint 6 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH6_USB0_ALT; /*!< USB Receive Control and Status Endpoint 6 High */
+ __IO uint8_t RXCSRH6; /*!< USB Receive Control and Status Endpoint 6 High */
+ };
+ __IO uint16_t RXCOUNT6; /*!< USB Receive Byte Count Endpoint 6 */
+ __IO uint8_t TXTYPE6; /*!< USB Host Transmit Configure Type Endpoint 6 */
+
+ union {
+ __IO uint8_t TXINTERVAL6_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 6 */
+ __IO uint8_t TXINTERVAL6; /*!< USB Host Transmit Interval Endpoint 6 */
+ };
+ __IO uint8_t RXTYPE6; /*!< USB Host Configure Receive Type Endpoint 6 */
+
+ union {
+ __IO uint8_t RXINTERVAL6_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 6 */
+ __IO uint8_t RXINTERVAL6; /*!< USB Host Receive Polling Interval Endpoint 6 */
+ };
+ __I uint16_t RESERVED31;
+ __IO uint16_t TXMAXP7; /*!< USB Maximum Transmit Data Endpoint 7 */
+
+ union {
+ __IO uint8_t TXCSRL7_USB0_ALT; /*!< USB Transmit Control and Status Endpoint 7 Low */
+ __IO uint8_t TXCSRL7; /*!< USB Transmit Control and Status Endpoint 7 Low */
+ };
+ __IO uint8_t TXCSRH7; /*!< USB Transmit Control and Status Endpoint 7 High */
+ __IO uint16_t RXMAXP7; /*!< USB Maximum Receive Data Endpoint 7 */
+
+ union {
+ __IO uint8_t RXCSRL7_USB0_ALT; /*!< USB Receive Control and Status Endpoint 7 Low */
+ __IO uint8_t RXCSRL7; /*!< USB Receive Control and Status Endpoint 7 Low */
+ };
+
+ union {
+ __IO uint8_t RXCSRH7_USB0_ALT; /*!< USB Receive Control and Status Endpoint 7 High */
+ __IO uint8_t RXCSRH7; /*!< USB Receive Control and Status Endpoint 7 High */
+ };
+ __IO uint16_t RXCOUNT7; /*!< USB Receive Byte Count Endpoint 7 */
+ __IO uint8_t TXTYPE7; /*!< USB Host Transmit Configure Type Endpoint 7 */
+
+ union {
+ __IO uint8_t TXINTERVAL7_USB0_ALT; /*!< USB Host Transmit Interval Endpoint 7 */
+ __IO uint8_t TXINTERVAL7; /*!< USB Host Transmit Interval Endpoint 7 */
+ };
+ __IO uint8_t RXTYPE7; /*!< USB Host Configure Receive Type Endpoint 7 */
+
+ union {
+ __IO uint8_t RXINTERVAL7_USB0_ALT; /*!< USB Host Receive Polling Interval Endpoint 7 */
+ __IO uint8_t RXINTERVAL7; /*!< USB Host Receive Polling Interval Endpoint 7 */
+ };
+ __I uint16_t RESERVED32[195];
+ __IO uint16_t RQPKTCOUNT1; /*!< USB Request Packet Count in Block Transfer Endpoint 1 */
+ __I uint16_t RESERVED33;
+ __IO uint16_t RQPKTCOUNT2; /*!< USB Request Packet Count in Block Transfer Endpoint 2 */
+ __I uint16_t RESERVED34;
+ __IO uint16_t RQPKTCOUNT3; /*!< USB Request Packet Count in Block Transfer Endpoint 3 */
+ __I uint16_t RESERVED35;
+ __IO uint16_t RQPKTCOUNT4; /*!< USB Request Packet Count in Block Transfer Endpoint 4 */
+ __I uint16_t RESERVED36;
+ __IO uint16_t RQPKTCOUNT5; /*!< USB Request Packet Count in Block Transfer Endpoint 5 */
+ __I uint16_t RESERVED37;
+ __IO uint16_t RQPKTCOUNT6; /*!< USB Request Packet Count in Block Transfer Endpoint 6 */
+ __I uint16_t RESERVED38;
+ __IO uint16_t RQPKTCOUNT7; /*!< USB Request Packet Count in Block Transfer Endpoint 7 */
+ __I uint16_t RESERVED39[17];
+ __IO uint16_t RXDPKTBUFDIS; /*!< USB Receive Double Packet Buffer Disable */
+ __IO uint16_t TXDPKTBUFDIS; /*!< USB Transmit Double Packet Buffer Disable */
+ __I uint32_t RESERVED40[47];
+ __IO uint32_t EPC; /*!< USB External Power Control */
+ __IO uint32_t EPCRIS; /*!< USB External Power Control Raw Interrupt Status */
+ __IO uint32_t EPCIM; /*!< USB External Power Control Interrupt Mask */
+ __IO uint32_t EPCISC; /*!< USB External Power Control Interrupt Status and Clear */
+ __IO uint32_t DRRIS; /*!< USB Device RESUME Raw Interrupt Status */
+ __IO uint32_t DRIM; /*!< USB Device RESUME Interrupt Mask */
+ __O uint32_t DRISC; /*!< USB Device RESUME Interrupt Status and Clear */
+ __IO uint32_t GPCS; /*!< USB General-Purpose Control and Status */
+ __I uint32_t RESERVED41[4];
+ __IO uint32_t VDC; /*!< USB VBUS Droop Control */
+ __IO uint32_t VDCRIS; /*!< USB VBUS Droop Control Raw Interrupt Status */
+ __IO uint32_t VDCIM; /*!< USB VBUS Droop Control Interrupt Mask */
+ __IO uint32_t VDCISC; /*!< USB VBUS Droop Control Interrupt Status and Clear */
+ __I uint32_t RESERVED42;
+ __IO uint32_t IDVRIS; /*!< USB ID Valid Detect Raw Interrupt Status */
+ __IO uint32_t IDVIM; /*!< USB ID Valid Detect Interrupt Mask */
+ __IO uint32_t IDVISC; /*!< USB ID Valid Detect Interrupt Status and Clear */
+ __IO uint32_t DMASEL; /*!< USB DMA Select */
+ __I uint32_t RESERVED43[731];
+ __IO uint32_t PP; /*!< USB Peripheral Properties */
+} USB0_Type;
+
+
+/* ================================================================================ */
+/* ================ EEPROM ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for EEPROM peripheral (EEPROM)
+ */
+
+typedef struct { /*!< EEPROM Structure */
+ __IO uint32_t EESIZE; /*!< EEPROM Size Information */
+ __IO uint32_t EEBLOCK; /*!< EEPROM Current Block */
+ __IO uint32_t EEOFFSET; /*!< EEPROM Current Offset */
+ __I uint32_t RESERVED;
+ __IO uint32_t EERDWR; /*!< EEPROM Read-Write */
+ __IO uint32_t EERDWRINC; /*!< EEPROM Read-Write with Increment */
+ __IO uint32_t EEDONE; /*!< EEPROM Done Status */
+ __IO uint32_t EESUPP; /*!< EEPROM Support Control and Status */
+ __IO uint32_t EEUNLOCK; /*!< EEPROM Unlock */
+ __I uint32_t RESERVED1[3];
+ __IO uint32_t EEPROT; /*!< EEPROM Protection */
+ __IO uint32_t EEPASS0; /*!< EEPROM Password */
+ __IO uint32_t EEPASS1; /*!< EEPROM Password */
+ __IO uint32_t EEPASS2; /*!< EEPROM Password */
+ __IO uint32_t EEINT; /*!< EEPROM Interrupt */
+ __I uint32_t RESERVED2[3];
+ __IO uint32_t EEHIDE; /*!< EEPROM Block Hide */
+ __I uint32_t RESERVED3[11];
+ __IO uint32_t EEDBGME; /*!< EEPROM Debug Mass Erase */
+ __I uint32_t RESERVED4[975];
+ __IO uint32_t PP; /*!< EEPROM Peripheral Properties */
+} EEPROM_Type;
+
+
+/* ================================================================================ */
+/* ================ SYSEXC ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for SYSEXC peripheral (SYSEXC)
+ */
+
+typedef struct { /*!< SYSEXC Structure */
+ __IO uint32_t RIS; /*!< System Exception Raw Interrupt Status */
+ __IO uint32_t IM; /*!< System Exception Interrupt Mask */
+ __IO uint32_t MIS; /*!< System Exception Masked Interrupt Status */
+ __O uint32_t IC; /*!< System Exception Interrupt Clear */
+} SYSEXC_Type;
+
+
+/* ================================================================================ */
+/* ================ HIB ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for HIB peripheral (HIB)
+ */
+
+typedef struct { /*!< HIB Structure */
+ __IO uint32_t RTCC; /*!< Hibernation RTC Counter */
+ __IO uint32_t RTCM0; /*!< Hibernation RTC Match 0 */
+ __I uint32_t RESERVED;
+ __IO uint32_t RTCLD; /*!< Hibernation RTC Load */
+ __IO uint32_t CTL; /*!< Hibernation Control */
+ __IO uint32_t IM; /*!< Hibernation Interrupt Mask */
+ __IO uint32_t RIS; /*!< Hibernation Raw Interrupt Status */
+ __IO uint32_t MIS; /*!< Hibernation Masked Interrupt Status */
+ __IO uint32_t IC; /*!< Hibernation Interrupt Clear */
+ __IO uint32_t RTCT; /*!< Hibernation RTC Trim */
+ __IO uint32_t RTCSS; /*!< Hibernation RTC Sub Seconds */
+ __I uint32_t RESERVED1;
+ __IO uint32_t DATA; /*!< Hibernation Data */
+} HIB_Type;
+
+
+/* ================================================================================ */
+/* ================ FLASH_CTRL ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for FLASH_CTRL peripheral (FLASH_CTRL)
+ */
+
+typedef struct { /*!< FLASH_CTRL Structure */
+ __IO uint32_t FMA; /*!< Flash Memory Address */
+ __IO uint32_t FMD; /*!< Flash Memory Data */
+ __IO uint32_t FMC; /*!< Flash Memory Control */
+ __IO uint32_t FCRIS; /*!< Flash Controller Raw Interrupt Status */
+ __IO uint32_t FCIM; /*!< Flash Controller Interrupt Mask */
+ __IO uint32_t FCMISC; /*!< Flash Controller Masked Interrupt Status and Clear */
+ __I uint32_t RESERVED[2];
+ __IO uint32_t FMC2; /*!< Flash Memory Control 2 */
+ __I uint32_t RESERVED1[3];
+ __IO uint32_t FWBVAL; /*!< Flash Write Buffer Valid */
+ __I uint32_t RESERVED2[51];
+ __IO uint32_t FWBN; /*!< Flash Write Buffer n */
+ __I uint32_t RESERVED3[943];
+ __IO uint32_t FSIZE; /*!< Flash Size */
+ __IO uint32_t SSIZE; /*!< SRAM Size */
+ __I uint32_t RESERVED4;
+
+ union {
+ __IO uint32_t ROMSWMAP_FLASH_CTRL_ALT; /*!< ROM Software Map */
+ __IO uint32_t ROMSWMAP; /*!< ROM Software Map */
+ };
+ __I uint32_t RESERVED5[72];
+ __IO uint32_t RMCTL; /*!< ROM Control */
+ __I uint32_t RESERVED6[55];
+ __IO uint32_t BOOTCFG; /*!< Boot Configuration */
+ __I uint32_t RESERVED7[3];
+ __IO uint32_t USERREG0; /*!< User Register 0 */
+ __IO uint32_t USERREG1; /*!< User Register 1 */
+ __IO uint32_t USERREG2; /*!< User Register 2 */
+ __IO uint32_t USERREG3; /*!< User Register 3 */
+ __I uint32_t RESERVED8[4];
+ __IO uint32_t FMPRE0; /*!< Flash Memory Protection Read Enable 0 */
+ __IO uint32_t FMPRE1; /*!< Flash Memory Protection Read Enable 1 */
+ __IO uint32_t FMPRE2; /*!< Flash Memory Protection Read Enable 2 */
+ __IO uint32_t FMPRE3; /*!< Flash Memory Protection Read Enable 3 */
+ __I uint32_t RESERVED9[124];
+ __IO uint32_t FMPPE0; /*!< Flash Memory Protection Program Enable 0 */
+ __IO uint32_t FMPPE1; /*!< Flash Memory Protection Program Enable 1 */
+ __IO uint32_t FMPPE2; /*!< Flash Memory Protection Program Enable 2 */
+ __IO uint32_t FMPPE3; /*!< Flash Memory Protection Program Enable 3 */
+} FLASH_CTRL_Type;
+
+
+/* ================================================================================ */
+/* ================ SYSCTL ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for SYSCTL peripheral (SYSCTL)
+ */
+
+typedef struct { /*!< SYSCTL Structure */
+ __IO uint32_t DID0; /*!< Device Identification 0 */
+ __IO uint32_t DID1; /*!< Device Identification 1 */
+ __IO uint32_t DC0; /*!< Device Capabilities 0 */
+ __I uint32_t RESERVED;
+ __IO uint32_t DC1; /*!< Device Capabilities 1 */
+ __IO uint32_t DC2; /*!< Device Capabilities 2 */
+ __IO uint32_t DC3; /*!< Device Capabilities 3 */
+ __IO uint32_t DC4; /*!< Device Capabilities 4 */
+ __IO uint32_t DC5; /*!< Device Capabilities 5 */
+ __IO uint32_t DC6; /*!< Device Capabilities 6 */
+ __IO uint32_t DC7; /*!< Device Capabilities 7 */
+ __IO uint32_t DC8; /*!< Device Capabilities 8 */
+ __IO uint32_t PBORCTL; /*!< Brown-Out Reset Control */
+ __I uint32_t RESERVED1[3];
+ __IO uint32_t SRCR0; /*!< Software Reset Control 0 */
+ __IO uint32_t SRCR1; /*!< Software Reset Control 1 */
+ __IO uint32_t SRCR2; /*!< Software Reset Control 2 */
+ __I uint32_t RESERVED2;
+ __IO uint32_t RIS; /*!< Raw Interrupt Status */
+ __IO uint32_t IMC; /*!< Interrupt Mask Control */
+ __IO uint32_t MISC; /*!< Masked Interrupt Status and Clear */
+ __IO uint32_t RESC; /*!< Reset Cause */
+ __IO uint32_t RCC; /*!< Run-Mode Clock Configuration */
+ __I uint32_t RESERVED3[2];
+ __IO uint32_t GPIOHBCTL; /*!< GPIO High-Performance Bus Control */
+ __IO uint32_t RCC2; /*!< Run-Mode Clock Configuration 2 */
+ __I uint32_t RESERVED4[2];
+ __IO uint32_t MOSCCTL; /*!< Main Oscillator Control */
+ __I uint32_t RESERVED5[32];
+ __IO uint32_t RCGC0; /*!< Run Mode Clock Gating Control Register 0 */
+ __IO uint32_t RCGC1; /*!< Run Mode Clock Gating Control Register 1 */
+ __IO uint32_t RCGC2; /*!< Run Mode Clock Gating Control Register 2 */
+ __I uint32_t RESERVED6;
+ __IO uint32_t SCGC0; /*!< Sleep Mode Clock Gating Control Register 0 */
+ __IO uint32_t SCGC1; /*!< Sleep Mode Clock Gating Control Register 1 */
+ __IO uint32_t SCGC2; /*!< Sleep Mode Clock Gating Control Register 2 */
+ __I uint32_t RESERVED7;
+ __IO uint32_t DCGC0; /*!< Deep Sleep Mode Clock Gating Control Register 0 */
+ __IO uint32_t DCGC1; /*!< Deep-Sleep Mode Clock Gating Control Register 1 */
+ __IO uint32_t DCGC2; /*!< Deep Sleep Mode Clock Gating Control Register 2 */
+ __I uint32_t RESERVED8[6];
+ __IO uint32_t DSLPCLKCFG; /*!< Deep Sleep Clock Configuration */
+ __I uint32_t RESERVED9;
+ __IO uint32_t SYSPROP; /*!< System Properties */
+ __IO uint32_t PIOSCCAL; /*!< Precision Internal Oscillator Calibration */
+ __IO uint32_t PIOSCSTAT; /*!< Precision Internal Oscillator Statistics */
+ __I uint32_t RESERVED10[2];
+ __IO uint32_t PLLFREQ0; /*!< PLL Frequency 0 */
+ __IO uint32_t PLLFREQ1; /*!< PLL Frequency 1 */
+ __IO uint32_t PLLSTAT; /*!< PLL Status */
+ __I uint32_t RESERVED11[7];
+ __IO uint32_t SLPPWRCFG; /*!< Sleep Power Configuration */
+ __IO uint32_t DSLPPWRCFG; /*!< Deep-Sleep Power Configuration */
+ __IO uint32_t DC9; /*!< Device Capabilities 9 */
+ __I uint32_t RESERVED12[3];
+ __IO uint32_t NVMSTAT; /*!< Non-Volatile Memory Information */
+ __I uint32_t RESERVED13[4];
+ __IO uint32_t LDOSPCTL; /*!< LDO Sleep Power Control */
+ __I uint32_t RESERVED14;
+ __IO uint32_t LDODPCTL; /*!< LDO Deep-Sleep Power Control */
+ __I uint32_t RESERVED15[80];
+ __IO uint32_t PPWD; /*!< Watchdog Timer Peripheral Present */
+ __IO uint32_t PPTIMER; /*!< 16/32-Bit General-Purpose Timer Peripheral Present */
+ __IO uint32_t PPGPIO; /*!< General-Purpose Input/Output Peripheral Present */
+ __IO uint32_t PPDMA; /*!< Micro Direct Memory Access Peripheral Present */
+ __I uint32_t RESERVED16;
+ __IO uint32_t PPHIB; /*!< Hibernation Peripheral Present */
+ __IO uint32_t PPUART; /*!< Universal Asynchronous Receiver/Transmitter Peripheral Present */
+ __IO uint32_t PPSSI; /*!< Synchronous Serial Interface Peripheral Present */
+ __IO uint32_t PPI2C; /*!< Inter-Integrated Circuit Peripheral Present */
+ __I uint32_t RESERVED17;
+ __IO uint32_t PPUSB; /*!< Universal Serial Bus Peripheral Present */
+ __I uint32_t RESERVED18[2];
+ __IO uint32_t PPCAN; /*!< Controller Area Network Peripheral Present */
+ __IO uint32_t PPADC; /*!< Analog-to-Digital Converter Peripheral Present */
+ __IO uint32_t PPACMP; /*!< Analog Comparator Peripheral Present */
+ __IO uint32_t PPPWM; /*!< Pulse Width Modulator Peripheral Present */
+ __IO uint32_t PPQEI; /*!< Quadrature Encoder Interface Peripheral Present */
+ __I uint32_t RESERVED19[4];
+ __IO uint32_t PPEEPROM; /*!< EEPROM Peripheral Present */
+ __IO uint32_t PPWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Peripheral Present */
+ __I uint32_t RESERVED20[104];
+ __IO uint32_t SRWD; /*!< Watchdog Timer Software Reset */
+ __IO uint32_t SRTIMER; /*!< 16/32-Bit General-Purpose Timer Software Reset */
+ __IO uint32_t SRGPIO; /*!< General-Purpose Input/Output Software Reset */
+ __IO uint32_t SRDMA; /*!< Micro Direct Memory Access Software Reset */
+ __I uint32_t RESERVED21;
+ __IO uint32_t SRHIB; /*!< Hibernation Software Reset */
+ __IO uint32_t SRUART; /*!< Universal Asynchronous Receiver/Transmitter Software Reset */
+ __IO uint32_t SRSSI; /*!< Synchronous Serial Interface Software Reset */
+ __IO uint32_t SRI2C; /*!< Inter-Integrated Circuit Software Reset */
+ __I uint32_t RESERVED22;
+ __IO uint32_t SRUSB; /*!< Universal Serial Bus Software Reset */
+ __I uint32_t RESERVED23[2];
+ __IO uint32_t SRCAN; /*!< Controller Area Network Software Reset */
+ __IO uint32_t SRADC; /*!< Analog-to-Digital Converter Software Reset */
+ __IO uint32_t SRACMP; /*!< Analog Comparator Software Reset */
+ __IO uint32_t SRPWM; /*!< Pulse Width Modulator Software Reset */
+ __IO uint32_t SRQEI; /*!< Quadrature Encoder Interface Software Reset */
+ __I uint32_t RESERVED24[4];
+ __IO uint32_t SREEPROM; /*!< EEPROM Software Reset */
+ __IO uint32_t SRWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Software Reset */
+ __I uint32_t RESERVED25[40];
+ __IO uint32_t RCGCWD; /*!< Watchdog Timer Run Mode Clock Gating Control */
+ __IO uint32_t RCGCTIMER; /*!< 16/32-Bit General-Purpose Timer Run Mode Clock Gating Control */
+ __IO uint32_t RCGCGPIO; /*!< General-Purpose Input/Output Run Mode Clock Gating Control */
+ __IO uint32_t RCGCDMA; /*!< Micro Direct Memory Access Run Mode Clock Gating Control */
+ __I uint32_t RESERVED26;
+ __IO uint32_t RCGCHIB; /*!< Hibernation Run Mode Clock Gating Control */
+ __IO uint32_t RCGCUART; /*!< Universal Asynchronous Receiver/Transmitter Run Mode Clock Gating
+ Control */
+ __IO uint32_t RCGCSSI; /*!< Synchronous Serial Interface Run Mode Clock Gating Control */
+ __IO uint32_t RCGCI2C; /*!< Inter-Integrated Circuit Run Mode Clock Gating Control */
+ __I uint32_t RESERVED27;
+ __IO uint32_t RCGCUSB; /*!< Universal Serial Bus Run Mode Clock Gating Control */
+ __I uint32_t RESERVED28[2];
+ __IO uint32_t RCGCCAN; /*!< Controller Area Network Run Mode Clock Gating Control */
+ __IO uint32_t RCGCADC; /*!< Analog-to-Digital Converter Run Mode Clock Gating Control */
+ __IO uint32_t RCGCACMP; /*!< Analog Comparator Run Mode Clock Gating Control */
+ __IO uint32_t RCGCPWM; /*!< Pulse Width Modulator Run Mode Clock Gating Control */
+ __IO uint32_t RCGCQEI; /*!< Quadrature Encoder Interface Run Mode Clock Gating Control */
+ __I uint32_t RESERVED29[4];
+ __IO uint32_t RCGCEEPROM; /*!< EEPROM Run Mode Clock Gating Control */
+ __IO uint32_t RCGCWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Run Mode Clock Gating Control */
+ __I uint32_t RESERVED30[40];
+ __IO uint32_t SCGCWD; /*!< Watchdog Timer Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCTIMER; /*!< 16/32-Bit General-Purpose Timer Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCGPIO; /*!< General-Purpose Input/Output Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCDMA; /*!< Micro Direct Memory Access Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED31;
+ __IO uint32_t SCGCHIB; /*!< Hibernation Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCUART; /*!< Universal Asynchronous Receiver/Transmitter Sleep Mode Clock
+ Gating Control */
+ __IO uint32_t SCGCSSI; /*!< Synchronous Serial Interface Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCI2C; /*!< Inter-Integrated Circuit Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED32;
+ __IO uint32_t SCGCUSB; /*!< Universal Serial Bus Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED33[2];
+ __IO uint32_t SCGCCAN; /*!< Controller Area Network Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCADC; /*!< Analog-to-Digital Converter Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCACMP; /*!< Analog Comparator Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCPWM; /*!< Pulse Width Modulator Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCQEI; /*!< Quadrature Encoder Interface Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED34[4];
+ __IO uint32_t SCGCEEPROM; /*!< EEPROM Sleep Mode Clock Gating Control */
+ __IO uint32_t SCGCWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Sleep Mode Clock Gating
+ Control */
+ __I uint32_t RESERVED35[40];
+ __IO uint32_t DCGCWD; /*!< Watchdog Timer Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCTIMER; /*!< 16/32-Bit General-Purpose Timer Deep-Sleep Mode Clock Gating
+ Control */
+ __IO uint32_t DCGCGPIO; /*!< General-Purpose Input/Output Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCDMA; /*!< Micro Direct Memory Access Deep-Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED36;
+ __IO uint32_t DCGCHIB; /*!< Hibernation Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCUART; /*!< Universal Asynchronous Receiver/Transmitter Deep-Sleep Mode
+ Clock Gating Control */
+ __IO uint32_t DCGCSSI; /*!< Synchronous Serial Interface Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCI2C; /*!< Inter-Integrated Circuit Deep-Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED37;
+ __IO uint32_t DCGCUSB; /*!< Universal Serial Bus Deep-Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED38[2];
+ __IO uint32_t DCGCCAN; /*!< Controller Area Network Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCADC; /*!< Analog-to-Digital Converter Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCACMP; /*!< Analog Comparator Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCPWM; /*!< Pulse Width Modulator Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCQEI; /*!< Quadrature Encoder Interface Deep-Sleep Mode Clock Gating Control */
+ __I uint32_t RESERVED39[4];
+ __IO uint32_t DCGCEEPROM; /*!< EEPROM Deep-Sleep Mode Clock Gating Control */
+ __IO uint32_t DCGCWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Deep-Sleep Mode Clock Gating
+ Control */
+ __I uint32_t RESERVED40[104];
+ __IO uint32_t PRWD; /*!< Watchdog Timer Peripheral Ready */
+ __IO uint32_t PRTIMER; /*!< 16/32-Bit General-Purpose Timer Peripheral Ready */
+ __IO uint32_t PRGPIO; /*!< General-Purpose Input/Output Peripheral Ready */
+ __IO uint32_t PRDMA; /*!< Micro Direct Memory Access Peripheral Ready */
+ __I uint32_t RESERVED41;
+ __IO uint32_t PRHIB; /*!< Hibernation Peripheral Ready */
+ __IO uint32_t PRUART; /*!< Universal Asynchronous Receiver/Transmitter Peripheral Ready */
+ __IO uint32_t PRSSI; /*!< Synchronous Serial Interface Peripheral Ready */
+ __IO uint32_t PRI2C; /*!< Inter-Integrated Circuit Peripheral Ready */
+ __I uint32_t RESERVED42;
+ __IO uint32_t PRUSB; /*!< Universal Serial Bus Peripheral Ready */
+ __I uint32_t RESERVED43[2];
+ __IO uint32_t PRCAN; /*!< Controller Area Network Peripheral Ready */
+ __IO uint32_t PRADC; /*!< Analog-to-Digital Converter Peripheral Ready */
+ __IO uint32_t PRACMP; /*!< Analog Comparator Peripheral Ready */
+ __IO uint32_t PRPWM; /*!< Pulse Width Modulator Peripheral Ready */
+ __IO uint32_t PRQEI; /*!< Quadrature Encoder Interface Peripheral Ready */
+ __I uint32_t RESERVED44[4];
+ __IO uint32_t PREEPROM; /*!< EEPROM Peripheral Ready */
+ __IO uint32_t PRWTIMER; /*!< 32/64-Bit Wide General-Purpose Timer Peripheral Ready */
+} SYSCTL_Type;
+
+
+/* ================================================================================ */
+/* ================ UDMA ================ */
+/* ================================================================================ */
+
+
+/**
+ * @brief Register map for UDMA peripheral (UDMA)
+ */
+
+typedef struct { /*!< UDMA Structure */
+ __IO uint32_t STAT; /*!< DMA Status */
+ __O uint32_t CFG; /*!< DMA Configuration */
+ __IO uint32_t CTLBASE; /*!< DMA Channel Control Base Pointer */
+ __IO uint32_t ALTBASE; /*!< DMA Alternate Channel Control Base Pointer */
+ __IO uint32_t WAITSTAT; /*!< DMA Channel Wait-on-Request Status */
+ __O uint32_t SWREQ; /*!< DMA Channel Software Request */
+ __IO uint32_t USEBURSTSET; /*!< DMA Channel Useburst Set */
+ __O uint32_t USEBURSTCLR; /*!< DMA Channel Useburst Clear */
+ __IO uint32_t REQMASKSET; /*!< DMA Channel Request Mask Set */
+ __O uint32_t REQMASKCLR; /*!< DMA Channel Request Mask Clear */
+ __IO uint32_t ENASET; /*!< DMA Channel Enable Set */
+ __O uint32_t ENACLR; /*!< DMA Channel Enable Clear */
+ __IO uint32_t ALTSET; /*!< DMA Channel Primary Alternate Set */
+ __O uint32_t ALTCLR; /*!< DMA Channel Primary Alternate Clear */
+ __IO uint32_t PRIOSET; /*!< DMA Channel Priority Set */
+ __O uint32_t PRIOCLR; /*!< DMA Channel Priority Clear */
+ __I uint32_t RESERVED[3];
+ __IO uint32_t ERRCLR; /*!< DMA Bus Error Clear */
+ __I uint32_t RESERVED1[300];
+ __IO uint32_t CHASGN; /*!< DMA Channel Assignment */
+ __IO uint32_t CHIS; /*!< DMA Channel Interrupt Status */
+ __I uint32_t RESERVED2[2];
+ __IO uint32_t CHMAP0; /*!< DMA Channel Map Select 0 */
+ __IO uint32_t CHMAP1; /*!< DMA Channel Map Select 1 */
+ __IO uint32_t CHMAP2; /*!< DMA Channel Map Select 2 */
+ __IO uint32_t CHMAP3; /*!< DMA Channel Map Select 3 */
+} UDMA_Type;
+
+
+/* -------------------- End of section using anonymous unions ------------------- */
+#if defined(__CC_ARM)
+ #pragma pop
+#elif defined(__ICCARM__)
+ /* leave anonymous unions enabled */
+#elif defined(__GNUC__)
+ /* anonymous unions are enabled by default */
+#elif defined(__TMS470__)
+ /* anonymous unions are enabled by default */
+#elif defined(__TASKING__)
+ #pragma warning restore
+#else
+ #warning Not supported compiler type
+#endif
+
+
+
+
+/* ================================================================================ */
+/* ================ Peripheral memory map ================ */
+/* ================================================================================ */
+
+#define WATCHDOG0_BASE 0x40000000UL
+#define WATCHDOG1_BASE 0x40001000UL
+#define GPIOA_BASE 0x40004000UL
+#define GPIOB_BASE 0x40005000UL
+#define GPIOC_BASE 0x40006000UL
+#define GPIOD_BASE 0x40007000UL
+#define SSI0_BASE 0x40008000UL
+#define SSI1_BASE 0x40009000UL
+#define SSI2_BASE 0x4000A000UL
+#define SSI3_BASE 0x4000B000UL
+#define UART0_BASE 0x4000C000UL
+#define UART1_BASE 0x4000D000UL
+#define UART2_BASE 0x4000E000UL
+#define UART3_BASE 0x4000F000UL
+#define UART4_BASE 0x40010000UL
+#define UART5_BASE 0x40011000UL
+#define UART6_BASE 0x40012000UL
+#define UART7_BASE 0x40013000UL
+#define I2C0_BASE 0x40020000UL
+#define I2C1_BASE 0x40021000UL
+#define I2C2_BASE 0x40022000UL
+#define I2C3_BASE 0x40023000UL
+#define GPIOE_BASE 0x40024000UL
+#define GPIOF_BASE 0x40025000UL
+#define GPIOG_BASE 0x40026000UL
+#define GPIOH_BASE 0x40027000UL
+#define PWM0_BASE 0x40028000UL
+#define PWM1_BASE 0x40029000UL
+#define QEI0_BASE 0x4002C000UL
+#define QEI1_BASE 0x4002D000UL
+#define TIMER0_BASE 0x40030000UL
+#define TIMER1_BASE 0x40031000UL
+#define TIMER2_BASE 0x40032000UL
+#define TIMER3_BASE 0x40033000UL
+#define TIMER4_BASE 0x40034000UL
+#define TIMER5_BASE 0x40035000UL
+#define WTIMER0_BASE 0x40036000UL
+#define WTIMER1_BASE 0x40037000UL
+#define ADC0_BASE 0x40038000UL
+#define ADC1_BASE 0x40039000UL
+#define COMP_BASE 0x4003C000UL
+#define GPIOJ_BASE 0x4003D000UL
+#define CAN0_BASE 0x40040000UL
+#define CAN1_BASE 0x40041000UL
+#define WTIMER2_BASE 0x4004C000UL
+#define WTIMER3_BASE 0x4004D000UL
+#define WTIMER4_BASE 0x4004E000UL
+#define WTIMER5_BASE 0x4004F000UL
+#define USB0_BASE 0x40050000UL
+#define GPIOA_AHB_BASE 0x40058000UL
+#define GPIOB_AHB_BASE 0x40059000UL
+#define GPIOC_AHB_BASE 0x4005A000UL
+#define GPIOD_AHB_BASE 0x4005B000UL
+#define GPIOE_AHB_BASE 0x4005C000UL
+#define GPIOF_AHB_BASE 0x4005D000UL
+#define GPIOG_AHB_BASE 0x4005E000UL
+#define GPIOH_AHB_BASE 0x4005F000UL
+#define GPIOJ_AHB_BASE 0x40060000UL
+#define GPIOK_BASE 0x40061000UL
+#define GPIOL_BASE 0x40062000UL
+#define GPIOM_BASE 0x40063000UL
+#define GPION_BASE 0x40064000UL
+#define GPIOP_BASE 0x40065000UL
+#define EEPROM_BASE 0x400AF000UL
+#define I2C4_BASE 0x400C0000UL
+#define I2C5_BASE 0x400C1000UL
+#define SYSEXC_BASE 0x400F9000UL
+#define HIB_BASE 0x400FC000UL
+#define FLASH_CTRL_BASE 0x400FD000UL
+#define SYSCTL_BASE 0x400FE000UL
+#define UDMA_BASE 0x400FF000UL
+
+
+/* ================================================================================ */
+/* ================ Peripheral declaration ================ */
+/* ================================================================================ */
+
+#define WATCHDOG0 ((WATCHDOG0_Type *) WATCHDOG0_BASE)
+#define WATCHDOG1 ((WATCHDOG0_Type *) WATCHDOG1_BASE)
+#define GPIOA ((GPIOA_Type *) GPIOA_BASE)
+#define GPIOB ((GPIOA_Type *) GPIOB_BASE)
+#define GPIOC ((GPIOA_Type *) GPIOC_BASE)
+#define GPIOD ((GPIOA_Type *) GPIOD_BASE)
+#define SSI0 ((SSI0_Type *) SSI0_BASE)
+#define SSI1 ((SSI0_Type *) SSI1_BASE)
+#define SSI2 ((SSI0_Type *) SSI2_BASE)
+#define SSI3 ((SSI0_Type *) SSI3_BASE)
+#define UART0 ((UART0_Type *) UART0_BASE)
+#define UART1 ((UART0_Type *) UART1_BASE)
+#define UART2 ((UART0_Type *) UART2_BASE)
+#define UART3 ((UART0_Type *) UART3_BASE)
+#define UART4 ((UART0_Type *) UART4_BASE)
+#define UART5 ((UART0_Type *) UART5_BASE)
+#define UART6 ((UART0_Type *) UART6_BASE)
+#define UART7 ((UART0_Type *) UART7_BASE)
+#define I2C0 ((I2C0_Type *) I2C0_BASE)
+#define I2C1 ((I2C0_Type *) I2C1_BASE)
+#define I2C2 ((I2C0_Type *) I2C2_BASE)
+#define I2C3 ((I2C0_Type *) I2C3_BASE)
+#define GPIOE ((GPIOA_Type *) GPIOE_BASE)
+#define GPIOF ((GPIOA_Type *) GPIOF_BASE)
+#define GPIOG ((GPIOA_Type *) GPIOG_BASE)
+#define GPIOH ((GPIOA_Type *) GPIOH_BASE)
+#define PWM0 ((PWM0_Type *) PWM0_BASE)
+#define PWM1 ((PWM0_Type *) PWM1_BASE)
+#define QEI0 ((QEI0_Type *) QEI0_BASE)
+#define QEI1 ((QEI0_Type *) QEI1_BASE)
+#define TIMER0 ((TIMER0_Type *) TIMER0_BASE)
+#define TIMER1 ((TIMER0_Type *) TIMER1_BASE)
+#define TIMER2 ((TIMER0_Type *) TIMER2_BASE)
+#define TIMER3 ((TIMER0_Type *) TIMER3_BASE)
+#define TIMER4 ((TIMER0_Type *) TIMER4_BASE)
+#define TIMER5 ((TIMER0_Type *) TIMER5_BASE)
+#define WTIMER0 ((WTIMER0_Type *) WTIMER0_BASE)
+#define WTIMER1 ((TIMER0_Type *) WTIMER1_BASE)
+#define ADC0 ((ADC0_Type *) ADC0_BASE)
+#define ADC1 ((ADC0_Type *) ADC1_BASE)
+#define COMP ((COMP_Type *) COMP_BASE)
+#define GPIOJ ((GPIOA_Type *) GPIOJ_BASE)
+#define CAN0 ((CAN0_Type *) CAN0_BASE)
+#define CAN1 ((CAN0_Type *) CAN1_BASE)
+#define WTIMER2 ((TIMER0_Type *) WTIMER2_BASE)
+#define WTIMER3 ((TIMER0_Type *) WTIMER3_BASE)
+#define WTIMER4 ((TIMER0_Type *) WTIMER4_BASE)
+#define WTIMER5 ((TIMER0_Type *) WTIMER5_BASE)
+#define USB0 ((USB0_Type *) USB0_BASE)
+#define GPIOA_AHB ((GPIOA_Type *) GPIOA_AHB_BASE)
+#define GPIOB_AHB ((GPIOA_Type *) GPIOB_AHB_BASE)
+#define GPIOC_AHB ((GPIOA_Type *) GPIOC_AHB_BASE)
+#define GPIOD_AHB ((GPIOA_Type *) GPIOD_AHB_BASE)
+#define GPIOE_AHB ((GPIOA_Type *) GPIOE_AHB_BASE)
+#define GPIOF_AHB ((GPIOA_Type *) GPIOF_AHB_BASE)
+#define GPIOG_AHB ((GPIOA_Type *) GPIOG_AHB_BASE)
+#define GPIOH_AHB ((GPIOA_Type *) GPIOH_AHB_BASE)
+#define GPIOJ_AHB ((GPIOA_Type *) GPIOJ_AHB_BASE)
+#define GPIOK ((GPIOA_Type *) GPIOK_BASE)
+#define GPIOL ((GPIOA_Type *) GPIOL_BASE)
+#define GPIOM ((GPIOA_Type *) GPIOM_BASE)
+#define GPION ((GPIOA_Type *) GPION_BASE)
+#define GPIOP ((GPIOA_Type *) GPIOP_BASE)
+#define EEPROM ((EEPROM_Type *) EEPROM_BASE)
+#define I2C4 ((I2C0_Type *) I2C4_BASE)
+#define I2C5 ((I2C0_Type *) I2C5_BASE)
+#define SYSEXC ((SYSEXC_Type *) SYSEXC_BASE)
+#define HIB ((HIB_Type *) HIB_BASE)
+#define FLASH_CTRL ((FLASH_CTRL_Type *) FLASH_CTRL_BASE)
+#define SYSCTL ((SYSCTL_Type *) SYSCTL_BASE)
+#define UDMA ((UDMA_Type *) UDMA_BASE)
+
+
+/** @} */ /* End of group Device_Peripheral_Registers */
+/** @} */ /* End of group TM4C123GH6PGE */
+/** @} */ /* End of group Texas Instruments */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* TM4C123GH6PGE_H */
+
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/system_TM4C123.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/system_TM4C123.h
new file mode 100644
index 000000000..5e1da7a78
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Device/TI/TM4C123/system_TM4C123.h
@@ -0,0 +1,64 @@
+/**************************************************************************//**
+ * @file system_LM4F.h
+ * @brief CMSIS Cortex-M4 Device Peripheral Access Layer Header File for
+ * TI Tiva TM4C123 Class Devices
+ * @version V3.1
+ * @date 15. May 2013
+ *
+ * @note
+ * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers. This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * 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.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+
+
+#ifndef SYSTEM_TM4C123_H
+#define SYSTEM_TM4C123_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+
+extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
+
+
+/**
+ * Initialize the system
+ *
+ * @param none
+ * @return none
+ *
+ * @brief Setup the microcontroller system.
+ * Initialize the System and update the SystemCoreClock variable.
+ */
+extern void SystemInit (void);
+
+/**
+ * Update SystemCoreClock variable
+ *
+ * @param none
+ * @return none
+ *
+ * @brief Updates the SystemCoreClock with current core Clock
+ * retrieved from cpu registers.
+ */
+extern void SystemCoreClockUpdate (void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SYSTEM_TM4C123_H */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armcc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armcc.h
new file mode 100644
index 000000000..237ff6ec3
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armcc.h
@@ -0,0 +1,885 @@
+/**************************************************************************//**
+ * @file cmsis_armcc.h
+ * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
+ * @version V5.2.1
+ * @date 26. March 2020
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CMSIS_ARMCC_H
+#define __CMSIS_ARMCC_H
+
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
+ #error "Please use Arm Compiler Toolchain V4.0.677 or later!"
+#endif
+
+/* CMSIS compiler control architecture macros */
+#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \
+ (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) )
+ #define __ARM_ARCH_6M__ 1
+#endif
+
+#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
+ #define __ARM_ARCH_7M__ 1
+#endif
+
+#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
+ #define __ARM_ARCH_7EM__ 1
+#endif
+
+ /* __ARM_ARCH_8M_BASE__ not applicable */
+ /* __ARM_ARCH_8M_MAIN__ not applicable */
+ /* __ARM_ARCH_8_1M_MAIN__ not applicable */
+
+/* CMSIS compiler control DSP macros */
+#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+ #define __ARM_FEATURE_DSP 1
+#endif
+
+/* CMSIS compiler specific defines */
+#ifndef __ASM
+ #define __ASM __asm
+#endif
+#ifndef __INLINE
+ #define __INLINE __inline
+#endif
+#ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static __inline
+#endif
+#ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE static __forceinline
+#endif
+#ifndef __NO_RETURN
+ #define __NO_RETURN __declspec(noreturn)
+#endif
+#ifndef __USED
+ #define __USED __attribute__((used))
+#endif
+#ifndef __WEAK
+ #define __WEAK __attribute__((weak))
+#endif
+#ifndef __PACKED
+ #define __PACKED __attribute__((packed))
+#endif
+#ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT __packed struct
+#endif
+#ifndef __PACKED_UNION
+ #define __PACKED_UNION __packed union
+#endif
+#ifndef __UNALIGNED_UINT32 /* deprecated */
+ #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
+#endif
+#ifndef __UNALIGNED_UINT16_WRITE
+ #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val))
+#endif
+#ifndef __UNALIGNED_UINT16_READ
+ #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr)))
+#endif
+#ifndef __UNALIGNED_UINT32_WRITE
+ #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val))
+#endif
+#ifndef __UNALIGNED_UINT32_READ
+ #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
+#endif
+#ifndef __ALIGNED
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+#endif
+#ifndef __RESTRICT
+ #define __RESTRICT __restrict
+#endif
+#ifndef __COMPILER_BARRIER
+ #define __COMPILER_BARRIER() __memory_changed()
+#endif
+
+/* ######################### Startup and Lowlevel Init ######################## */
+
+#ifndef __PROGRAM_START
+#define __PROGRAM_START __main
+#endif
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit
+#endif
+
+#ifndef __STACK_LIMIT
+#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base
+#endif
+
+#ifndef __VECTOR_TABLE
+#define __VECTOR_TABLE __Vectors
+#endif
+
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET")))
+#endif
+
+/* ########################### Core Function Access ########################### */
+/** \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+ @{
+ */
+
+/**
+ \brief Enable IRQ Interrupts
+ \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+/* intrinsic void __enable_irq(); */
+
+
+/**
+ \brief Disable IRQ Interrupts
+ \details Disables IRQ interrupts by setting the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+/* intrinsic void __disable_irq(); */
+
+/**
+ \brief Get Control Register
+ \details Returns the content of the Control Register.
+ \return Control Register value
+ */
+__STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+ register uint32_t __regControl __ASM("control");
+ return(__regControl);
+}
+
+
+/**
+ \brief Set Control Register
+ \details Writes the given value to the Control Register.
+ \param [in] control Control Register value to set
+ */
+__STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+ register uint32_t __regControl __ASM("control");
+ __regControl = control;
+}
+
+
+/**
+ \brief Get IPSR Register
+ \details Returns the content of the IPSR Register.
+ \return IPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_IPSR(void)
+{
+ register uint32_t __regIPSR __ASM("ipsr");
+ return(__regIPSR);
+}
+
+
+/**
+ \brief Get APSR Register
+ \details Returns the content of the APSR Register.
+ \return APSR Register value
+ */
+__STATIC_INLINE uint32_t __get_APSR(void)
+{
+ register uint32_t __regAPSR __ASM("apsr");
+ return(__regAPSR);
+}
+
+
+/**
+ \brief Get xPSR Register
+ \details Returns the content of the xPSR Register.
+ \return xPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_xPSR(void)
+{
+ register uint32_t __regXPSR __ASM("xpsr");
+ return(__regXPSR);
+}
+
+
+/**
+ \brief Get Process Stack Pointer
+ \details Returns the current value of the Process Stack Pointer (PSP).
+ \return PSP Register value
+ */
+__STATIC_INLINE uint32_t __get_PSP(void)
+{
+ register uint32_t __regProcessStackPointer __ASM("psp");
+ return(__regProcessStackPointer);
+}
+
+
+/**
+ \brief Set Process Stack Pointer
+ \details Assigns the given value to the Process Stack Pointer (PSP).
+ \param [in] topOfProcStack Process Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+ register uint32_t __regProcessStackPointer __ASM("psp");
+ __regProcessStackPointer = topOfProcStack;
+}
+
+
+/**
+ \brief Get Main Stack Pointer
+ \details Returns the current value of the Main Stack Pointer (MSP).
+ \return MSP Register value
+ */
+__STATIC_INLINE uint32_t __get_MSP(void)
+{
+ register uint32_t __regMainStackPointer __ASM("msp");
+ return(__regMainStackPointer);
+}
+
+
+/**
+ \brief Set Main Stack Pointer
+ \details Assigns the given value to the Main Stack Pointer (MSP).
+ \param [in] topOfMainStack Main Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+ register uint32_t __regMainStackPointer __ASM("msp");
+ __regMainStackPointer = topOfMainStack;
+}
+
+
+/**
+ \brief Get Priority Mask
+ \details Returns the current state of the priority mask bit from the Priority Mask Register.
+ \return Priority Mask value
+ */
+__STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+ register uint32_t __regPriMask __ASM("primask");
+ return(__regPriMask);
+}
+
+
+/**
+ \brief Set Priority Mask
+ \details Assigns the given value to the Priority Mask Register.
+ \param [in] priMask Priority Mask
+ */
+__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+ register uint32_t __regPriMask __ASM("primask");
+ __regPriMask = (priMask);
+}
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+
+/**
+ \brief Enable FIQ
+ \details Enables FIQ interrupts by clearing the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+#define __enable_fault_irq __enable_fiq
+
+
+/**
+ \brief Disable FIQ
+ \details Disables FIQ interrupts by setting the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+#define __disable_fault_irq __disable_fiq
+
+
+/**
+ \brief Get Base Priority
+ \details Returns the current value of the Base Priority register.
+ \return Base Priority register value
+ */
+__STATIC_INLINE uint32_t __get_BASEPRI(void)
+{
+ register uint32_t __regBasePri __ASM("basepri");
+ return(__regBasePri);
+}
+
+
+/**
+ \brief Set Base Priority
+ \details Assigns the given value to the Base Priority register.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
+{
+ register uint32_t __regBasePri __ASM("basepri");
+ __regBasePri = (basePri & 0xFFU);
+}
+
+
+/**
+ \brief Set Base Priority with condition
+ \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
+ or the new value increases the BASEPRI priority level.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
+{
+ register uint32_t __regBasePriMax __ASM("basepri_max");
+ __regBasePriMax = (basePri & 0xFFU);
+}
+
+
+/**
+ \brief Get Fault Mask
+ \details Returns the current value of the Fault Mask register.
+ \return Fault Mask register value
+ */
+__STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+ register uint32_t __regFaultMask __ASM("faultmask");
+ return(__regFaultMask);
+}
+
+
+/**
+ \brief Set Fault Mask
+ \details Assigns the given value to the Fault Mask register.
+ \param [in] faultMask Fault Mask value to set
+ */
+__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+ register uint32_t __regFaultMask __ASM("faultmask");
+ __regFaultMask = (faultMask & (uint32_t)1U);
+}
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
+
+
+/**
+ \brief Get FPSCR
+ \details Returns the current value of the Floating Point Status/Control register.
+ \return Floating Point Status/Control register value
+ */
+__STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+ register uint32_t __regfpscr __ASM("fpscr");
+ return(__regfpscr);
+#else
+ return(0U);
+#endif
+}
+
+
+/**
+ \brief Set FPSCR
+ \details Assigns the given value to the Floating Point Status/Control register.
+ \param [in] fpscr Floating Point Status/Control value to set
+ */
+__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+ register uint32_t __regfpscr __ASM("fpscr");
+ __regfpscr = (fpscr);
+#else
+ (void)fpscr;
+#endif
+}
+
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+/* ########################## Core Instruction Access ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+ Access to dedicated instructions
+ @{
+*/
+
+/**
+ \brief No Operation
+ \details No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP __nop
+
+
+/**
+ \brief Wait For Interrupt
+ \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
+ */
+#define __WFI __wfi
+
+
+/**
+ \brief Wait For Event
+ \details Wait For Event is a hint instruction that permits the processor to enter
+ a low-power state until one of a number of events occurs.
+ */
+#define __WFE __wfe
+
+
+/**
+ \brief Send Event
+ \details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV __sev
+
+
+/**
+ \brief Instruction Synchronization Barrier
+ \details Instruction Synchronization Barrier flushes the pipeline in the processor,
+ so that all instructions following the ISB are fetched from cache or memory,
+ after the instruction has been completed.
+ */
+#define __ISB() __isb(0xF)
+
+/**
+ \brief Data Synchronization Barrier
+ \details Acts as a special kind of Data Memory Barrier.
+ It completes when all explicit memory accesses before this instruction complete.
+ */
+#define __DSB() __dsb(0xF)
+
+/**
+ \brief Data Memory Barrier
+ \details Ensures the apparent order of the explicit memory operations before
+ and after the instruction, without ensuring their completion.
+ */
+#define __DMB() __dmb(0xF)
+
+
+/**
+ \brief Reverse byte order (32 bit)
+ \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#define __REV __rev
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
+{
+ rev16 r0, r0
+ bx lr
+}
+#endif
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
+{
+ revsh r0, r0
+ bx lr
+}
+#endif
+
+
+/**
+ \brief Rotate Right in unsigned value (32 bit)
+ \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+ \param [in] op1 Value to rotate
+ \param [in] op2 Number of Bits to rotate
+ \return Rotated value
+ */
+#define __ROR __ror
+
+
+/**
+ \brief Breakpoint
+ \details Causes the processor to enter Debug state.
+ Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+ \param [in] value is ignored by the processor.
+ If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value) __breakpoint(value)
+
+
+/**
+ \brief Reverse bit order of value
+ \details Reverses the bit order of the given value.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+ #define __RBIT __rbit
+#else
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+{
+ uint32_t result;
+ uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
+
+ result = value; /* r will be reversed bits of v; first get LSB of v */
+ for (value >>= 1U; value != 0U; value >>= 1U)
+ {
+ result <<= 1U;
+ result |= value & 1U;
+ s--;
+ }
+ result <<= s; /* shift when v's highest bits are zero */
+ return result;
+}
+#endif
+
+
+/**
+ \brief Count leading zeros
+ \details Counts the number of leading zeros of a data value.
+ \param [in] value Value to count the leading zeros
+ \return number of leading zeros in value
+ */
+#define __CLZ __clz
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+
+/**
+ \brief LDR Exclusive (8 bit)
+ \details Executes a exclusive LDR instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
+#else
+ #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
+#endif
+
+
+/**
+ \brief LDR Exclusive (16 bit)
+ \details Executes a exclusive LDR instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
+#else
+ #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
+#endif
+
+
+/**
+ \brief LDR Exclusive (32 bit)
+ \details Executes a exclusive LDR instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
+#else
+ #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
+#endif
+
+
+/**
+ \brief STR Exclusive (8 bit)
+ \details Executes a exclusive STR instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __STREXB(value, ptr) __strex(value, ptr)
+#else
+ #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
+#endif
+
+
+/**
+ \brief STR Exclusive (16 bit)
+ \details Executes a exclusive STR instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __STREXH(value, ptr) __strex(value, ptr)
+#else
+ #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
+#endif
+
+
+/**
+ \brief STR Exclusive (32 bit)
+ \details Executes a exclusive STR instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
+ #define __STREXW(value, ptr) __strex(value, ptr)
+#else
+ #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
+#endif
+
+
+/**
+ \brief Remove the exclusive lock
+ \details Removes the exclusive lock which is created by LDREX.
+ */
+#define __CLREX __clrex
+
+
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+#define __SSAT __ssat
+
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+#define __USAT __usat
+
+
+/**
+ \brief Rotate Right with Extend (32 bit)
+ \details Moves each bit of a bitstring right by one bit.
+ The carry input is shifted in at the left end of the bitstring.
+ \param [in] value Value to rotate
+ \return Rotated value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
+{
+ rrx r0, r0
+ bx lr
+}
+#endif
+
+
+/**
+ \brief LDRT Unprivileged (8 bit)
+ \details Executes a Unprivileged LDRT instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
+
+
+/**
+ \brief LDRT Unprivileged (16 bit)
+ \details Executes a Unprivileged LDRT instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
+
+
+/**
+ \brief LDRT Unprivileged (32 bit)
+ \details Executes a Unprivileged LDRT instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
+
+
+/**
+ \brief STRT Unprivileged (8 bit)
+ \details Executes a Unprivileged STRT instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+#define __STRBT(value, ptr) __strt(value, ptr)
+
+
+/**
+ \brief STRT Unprivileged (16 bit)
+ \details Executes a Unprivileged STRT instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+#define __STRHT(value, ptr) __strt(value, ptr)
+
+
+/**
+ \brief STRT Unprivileged (32 bit)
+ \details Executes a Unprivileged STRT instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+#define __STRT(value, ptr) __strt(value, ptr)
+
+#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
+
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
+{
+ if ((sat >= 1U) && (sat <= 32U))
+ {
+ const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
+ const int32_t min = -1 - max ;
+ if (val > max)
+ {
+ return max;
+ }
+ else if (val < min)
+ {
+ return min;
+ }
+ }
+ return val;
+}
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
+{
+ if (sat <= 31U)
+ {
+ const uint32_t max = ((1U << sat) - 1U);
+ if (val > (int32_t)max)
+ {
+ return max;
+ }
+ else if (val < 0)
+ {
+ return 0U;
+ }
+ }
+ return (uint32_t)val;
+}
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+
+/* ################### Compiler specific Intrinsics ########################### */
+/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
+ Access to dedicated SIMD instructions
+ @{
+*/
+
+#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+
+#define __SADD8 __sadd8
+#define __QADD8 __qadd8
+#define __SHADD8 __shadd8
+#define __UADD8 __uadd8
+#define __UQADD8 __uqadd8
+#define __UHADD8 __uhadd8
+#define __SSUB8 __ssub8
+#define __QSUB8 __qsub8
+#define __SHSUB8 __shsub8
+#define __USUB8 __usub8
+#define __UQSUB8 __uqsub8
+#define __UHSUB8 __uhsub8
+#define __SADD16 __sadd16
+#define __QADD16 __qadd16
+#define __SHADD16 __shadd16
+#define __UADD16 __uadd16
+#define __UQADD16 __uqadd16
+#define __UHADD16 __uhadd16
+#define __SSUB16 __ssub16
+#define __QSUB16 __qsub16
+#define __SHSUB16 __shsub16
+#define __USUB16 __usub16
+#define __UQSUB16 __uqsub16
+#define __UHSUB16 __uhsub16
+#define __SASX __sasx
+#define __QASX __qasx
+#define __SHASX __shasx
+#define __UASX __uasx
+#define __UQASX __uqasx
+#define __UHASX __uhasx
+#define __SSAX __ssax
+#define __QSAX __qsax
+#define __SHSAX __shsax
+#define __USAX __usax
+#define __UQSAX __uqsax
+#define __UHSAX __uhsax
+#define __USAD8 __usad8
+#define __USADA8 __usada8
+#define __SSAT16 __ssat16
+#define __USAT16 __usat16
+#define __UXTB16 __uxtb16
+#define __UXTAB16 __uxtab16
+#define __SXTB16 __sxtb16
+#define __SXTAB16 __sxtab16
+#define __SMUAD __smuad
+#define __SMUADX __smuadx
+#define __SMLAD __smlad
+#define __SMLADX __smladx
+#define __SMLALD __smlald
+#define __SMLALDX __smlaldx
+#define __SMUSD __smusd
+#define __SMUSDX __smusdx
+#define __SMLSD __smlsd
+#define __SMLSDX __smlsdx
+#define __SMLSLD __smlsld
+#define __SMLSLDX __smlsldx
+#define __SEL __sel
+#define __QADD __qadd
+#define __QSUB __qsub
+
+#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
+ ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
+
+#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
+ ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
+
+#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
+ ((int64_t)(ARG3) << 32U) ) >> 32U))
+
+#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2))
+
+#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
+/*@} end of group CMSIS_SIMD_intrinsics */
+
+
+#endif /* __CMSIS_ARMCC_H */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armclang.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armclang.h
new file mode 100644
index 000000000..90de9dbf8
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_armclang.h
@@ -0,0 +1,1467 @@
+/**************************************************************************//**
+ * @file cmsis_armclang.h
+ * @brief CMSIS compiler armclang (Arm Compiler 6) header file
+ * @version V5.3.1
+ * @date 26. March 2020
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */
+
+#ifndef __CMSIS_ARMCLANG_H
+#define __CMSIS_ARMCLANG_H
+
+#pragma clang system_header /* treat file as system include file */
+
+#ifndef __ARM_COMPAT_H
+#include /* Compatibility header for Arm Compiler 5 intrinsics */
+#endif
+
+/* CMSIS compiler specific defines */
+#ifndef __ASM
+ #define __ASM __asm
+#endif
+#ifndef __INLINE
+ #define __INLINE __inline
+#endif
+#ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static __inline
+#endif
+#ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline
+#endif
+#ifndef __NO_RETURN
+ #define __NO_RETURN __attribute__((__noreturn__))
+#endif
+#ifndef __USED
+ #define __USED __attribute__((used))
+#endif
+#ifndef __WEAK
+ #define __WEAK __attribute__((weak))
+#endif
+#ifndef __PACKED
+ #define __PACKED __attribute__((packed, aligned(1)))
+#endif
+#ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
+#endif
+#ifndef __PACKED_UNION
+ #define __PACKED_UNION union __attribute__((packed, aligned(1)))
+#endif
+#ifndef __UNALIGNED_UINT32 /* deprecated */
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wpacked"
+/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */
+ struct __attribute__((packed)) T_UINT32 { uint32_t v; };
+ #pragma clang diagnostic pop
+ #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
+#endif
+#ifndef __UNALIGNED_UINT16_WRITE
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wpacked"
+/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */
+ __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
+ #pragma clang diagnostic pop
+ #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
+#endif
+#ifndef __UNALIGNED_UINT16_READ
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wpacked"
+/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */
+ __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
+ #pragma clang diagnostic pop
+ #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
+#endif
+#ifndef __UNALIGNED_UINT32_WRITE
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wpacked"
+/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */
+ __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
+ #pragma clang diagnostic pop
+ #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
+#endif
+#ifndef __UNALIGNED_UINT32_READ
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wpacked"
+/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */
+ __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
+ #pragma clang diagnostic pop
+ #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
+#endif
+#ifndef __ALIGNED
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+#endif
+#ifndef __RESTRICT
+ #define __RESTRICT __restrict
+#endif
+#ifndef __COMPILER_BARRIER
+ #define __COMPILER_BARRIER() __ASM volatile("":::"memory")
+#endif
+
+/* ######################### Startup and Lowlevel Init ######################## */
+
+#ifndef __PROGRAM_START
+#define __PROGRAM_START __main
+#endif
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit
+#endif
+
+#ifndef __STACK_LIMIT
+#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base
+#endif
+
+#ifndef __VECTOR_TABLE
+#define __VECTOR_TABLE __Vectors
+#endif
+
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET")))
+#endif
+
+/* ########################### Core Function Access ########################### */
+/** \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+ @{
+ */
+
+/**
+ \brief Enable IRQ Interrupts
+ \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+/* intrinsic void __enable_irq(); see arm_compat.h */
+
+
+/**
+ \brief Disable IRQ Interrupts
+ \details Disables IRQ interrupts by setting the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+/* intrinsic void __disable_irq(); see arm_compat.h */
+
+
+/**
+ \brief Get Control Register
+ \details Returns the content of the Control Register.
+ \return Control Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_CONTROL(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, control" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Control Register (non-secure)
+ \details Returns the content of the non-secure Control Register when in secure mode.
+ \return non-secure Control Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, control_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Control Register
+ \details Writes the given value to the Control Register.
+ \param [in] control Control Register value to set
+ */
+__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control)
+{
+ __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Control Register (non-secure)
+ \details Writes the given value to the non-secure Control Register when in secure state.
+ \param [in] control Control Register value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control)
+{
+ __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory");
+}
+#endif
+
+
+/**
+ \brief Get IPSR Register
+ \details Returns the content of the IPSR Register.
+ \return IPSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_IPSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get APSR Register
+ \details Returns the content of the APSR Register.
+ \return APSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_APSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, apsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get xPSR Register
+ \details Returns the content of the xPSR Register.
+ \return xPSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_xPSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get Process Stack Pointer
+ \details Returns the current value of the Process Stack Pointer (PSP).
+ \return PSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PSP(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, psp" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Process Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
+ \return PSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, psp_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Process Stack Pointer
+ \details Assigns the given value to the Process Stack Pointer (PSP).
+ \param [in] topOfProcStack Process Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack)
+{
+ __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : );
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Process Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
+ \param [in] topOfProcStack Process Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)
+{
+ __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : );
+}
+#endif
+
+
+/**
+ \brief Get Main Stack Pointer
+ \details Returns the current value of the Main Stack Pointer (MSP).
+ \return MSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_MSP(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, msp" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Main Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
+ \return MSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, msp_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Main Stack Pointer
+ \details Assigns the given value to the Main Stack Pointer (MSP).
+ \param [in] topOfMainStack Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack)
+{
+ __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : );
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Main Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
+ \param [in] topOfMainStack Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)
+{
+ __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : );
+}
+#endif
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.
+ \return SP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, sp_ns" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Set Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.
+ \param [in] topOfStack Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack)
+{
+ __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : );
+}
+#endif
+
+
+/**
+ \brief Get Priority Mask
+ \details Returns the current state of the priority mask bit from the Priority Mask Register.
+ \return Priority Mask value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, primask" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Priority Mask (non-secure)
+ \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.
+ \return Priority Mask value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, primask_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Priority Mask
+ \details Assigns the given value to the Priority Mask Register.
+ \param [in] priMask Priority Mask
+ */
+__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask)
+{
+ __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Priority Mask (non-secure)
+ \details Assigns the given value to the non-secure Priority Mask Register when in secure state.
+ \param [in] priMask Priority Mask
+ */
+__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)
+{
+ __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory");
+}
+#endif
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) )
+/**
+ \brief Enable FIQ
+ \details Enables FIQ interrupts by clearing the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+#define __enable_fault_irq __enable_fiq /* see arm_compat.h */
+
+
+/**
+ \brief Disable FIQ
+ \details Disables FIQ interrupts by setting the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+#define __disable_fault_irq __disable_fiq /* see arm_compat.h */
+
+
+/**
+ \brief Get Base Priority
+ \details Returns the current value of the Base Priority register.
+ \return Base Priority register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, basepri" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Base Priority (non-secure)
+ \details Returns the current value of the non-secure Base Priority register when in secure state.
+ \return Base Priority register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Base Priority
+ \details Assigns the given value to the Base Priority register.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Base Priority (non-secure)
+ \details Assigns the given value to the non-secure Base Priority register when in secure state.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory");
+}
+#endif
+
+
+/**
+ \brief Set Base Priority with condition
+ \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
+ or the new value increases the BASEPRI priority level.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory");
+}
+
+
+/**
+ \brief Get Fault Mask
+ \details Returns the current value of the Fault Mask register.
+ \return Fault Mask register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Fault Mask (non-secure)
+ \details Returns the current value of the non-secure Fault Mask register when in secure state.
+ \return Fault Mask register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Fault Mask
+ \details Assigns the given value to the Fault Mask register.
+ \param [in] faultMask Fault Mask value to set
+ */
+__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+ __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Fault Mask (non-secure)
+ \details Assigns the given value to the non-secure Fault Mask register when in secure state.
+ \param [in] faultMask Fault Mask value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)
+{
+ __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory");
+}
+#endif
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) )
+
+/**
+ \brief Get Process Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always in non-secure
+ mode.
+
+ \details Returns the current value of the Process Stack Pointer Limit (PSPLIM).
+ \return PSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, psplim" : "=r" (result) );
+ return result;
+#endif
+}
+
+#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Process Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always in non-secure
+ mode.
+
+ \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
+ \return PSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) )
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) );
+ return result;
+#endif
+}
+#endif
+
+
+/**
+ \brief Set Process Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored in non-secure
+ mode.
+
+ \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).
+ \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)ProcStackPtrLimit;
+#else
+ __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit));
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Process Stack Pointer (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored in non-secure
+ mode.
+
+ \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
+ \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) )
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)ProcStackPtrLimit;
+#else
+ __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit));
+#endif
+}
+#endif
+
+
+/**
+ \brief Get Main Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always.
+
+ \details Returns the current value of the Main Stack Pointer Limit (MSPLIM).
+ \return MSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, msplim" : "=r" (result) );
+ return result;
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Main Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always.
+
+ \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.
+ \return MSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) )
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) );
+ return result;
+#endif
+}
+#endif
+
+
+/**
+ \brief Set Main Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored.
+
+ \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).
+ \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ (void)MainStackPtrLimit;
+#else
+ __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit));
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Main Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored.
+
+ \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.
+ \param [in] MainStackPtrLimit Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)
+{
+#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) )
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ (void)MainStackPtrLimit;
+#else
+ __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit));
+#endif
+}
+#endif
+
+#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+/**
+ \brief Get FPSCR
+ \details Returns the current value of the Floating Point Status/Control register.
+ \return Floating Point Status/Control register value
+ */
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr
+#else
+#define __get_FPSCR() ((uint32_t)0U)
+#endif
+
+/**
+ \brief Set FPSCR
+ \details Assigns the given value to the Floating Point Status/Control register.
+ \param [in] fpscr Floating Point Status/Control value to set
+ */
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+#define __set_FPSCR __builtin_arm_set_fpscr
+#else
+#define __set_FPSCR(x) ((void)(x))
+#endif
+
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+/* ########################## Core Instruction Access ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+ Access to dedicated instructions
+ @{
+*/
+
+/* Define macros for porting to both thumb1 and thumb2.
+ * For thumb1, use low register (r0-r7), specified by constraint "l"
+ * Otherwise, use general registers, specified by constraint "r" */
+#if defined (__thumb__) && !defined (__thumb2__)
+#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
+#define __CMSIS_GCC_RW_REG(r) "+l" (r)
+#define __CMSIS_GCC_USE_REG(r) "l" (r)
+#else
+#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
+#define __CMSIS_GCC_RW_REG(r) "+r" (r)
+#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#endif
+
+/**
+ \brief No Operation
+ \details No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP __builtin_arm_nop
+
+/**
+ \brief Wait For Interrupt
+ \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
+ */
+#define __WFI __builtin_arm_wfi
+
+
+/**
+ \brief Wait For Event
+ \details Wait For Event is a hint instruction that permits the processor to enter
+ a low-power state until one of a number of events occurs.
+ */
+#define __WFE __builtin_arm_wfe
+
+
+/**
+ \brief Send Event
+ \details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV __builtin_arm_sev
+
+
+/**
+ \brief Instruction Synchronization Barrier
+ \details Instruction Synchronization Barrier flushes the pipeline in the processor,
+ so that all instructions following the ISB are fetched from cache or memory,
+ after the instruction has been completed.
+ */
+#define __ISB() __builtin_arm_isb(0xF)
+
+/**
+ \brief Data Synchronization Barrier
+ \details Acts as a special kind of Data Memory Barrier.
+ It completes when all explicit memory accesses before this instruction complete.
+ */
+#define __DSB() __builtin_arm_dsb(0xF)
+
+
+/**
+ \brief Data Memory Barrier
+ \details Ensures the apparent order of the explicit memory operations before
+ and after the instruction, without ensuring their completion.
+ */
+#define __DMB() __builtin_arm_dmb(0xF)
+
+
+/**
+ \brief Reverse byte order (32 bit)
+ \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#define __REV(value) __builtin_bswap32(value)
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#define __REV16(value) __ROR(__REV(value), 16)
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#define __REVSH(value) (int16_t)__builtin_bswap16(value)
+
+
+/**
+ \brief Rotate Right in unsigned value (32 bit)
+ \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+ \param [in] op1 Value to rotate
+ \param [in] op2 Number of Bits to rotate
+ \return Rotated value
+ */
+__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+{
+ op2 %= 32U;
+ if (op2 == 0U)
+ {
+ return op1;
+ }
+ return (op1 >> op2) | (op1 << (32U - op2));
+}
+
+
+/**
+ \brief Breakpoint
+ \details Causes the processor to enter Debug state.
+ Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+ \param [in] value is ignored by the processor.
+ If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value) __ASM volatile ("bkpt "#value)
+
+
+/**
+ \brief Reverse bit order of value
+ \details Reverses the bit order of the given value.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#define __RBIT __builtin_arm_rbit
+
+/**
+ \brief Count leading zeros
+ \details Counts the number of leading zeros of a data value.
+ \param [in] value Value to count the leading zeros
+ \return number of leading zeros in value
+ */
+__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value)
+{
+ /* Even though __builtin_clz produces a CLZ instruction on ARM, formally
+ __builtin_clz(0) is undefined behaviour, so handle this case specially.
+ This guarantees ARM-compatible results if happening to compile on a non-ARM
+ target, and ensures the compiler doesn't decide to activate any
+ optimisations using the logic "value was passed to __builtin_clz, so it
+ is non-zero".
+ ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a
+ single CLZ instruction.
+ */
+ if (value == 0U)
+ {
+ return 32U;
+ }
+ return __builtin_clz(value);
+}
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) )
+
+/**
+ \brief LDR Exclusive (8 bit)
+ \details Executes a exclusive LDR instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+#define __LDREXB (uint8_t)__builtin_arm_ldrex
+
+
+/**
+ \brief LDR Exclusive (16 bit)
+ \details Executes a exclusive LDR instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+#define __LDREXH (uint16_t)__builtin_arm_ldrex
+
+
+/**
+ \brief LDR Exclusive (32 bit)
+ \details Executes a exclusive LDR instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+#define __LDREXW (uint32_t)__builtin_arm_ldrex
+
+
+/**
+ \brief STR Exclusive (8 bit)
+ \details Executes a exclusive STR instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STREXB (uint32_t)__builtin_arm_strex
+
+
+/**
+ \brief STR Exclusive (16 bit)
+ \details Executes a exclusive STR instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STREXH (uint32_t)__builtin_arm_strex
+
+
+/**
+ \brief STR Exclusive (32 bit)
+ \details Executes a exclusive STR instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STREXW (uint32_t)__builtin_arm_strex
+
+
+/**
+ \brief Remove the exclusive lock
+ \details Removes the exclusive lock which is created by LDREX.
+ */
+#define __CLREX __builtin_arm_clrex
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) )
+
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+#define __SSAT __builtin_arm_ssat
+
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+#define __USAT __builtin_arm_usat
+
+
+/**
+ \brief Rotate Right with Extend (32 bit)
+ \details Moves each bit of a bitstring right by one bit.
+ The carry input is shifted in at the left end of the bitstring.
+ \param [in] value Value to rotate
+ \return Rotated value
+ */
+__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value)
+{
+ uint32_t result;
+
+ __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+ return(result);
+}
+
+
+/**
+ \brief LDRT Unprivileged (8 bit)
+ \details Executes a Unprivileged LDRT instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) );
+ return ((uint8_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDRT Unprivileged (16 bit)
+ \details Executes a Unprivileged LDRT instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) );
+ return ((uint16_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDRT Unprivileged (32 bit)
+ \details Executes a Unprivileged LDRT instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) );
+ return(result);
+}
+
+
+/**
+ \brief STRT Unprivileged (8 bit)
+ \details Executes a Unprivileged STRT instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)
+{
+ __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );
+}
+
+
+/**
+ \brief STRT Unprivileged (16 bit)
+ \details Executes a Unprivileged STRT instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)
+{
+ __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );
+}
+
+
+/**
+ \brief STRT Unprivileged (32 bit)
+ \details Executes a Unprivileged STRT instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr)
+{
+ __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) );
+}
+
+#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)
+{
+ if ((sat >= 1U) && (sat <= 32U))
+ {
+ const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
+ const int32_t min = -1 - max ;
+ if (val > max)
+ {
+ return max;
+ }
+ else if (val < min)
+ {
+ return min;
+ }
+ }
+ return val;
+}
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat)
+{
+ if (sat <= 31U)
+ {
+ const uint32_t max = ((1U << sat) - 1U);
+ if (val > (int32_t)max)
+ {
+ return max;
+ }
+ else if (val < 0)
+ {
+ return 0U;
+ }
+ }
+ return (uint32_t)val;
+}
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) )
+
+/**
+ \brief Load-Acquire (8 bit)
+ \details Executes a LDAB instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint8_t) result);
+}
+
+
+/**
+ \brief Load-Acquire (16 bit)
+ \details Executes a LDAH instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint16_t) result);
+}
+
+
+/**
+ \brief Load-Acquire (32 bit)
+ \details Executes a LDA instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return(result);
+}
+
+
+/**
+ \brief Store-Release (8 bit)
+ \details Executes a STLB instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr)
+{
+ __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Store-Release (16 bit)
+ \details Executes a STLH instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr)
+{
+ __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Store-Release (32 bit)
+ \details Executes a STL instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr)
+{
+ __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Load-Acquire Exclusive (8 bit)
+ \details Executes a LDAB exclusive instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+#define __LDAEXB (uint8_t)__builtin_arm_ldaex
+
+
+/**
+ \brief Load-Acquire Exclusive (16 bit)
+ \details Executes a LDAH exclusive instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+#define __LDAEXH (uint16_t)__builtin_arm_ldaex
+
+
+/**
+ \brief Load-Acquire Exclusive (32 bit)
+ \details Executes a LDA exclusive instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+#define __LDAEX (uint32_t)__builtin_arm_ldaex
+
+
+/**
+ \brief Store-Release Exclusive (8 bit)
+ \details Executes a STLB exclusive instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STLEXB (uint32_t)__builtin_arm_stlex
+
+
+/**
+ \brief Store-Release Exclusive (16 bit)
+ \details Executes a STLH exclusive instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STLEXH (uint32_t)__builtin_arm_stlex
+
+
+/**
+ \brief Store-Release Exclusive (32 bit)
+ \details Executes a STL exclusive instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+#define __STLEX (uint32_t)__builtin_arm_stlex
+
+#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \
+ (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+
+/* ################### Compiler specific Intrinsics ########################### */
+/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
+ Access to dedicated SIMD instructions
+ @{
+*/
+
+#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
+
+#define __SADD8 __builtin_arm_sadd8
+#define __QADD8 __builtin_arm_qadd8
+#define __SHADD8 __builtin_arm_shadd8
+#define __UADD8 __builtin_arm_uadd8
+#define __UQADD8 __builtin_arm_uqadd8
+#define __UHADD8 __builtin_arm_uhadd8
+#define __SSUB8 __builtin_arm_ssub8
+#define __QSUB8 __builtin_arm_qsub8
+#define __SHSUB8 __builtin_arm_shsub8
+#define __USUB8 __builtin_arm_usub8
+#define __UQSUB8 __builtin_arm_uqsub8
+#define __UHSUB8 __builtin_arm_uhsub8
+#define __SADD16 __builtin_arm_sadd16
+#define __QADD16 __builtin_arm_qadd16
+#define __SHADD16 __builtin_arm_shadd16
+#define __UADD16 __builtin_arm_uadd16
+#define __UQADD16 __builtin_arm_uqadd16
+#define __UHADD16 __builtin_arm_uhadd16
+#define __SSUB16 __builtin_arm_ssub16
+#define __QSUB16 __builtin_arm_qsub16
+#define __SHSUB16 __builtin_arm_shsub16
+#define __USUB16 __builtin_arm_usub16
+#define __UQSUB16 __builtin_arm_uqsub16
+#define __UHSUB16 __builtin_arm_uhsub16
+#define __SASX __builtin_arm_sasx
+#define __QASX __builtin_arm_qasx
+#define __SHASX __builtin_arm_shasx
+#define __UASX __builtin_arm_uasx
+#define __UQASX __builtin_arm_uqasx
+#define __UHASX __builtin_arm_uhasx
+#define __SSAX __builtin_arm_ssax
+#define __QSAX __builtin_arm_qsax
+#define __SHSAX __builtin_arm_shsax
+#define __USAX __builtin_arm_usax
+#define __UQSAX __builtin_arm_uqsax
+#define __UHSAX __builtin_arm_uhsax
+#define __USAD8 __builtin_arm_usad8
+#define __USADA8 __builtin_arm_usada8
+#define __SSAT16 __builtin_arm_ssat16
+#define __USAT16 __builtin_arm_usat16
+#define __UXTB16 __builtin_arm_uxtb16
+#define __UXTAB16 __builtin_arm_uxtab16
+#define __SXTB16 __builtin_arm_sxtb16
+#define __SXTAB16 __builtin_arm_sxtab16
+#define __SMUAD __builtin_arm_smuad
+#define __SMUADX __builtin_arm_smuadx
+#define __SMLAD __builtin_arm_smlad
+#define __SMLADX __builtin_arm_smladx
+#define __SMLALD __builtin_arm_smlald
+#define __SMLALDX __builtin_arm_smlaldx
+#define __SMUSD __builtin_arm_smusd
+#define __SMUSDX __builtin_arm_smusdx
+#define __SMLSD __builtin_arm_smlsd
+#define __SMLSDX __builtin_arm_smlsdx
+#define __SMLSLD __builtin_arm_smlsld
+#define __SMLSLDX __builtin_arm_smlsldx
+#define __SEL __builtin_arm_sel
+#define __QADD __builtin_arm_qadd
+#define __QSUB __builtin_arm_qsub
+
+#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
+ ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
+
+#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
+ ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
+
+#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2))
+
+__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
+{
+ int32_t result;
+
+ __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+#endif /* (__ARM_FEATURE_DSP == 1) */
+/*@} end of group CMSIS_SIMD_intrinsics */
+
+
+#endif /* __CMSIS_ARMCLANG_H */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_compiler.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_compiler.h
new file mode 100644
index 000000000..adbf296f1
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_compiler.h
@@ -0,0 +1,283 @@
+/**************************************************************************//**
+ * @file cmsis_compiler.h
+ * @brief CMSIS compiler generic header file
+ * @version V5.1.0
+ * @date 09. October 2018
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2018 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CMSIS_COMPILER_H
+#define __CMSIS_COMPILER_H
+
+#include
+
+/*
+ * Arm Compiler 4/5
+ */
+#if defined ( __CC_ARM )
+ #include "cmsis_armcc.h"
+
+
+/*
+ * Arm Compiler 6.6 LTM (armclang)
+ */
+#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)
+ #include "cmsis_armclang_ltm.h"
+
+ /*
+ * Arm Compiler above 6.10.1 (armclang)
+ */
+#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)
+ #include "cmsis_armclang.h"
+
+
+/*
+ * GNU Compiler
+ */
+#elif defined ( __GNUC__ )
+ #include "cmsis_gcc.h"
+
+
+/*
+ * IAR Compiler
+ */
+#elif defined ( __ICCARM__ )
+ #include
+
+
+/*
+ * TI Arm Compiler
+ */
+#elif defined ( __TI_ARM__ )
+ #include
+
+ #ifndef __ASM
+ #define __ASM __asm
+ #endif
+ #ifndef __INLINE
+ #define __INLINE inline
+ #endif
+ #ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static inline
+ #endif
+ #ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __STATIC_INLINE
+ #endif
+ #ifndef __NO_RETURN
+ #define __NO_RETURN __attribute__((noreturn))
+ #endif
+ #ifndef __USED
+ #define __USED __attribute__((used))
+ #endif
+ #ifndef __WEAK
+ #define __WEAK __attribute__((weak))
+ #endif
+ #ifndef __PACKED
+ #define __PACKED __attribute__((packed))
+ #endif
+ #ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT struct __attribute__((packed))
+ #endif
+ #ifndef __PACKED_UNION
+ #define __PACKED_UNION union __attribute__((packed))
+ #endif
+ #ifndef __UNALIGNED_UINT32 /* deprecated */
+ struct __attribute__((packed)) T_UINT32 { uint32_t v; };
+ #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT16_WRITE
+ __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
+ #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT16_READ
+ __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
+ #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT32_WRITE
+ __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
+ #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT32_READ
+ __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
+ #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __ALIGNED
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+ #endif
+ #ifndef __RESTRICT
+ #define __RESTRICT __restrict
+ #endif
+ #ifndef __COMPILER_BARRIER
+ #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
+ #define __COMPILER_BARRIER() (void)0
+ #endif
+
+
+/*
+ * TASKING Compiler
+ */
+#elif defined ( __TASKING__ )
+ /*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all intrinsics,
+ * Including the CMSIS ones.
+ */
+
+ #ifndef __ASM
+ #define __ASM __asm
+ #endif
+ #ifndef __INLINE
+ #define __INLINE inline
+ #endif
+ #ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static inline
+ #endif
+ #ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __STATIC_INLINE
+ #endif
+ #ifndef __NO_RETURN
+ #define __NO_RETURN __attribute__((noreturn))
+ #endif
+ #ifndef __USED
+ #define __USED __attribute__((used))
+ #endif
+ #ifndef __WEAK
+ #define __WEAK __attribute__((weak))
+ #endif
+ #ifndef __PACKED
+ #define __PACKED __packed__
+ #endif
+ #ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT struct __packed__
+ #endif
+ #ifndef __PACKED_UNION
+ #define __PACKED_UNION union __packed__
+ #endif
+ #ifndef __UNALIGNED_UINT32 /* deprecated */
+ struct __packed__ T_UINT32 { uint32_t v; };
+ #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT16_WRITE
+ __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
+ #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT16_READ
+ __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
+ #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT32_WRITE
+ __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
+ #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT32_READ
+ __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
+ #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __ALIGNED
+ #define __ALIGNED(x) __align(x)
+ #endif
+ #ifndef __RESTRICT
+ #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
+ #define __RESTRICT
+ #endif
+ #ifndef __COMPILER_BARRIER
+ #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
+ #define __COMPILER_BARRIER() (void)0
+ #endif
+
+
+/*
+ * COSMIC Compiler
+ */
+#elif defined ( __CSMC__ )
+ #include
+
+ #ifndef __ASM
+ #define __ASM _asm
+ #endif
+ #ifndef __INLINE
+ #define __INLINE inline
+ #endif
+ #ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static inline
+ #endif
+ #ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __STATIC_INLINE
+ #endif
+ #ifndef __NO_RETURN
+ // NO RETURN is automatically detected hence no warning here
+ #define __NO_RETURN
+ #endif
+ #ifndef __USED
+ #warning No compiler specific solution for __USED. __USED is ignored.
+ #define __USED
+ #endif
+ #ifndef __WEAK
+ #define __WEAK __weak
+ #endif
+ #ifndef __PACKED
+ #define __PACKED @packed
+ #endif
+ #ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT @packed struct
+ #endif
+ #ifndef __PACKED_UNION
+ #define __PACKED_UNION @packed union
+ #endif
+ #ifndef __UNALIGNED_UINT32 /* deprecated */
+ @packed struct T_UINT32 { uint32_t v; };
+ #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT16_WRITE
+ __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
+ #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT16_READ
+ __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
+ #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __UNALIGNED_UINT32_WRITE
+ __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
+ #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
+ #endif
+ #ifndef __UNALIGNED_UINT32_READ
+ __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
+ #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
+ #endif
+ #ifndef __ALIGNED
+ #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
+ #define __ALIGNED(x)
+ #endif
+ #ifndef __RESTRICT
+ #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
+ #define __RESTRICT
+ #endif
+ #ifndef __COMPILER_BARRIER
+ #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.
+ #define __COMPILER_BARRIER() (void)0
+ #endif
+
+
+#else
+ #error Unknown compiler.
+#endif
+
+
+#endif /* __CMSIS_COMPILER_H */
+
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_gcc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_gcc.h
new file mode 100644
index 000000000..a2778f58e
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_gcc.h
@@ -0,0 +1,2177 @@
+/**************************************************************************//**
+ * @file cmsis_gcc.h
+ * @brief CMSIS compiler GCC header file
+ * @version V5.3.0
+ * @date 26. March 2020
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CMSIS_GCC_H
+#define __CMSIS_GCC_H
+
+/* ignore some GCC warnings */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+
+/* Fallback for __has_builtin */
+#ifndef __has_builtin
+ #define __has_builtin(x) (0)
+#endif
+
+/* CMSIS compiler specific defines */
+#ifndef __ASM
+ #define __ASM __asm
+#endif
+#ifndef __INLINE
+ #define __INLINE inline
+#endif
+#ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static inline
+#endif
+#ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline
+#endif
+#ifndef __NO_RETURN
+ #define __NO_RETURN __attribute__((__noreturn__))
+#endif
+#ifndef __USED
+ #define __USED __attribute__((used))
+#endif
+#ifndef __WEAK
+ #define __WEAK __attribute__((weak))
+#endif
+#ifndef __PACKED
+ #define __PACKED __attribute__((packed, aligned(1)))
+#endif
+#ifndef __PACKED_STRUCT
+ #define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
+#endif
+#ifndef __PACKED_UNION
+ #define __PACKED_UNION union __attribute__((packed, aligned(1)))
+#endif
+#ifndef __UNALIGNED_UINT32 /* deprecated */
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpacked"
+ #pragma GCC diagnostic ignored "-Wattributes"
+ struct __attribute__((packed)) T_UINT32 { uint32_t v; };
+ #pragma GCC diagnostic pop
+ #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
+#endif
+#ifndef __UNALIGNED_UINT16_WRITE
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpacked"
+ #pragma GCC diagnostic ignored "-Wattributes"
+ __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
+ #pragma GCC diagnostic pop
+ #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
+#endif
+#ifndef __UNALIGNED_UINT16_READ
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpacked"
+ #pragma GCC diagnostic ignored "-Wattributes"
+ __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
+ #pragma GCC diagnostic pop
+ #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
+#endif
+#ifndef __UNALIGNED_UINT32_WRITE
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpacked"
+ #pragma GCC diagnostic ignored "-Wattributes"
+ __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
+ #pragma GCC diagnostic pop
+ #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
+#endif
+#ifndef __UNALIGNED_UINT32_READ
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpacked"
+ #pragma GCC diagnostic ignored "-Wattributes"
+ __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
+ #pragma GCC diagnostic pop
+ #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
+#endif
+#ifndef __ALIGNED
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+#endif
+#ifndef __RESTRICT
+ #define __RESTRICT __restrict
+#endif
+#ifndef __COMPILER_BARRIER
+ #define __COMPILER_BARRIER() __ASM volatile("":::"memory")
+#endif
+
+/* ######################### Startup and Lowlevel Init ######################## */
+
+#ifndef __PROGRAM_START
+
+/**
+ \brief Initializes data and bss sections
+ \details This default implementations initialized all data and additional bss
+ sections relying on .copy.table and .zero.table specified properly
+ in the used linker script.
+
+ */
+__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void)
+{
+ extern void _start(void) __NO_RETURN;
+
+ typedef struct {
+ uint32_t const* src;
+ uint32_t* dest;
+ uint32_t wlen;
+ } __copy_table_t;
+
+ typedef struct {
+ uint32_t* dest;
+ uint32_t wlen;
+ } __zero_table_t;
+
+ extern const __copy_table_t __copy_table_start__;
+ extern const __copy_table_t __copy_table_end__;
+ extern const __zero_table_t __zero_table_start__;
+ extern const __zero_table_t __zero_table_end__;
+
+ for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) {
+ for(uint32_t i=0u; iwlen; ++i) {
+ pTable->dest[i] = pTable->src[i];
+ }
+ }
+
+ for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) {
+ for(uint32_t i=0u; iwlen; ++i) {
+ pTable->dest[i] = 0u;
+ }
+ }
+
+ _start();
+}
+
+#define __PROGRAM_START __cmsis_start
+#endif
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP __StackTop
+#endif
+
+#ifndef __STACK_LIMIT
+#define __STACK_LIMIT __StackLimit
+#endif
+
+#ifndef __VECTOR_TABLE
+#define __VECTOR_TABLE __Vectors
+#endif
+
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
+#endif
+
+/* ########################### Core Function Access ########################### */
+/** \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+ @{
+ */
+
+/**
+ \brief Enable IRQ Interrupts
+ \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+__STATIC_FORCEINLINE void __enable_irq(void)
+{
+ __ASM volatile ("cpsie i" : : : "memory");
+}
+
+
+/**
+ \brief Disable IRQ Interrupts
+ \details Disables IRQ interrupts by setting the I-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+__STATIC_FORCEINLINE void __disable_irq(void)
+{
+ __ASM volatile ("cpsid i" : : : "memory");
+}
+
+
+/**
+ \brief Get Control Register
+ \details Returns the content of the Control Register.
+ \return Control Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_CONTROL(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, control" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Control Register (non-secure)
+ \details Returns the content of the non-secure Control Register when in secure mode.
+ \return non-secure Control Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, control_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Control Register
+ \details Writes the given value to the Control Register.
+ \param [in] control Control Register value to set
+ */
+__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control)
+{
+ __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Control Register (non-secure)
+ \details Writes the given value to the non-secure Control Register when in secure state.
+ \param [in] control Control Register value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control)
+{
+ __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory");
+}
+#endif
+
+
+/**
+ \brief Get IPSR Register
+ \details Returns the content of the IPSR Register.
+ \return IPSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_IPSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get APSR Register
+ \details Returns the content of the APSR Register.
+ \return APSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_APSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, apsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get xPSR Register
+ \details Returns the content of the xPSR Register.
+ \return xPSR Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_xPSR(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Get Process Stack Pointer
+ \details Returns the current value of the Process Stack Pointer (PSP).
+ \return PSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PSP(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, psp" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Process Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
+ \return PSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, psp_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Process Stack Pointer
+ \details Assigns the given value to the Process Stack Pointer (PSP).
+ \param [in] topOfProcStack Process Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack)
+{
+ __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : );
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Process Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
+ \param [in] topOfProcStack Process Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)
+{
+ __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : );
+}
+#endif
+
+
+/**
+ \brief Get Main Stack Pointer
+ \details Returns the current value of the Main Stack Pointer (MSP).
+ \return MSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_MSP(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, msp" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Main Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
+ \return MSP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, msp_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Main Stack Pointer
+ \details Assigns the given value to the Main Stack Pointer (MSP).
+ \param [in] topOfMainStack Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack)
+{
+ __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : );
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Main Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
+ \param [in] topOfMainStack Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)
+{
+ __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : );
+}
+#endif
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Stack Pointer (non-secure)
+ \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.
+ \return SP Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, sp_ns" : "=r" (result) );
+ return(result);
+}
+
+
+/**
+ \brief Set Stack Pointer (non-secure)
+ \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.
+ \param [in] topOfStack Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack)
+{
+ __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : );
+}
+#endif
+
+
+/**
+ \brief Get Priority Mask
+ \details Returns the current state of the priority mask bit from the Priority Mask Register.
+ \return Priority Mask value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, primask" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Priority Mask (non-secure)
+ \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.
+ \return Priority Mask value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, primask_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Priority Mask
+ \details Assigns the given value to the Priority Mask Register.
+ \param [in] priMask Priority Mask
+ */
+__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask)
+{
+ __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Priority Mask (non-secure)
+ \details Assigns the given value to the non-secure Priority Mask Register when in secure state.
+ \param [in] priMask Priority Mask
+ */
+__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)
+{
+ __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory");
+}
+#endif
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) )
+/**
+ \brief Enable FIQ
+ \details Enables FIQ interrupts by clearing the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+__STATIC_FORCEINLINE void __enable_fault_irq(void)
+{
+ __ASM volatile ("cpsie f" : : : "memory");
+}
+
+
+/**
+ \brief Disable FIQ
+ \details Disables FIQ interrupts by setting the F-bit in the CPSR.
+ Can only be executed in Privileged modes.
+ */
+__STATIC_FORCEINLINE void __disable_fault_irq(void)
+{
+ __ASM volatile ("cpsid f" : : : "memory");
+}
+
+
+/**
+ \brief Get Base Priority
+ \details Returns the current value of the Base Priority register.
+ \return Base Priority register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, basepri" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Base Priority (non-secure)
+ \details Returns the current value of the non-secure Base Priority register when in secure state.
+ \return Base Priority register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Base Priority
+ \details Assigns the given value to the Base Priority register.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Base Priority (non-secure)
+ \details Assigns the given value to the non-secure Base Priority register when in secure state.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory");
+}
+#endif
+
+
+/**
+ \brief Set Base Priority with condition
+ \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
+ or the new value increases the BASEPRI priority level.
+ \param [in] basePri Base Priority value to set
+ */
+__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri)
+{
+ __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory");
+}
+
+
+/**
+ \brief Get Fault Mask
+ \details Returns the current value of the Fault Mask register.
+ \return Fault Mask register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
+ return(result);
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Fault Mask (non-secure)
+ \details Returns the current value of the non-secure Fault Mask register when in secure state.
+ \return Fault Mask register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void)
+{
+ uint32_t result;
+
+ __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) );
+ return(result);
+}
+#endif
+
+
+/**
+ \brief Set Fault Mask
+ \details Assigns the given value to the Fault Mask register.
+ \param [in] faultMask Fault Mask value to set
+ */
+__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+ __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Fault Mask (non-secure)
+ \details Assigns the given value to the non-secure Fault Mask register when in secure state.
+ \param [in] faultMask Fault Mask value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)
+{
+ __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory");
+}
+#endif
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
+
+/**
+ \brief Get Process Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always in non-secure
+ mode.
+
+ \details Returns the current value of the Process Stack Pointer Limit (PSPLIM).
+ \return PSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, psplim" : "=r" (result) );
+ return result;
+#endif
+}
+
+#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Process Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always.
+
+ \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
+ \return PSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) );
+ return result;
+#endif
+}
+#endif
+
+
+/**
+ \brief Set Process Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored in non-secure
+ mode.
+
+ \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).
+ \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)ProcStackPtrLimit;
+#else
+ __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit));
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Process Stack Pointer (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored.
+
+ \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.
+ \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)ProcStackPtrLimit;
+#else
+ __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit));
+#endif
+}
+#endif
+
+
+/**
+ \brief Get Main Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always in non-secure
+ mode.
+
+ \details Returns the current value of the Main Stack Pointer Limit (MSPLIM).
+ \return MSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, msplim" : "=r" (result) );
+ return result;
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Get Main Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence zero is returned always.
+
+ \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.
+ \return MSPLIM Register value
+ */
+__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ return 0U;
+#else
+ uint32_t result;
+ __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) );
+ return result;
+#endif
+}
+#endif
+
+
+/**
+ \brief Set Main Stack Pointer Limit
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored in non-secure
+ mode.
+
+ \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).
+ \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set
+ */
+__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ (void)MainStackPtrLimit;
+#else
+ __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit));
+#endif
+}
+
+
+#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))
+/**
+ \brief Set Main Stack Pointer Limit (non-secure)
+ Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure
+ Stack Pointer Limit register hence the write is silently ignored.
+
+ \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.
+ \param [in] MainStackPtrLimit Main Stack Pointer value to set
+ */
+__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)
+{
+#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ (void)MainStackPtrLimit;
+#else
+ __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit));
+#endif
+}
+#endif
+
+#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */
+
+
+/**
+ \brief Get FPSCR
+ \details Returns the current value of the Floating Point Status/Control register.
+ \return Floating Point Status/Control register value
+ */
+__STATIC_FORCEINLINE uint32_t __get_FPSCR(void)
+{
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+#if __has_builtin(__builtin_arm_get_fpscr)
+// Re-enable using built-in when GCC has been fixed
+// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)
+ /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */
+ return __builtin_arm_get_fpscr();
+#else
+ uint32_t result;
+
+ __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
+ return(result);
+#endif
+#else
+ return(0U);
+#endif
+}
+
+
+/**
+ \brief Set FPSCR
+ \details Assigns the given value to the Floating Point Status/Control register.
+ \param [in] fpscr Floating Point Status/Control value to set
+ */
+__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+#if __has_builtin(__builtin_arm_set_fpscr)
+// Re-enable using built-in when GCC has been fixed
+// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)
+ /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */
+ __builtin_arm_set_fpscr(fpscr);
+#else
+ __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory");
+#endif
+#else
+ (void)fpscr;
+#endif
+}
+
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+/* ########################## Core Instruction Access ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+ Access to dedicated instructions
+ @{
+*/
+
+/* Define macros for porting to both thumb1 and thumb2.
+ * For thumb1, use low register (r0-r7), specified by constraint "l"
+ * Otherwise, use general registers, specified by constraint "r" */
+#if defined (__thumb__) && !defined (__thumb2__)
+#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
+#define __CMSIS_GCC_RW_REG(r) "+l" (r)
+#define __CMSIS_GCC_USE_REG(r) "l" (r)
+#else
+#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
+#define __CMSIS_GCC_RW_REG(r) "+r" (r)
+#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#endif
+
+/**
+ \brief No Operation
+ \details No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP() __ASM volatile ("nop")
+
+/**
+ \brief Wait For Interrupt
+ \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
+ */
+#define __WFI() __ASM volatile ("wfi":::"memory")
+
+
+/**
+ \brief Wait For Event
+ \details Wait For Event is a hint instruction that permits the processor to enter
+ a low-power state until one of a number of events occurs.
+ */
+#define __WFE() __ASM volatile ("wfe":::"memory")
+
+
+/**
+ \brief Send Event
+ \details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV() __ASM volatile ("sev")
+
+
+/**
+ \brief Instruction Synchronization Barrier
+ \details Instruction Synchronization Barrier flushes the pipeline in the processor,
+ so that all instructions following the ISB are fetched from cache or memory,
+ after the instruction has been completed.
+ */
+__STATIC_FORCEINLINE void __ISB(void)
+{
+ __ASM volatile ("isb 0xF":::"memory");
+}
+
+
+/**
+ \brief Data Synchronization Barrier
+ \details Acts as a special kind of Data Memory Barrier.
+ It completes when all explicit memory accesses before this instruction complete.
+ */
+__STATIC_FORCEINLINE void __DSB(void)
+{
+ __ASM volatile ("dsb 0xF":::"memory");
+}
+
+
+/**
+ \brief Data Memory Barrier
+ \details Ensures the apparent order of the explicit memory operations before
+ and after the instruction, without ensuring their completion.
+ */
+__STATIC_FORCEINLINE void __DMB(void)
+{
+ __ASM volatile ("dmb 0xF":::"memory");
+}
+
+
+/**
+ \brief Reverse byte order (32 bit)
+ \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+__STATIC_FORCEINLINE uint32_t __REV(uint32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+ return __builtin_bswap32(value);
+#else
+ uint32_t result;
+
+ __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+ return result;
+#endif
+}
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value)
+{
+ uint32_t result;
+
+ __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+ return result;
+}
+
+
+/**
+ \brief Reverse byte order (16 bit)
+ \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+__STATIC_FORCEINLINE int16_t __REVSH(int16_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+ return (int16_t)__builtin_bswap16(value);
+#else
+ int16_t result;
+
+ __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+ return result;
+#endif
+}
+
+
+/**
+ \brief Rotate Right in unsigned value (32 bit)
+ \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+ \param [in] op1 Value to rotate
+ \param [in] op2 Number of Bits to rotate
+ \return Rotated value
+ */
+__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+{
+ op2 %= 32U;
+ if (op2 == 0U)
+ {
+ return op1;
+ }
+ return (op1 >> op2) | (op1 << (32U - op2));
+}
+
+
+/**
+ \brief Breakpoint
+ \details Causes the processor to enter Debug state.
+ Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+ \param [in] value is ignored by the processor.
+ If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value) __ASM volatile ("bkpt "#value)
+
+
+/**
+ \brief Reverse bit order of value
+ \details Reverses the bit order of the given value.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value)
+{
+ uint32_t result;
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) )
+ __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) );
+#else
+ uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
+
+ result = value; /* r will be reversed bits of v; first get LSB of v */
+ for (value >>= 1U; value != 0U; value >>= 1U)
+ {
+ result <<= 1U;
+ result |= value & 1U;
+ s--;
+ }
+ result <<= s; /* shift when v's highest bits are zero */
+#endif
+ return result;
+}
+
+
+/**
+ \brief Count leading zeros
+ \details Counts the number of leading zeros of a data value.
+ \param [in] value Value to count the leading zeros
+ \return number of leading zeros in value
+ */
+__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value)
+{
+ /* Even though __builtin_clz produces a CLZ instruction on ARM, formally
+ __builtin_clz(0) is undefined behaviour, so handle this case specially.
+ This guarantees ARM-compatible results if happening to compile on a non-ARM
+ target, and ensures the compiler doesn't decide to activate any
+ optimisations using the logic "value was passed to __builtin_clz, so it
+ is non-zero".
+ ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a
+ single CLZ instruction.
+ */
+ if (value == 0U)
+ {
+ return 32U;
+ }
+ return __builtin_clz(value);
+}
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
+/**
+ \brief LDR Exclusive (8 bit)
+ \details Executes a exclusive LDR instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr)
+{
+ uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+ __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+ /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+ accepted by assembler. So has to use following less efficient pattern.
+ */
+ __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+ return ((uint8_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDR Exclusive (16 bit)
+ \details Executes a exclusive LDR instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr)
+{
+ uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+ __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+ /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+ accepted by assembler. So has to use following less efficient pattern.
+ */
+ __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+ return ((uint16_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDR Exclusive (32 bit)
+ \details Executes a exclusive LDR instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
+ return(result);
+}
+
+
+/**
+ \brief STR Exclusive (8 bit)
+ \details Executes a exclusive STR instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
+{
+ uint32_t result;
+
+ __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
+ return(result);
+}
+
+
+/**
+ \brief STR Exclusive (16 bit)
+ \details Executes a exclusive STR instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
+{
+ uint32_t result;
+
+ __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
+ return(result);
+}
+
+
+/**
+ \brief STR Exclusive (32 bit)
+ \details Executes a exclusive STR instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
+{
+ uint32_t result;
+
+ __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+ return(result);
+}
+
+
+/**
+ \brief Remove the exclusive lock
+ \details Removes the exclusive lock which is created by LDREX.
+ */
+__STATIC_FORCEINLINE void __CLREX(void)
+{
+ __ASM volatile ("clrex" ::: "memory");
+}
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) )
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] ARG1 Value to be saturated
+ \param [in] ARG2 Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+#define __SSAT(ARG1, ARG2) \
+__extension__ \
+({ \
+ int32_t __RES, __ARG1 = (ARG1); \
+ __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \
+ __RES; \
+ })
+
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] ARG1 Value to be saturated
+ \param [in] ARG2 Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+#define __USAT(ARG1, ARG2) \
+ __extension__ \
+({ \
+ uint32_t __RES, __ARG1 = (ARG1); \
+ __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \
+ __RES; \
+ })
+
+
+/**
+ \brief Rotate Right with Extend (32 bit)
+ \details Moves each bit of a bitstring right by one bit.
+ The carry input is shifted in at the left end of the bitstring.
+ \param [in] value Value to rotate
+ \return Rotated value
+ */
+__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value)
+{
+ uint32_t result;
+
+ __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+ return(result);
+}
+
+
+/**
+ \brief LDRT Unprivileged (8 bit)
+ \details Executes a Unprivileged LDRT instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+ __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) );
+#else
+ /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+ accepted by assembler. So has to use following less efficient pattern.
+ */
+ __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" );
+#endif
+ return ((uint8_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDRT Unprivileged (16 bit)
+ \details Executes a Unprivileged LDRT instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+ __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) );
+#else
+ /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+ accepted by assembler. So has to use following less efficient pattern.
+ */
+ __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" );
+#endif
+ return ((uint16_t) result); /* Add explicit type cast here */
+}
+
+
+/**
+ \brief LDRT Unprivileged (32 bit)
+ \details Executes a Unprivileged LDRT instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) );
+ return(result);
+}
+
+
+/**
+ \brief STRT Unprivileged (8 bit)
+ \details Executes a Unprivileged STRT instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)
+{
+ __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );
+}
+
+
+/**
+ \brief STRT Unprivileged (16 bit)
+ \details Executes a Unprivileged STRT instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)
+{
+ __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) );
+}
+
+
+/**
+ \brief STRT Unprivileged (32 bit)
+ \details Executes a Unprivileged STRT instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr)
+{
+ __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) );
+}
+
+#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */
+
+/**
+ \brief Signed Saturate
+ \details Saturates a signed value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (1..32)
+ \return Saturated value
+ */
+__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)
+{
+ if ((sat >= 1U) && (sat <= 32U))
+ {
+ const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
+ const int32_t min = -1 - max ;
+ if (val > max)
+ {
+ return max;
+ }
+ else if (val < min)
+ {
+ return min;
+ }
+ }
+ return val;
+}
+
+/**
+ \brief Unsigned Saturate
+ \details Saturates an unsigned value.
+ \param [in] value Value to be saturated
+ \param [in] sat Bit position to saturate to (0..31)
+ \return Saturated value
+ */
+__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat)
+{
+ if (sat <= 31U)
+ {
+ const uint32_t max = ((1U << sat) - 1U);
+ if (val > (int32_t)max)
+ {
+ return max;
+ }
+ else if (val < 0)
+ {
+ return 0U;
+ }
+ }
+ return (uint32_t)val;
+}
+
+#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
+ (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */
+
+
+#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
+/**
+ \brief Load-Acquire (8 bit)
+ \details Executes a LDAB instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint8_t) result);
+}
+
+
+/**
+ \brief Load-Acquire (16 bit)
+ \details Executes a LDAH instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint16_t) result);
+}
+
+
+/**
+ \brief Load-Acquire (32 bit)
+ \details Executes a LDA instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return(result);
+}
+
+
+/**
+ \brief Store-Release (8 bit)
+ \details Executes a STLB instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr)
+{
+ __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Store-Release (16 bit)
+ \details Executes a STLH instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr)
+{
+ __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Store-Release (32 bit)
+ \details Executes a STL instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ */
+__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr)
+{
+ __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+}
+
+
+/**
+ \brief Load-Acquire Exclusive (8 bit)
+ \details Executes a LDAB exclusive instruction for 8 bit value.
+ \param [in] ptr Pointer to data
+ \return value of type uint8_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint8_t) result);
+}
+
+
+/**
+ \brief Load-Acquire Exclusive (16 bit)
+ \details Executes a LDAH exclusive instruction for 16 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint16_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return ((uint16_t) result);
+}
+
+
+/**
+ \brief Load-Acquire Exclusive (32 bit)
+ \details Executes a LDA exclusive instruction for 32 bit values.
+ \param [in] ptr Pointer to data
+ \return value of type uint32_t at (*ptr)
+ */
+__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" );
+ return(result);
+}
+
+
+/**
+ \brief Store-Release Exclusive (8 bit)
+ \details Executes a STLB exclusive instruction for 8 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+ return(result);
+}
+
+
+/**
+ \brief Store-Release Exclusive (16 bit)
+ \details Executes a STLH exclusive instruction for 16 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+ return(result);
+}
+
+
+/**
+ \brief Store-Release Exclusive (32 bit)
+ \details Executes a STL exclusive instruction for 32 bit values.
+ \param [in] value Value to store
+ \param [in] ptr Pointer to location
+ \return 0 Function succeeded
+ \return 1 Function failed
+ */
+__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
+{
+ uint32_t result;
+
+ __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" );
+ return(result);
+}
+
+#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+
+/* ################### Compiler specific Intrinsics ########################### */
+/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
+ Access to dedicated SIMD instructions
+ @{
+*/
+
+#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
+
+__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+
+__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+
+__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
+{
+ uint32_t result;
+
+ __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+#define __SSAT16(ARG1, ARG2) \
+({ \
+ int32_t __RES, __ARG1 = (ARG1); \
+ __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \
+ __RES; \
+ })
+
+#define __USAT16(ARG1, ARG2) \
+({ \
+ uint32_t __RES, __ARG1 = (ARG1); \
+ __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \
+ __RES; \
+ })
+
+__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1)
+{
+ uint32_t result;
+
+ __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1)
+{
+ uint32_t result;
+
+ __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate)
+{
+ uint32_t result;
+
+ __ASM ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) );
+
+ return result;
+}
+
+__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
+{
+ uint32_t result;
+
+ __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
+{
+ uint32_t result;
+
+ __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)
+{
+ union llreg_u{
+ uint32_t w32[2];
+ uint64_t w64;
+ } llr;
+ llr.w64 = acc;
+
+#ifndef __ARMEB__ /* Little endian */
+ __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
+#else /* Big endian */
+ __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#endif
+
+ return(llr.w64);
+}
+
+__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)
+{
+ union llreg_u{
+ uint32_t w32[2];
+ uint64_t w64;
+ } llr;
+ llr.w64 = acc;
+
+#ifndef __ARMEB__ /* Little endian */
+ __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
+#else /* Big endian */
+ __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#endif
+
+ return(llr.w64);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
+{
+ uint32_t result;
+
+ __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
+{
+ uint32_t result;
+
+ __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)
+{
+ union llreg_u{
+ uint32_t w32[2];
+ uint64_t w64;
+ } llr;
+ llr.w64 = acc;
+
+#ifndef __ARMEB__ /* Little endian */
+ __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
+#else /* Big endian */
+ __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#endif
+
+ return(llr.w64);
+}
+
+__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)
+{
+ union llreg_u{
+ uint32_t w32[2];
+ uint64_t w64;
+ } llr;
+ llr.w64 = acc;
+
+#ifndef __ARMEB__ /* Little endian */
+ __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
+#else /* Big endian */
+ __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#endif
+
+ return(llr.w64);
+}
+
+__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
+{
+ uint32_t result;
+
+ __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2)
+{
+ int32_t result;
+
+ __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2)
+{
+ int32_t result;
+
+ __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
+ return(result);
+}
+
+#if 0
+#define __PKHBT(ARG1,ARG2,ARG3) \
+({ \
+ uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
+ __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
+ __RES; \
+ })
+
+#define __PKHTB(ARG1,ARG2,ARG3) \
+({ \
+ uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
+ if (ARG3 == 0) \
+ __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
+ else \
+ __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
+ __RES; \
+ })
+#endif
+
+#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
+ ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
+
+#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
+ ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
+
+__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
+{
+ int32_t result;
+
+ __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) );
+ return(result);
+}
+
+#endif /* (__ARM_FEATURE_DSP == 1) */
+/*@} end of group CMSIS_SIMD_intrinsics */
+
+
+#pragma GCC diagnostic pop
+
+#endif /* __CMSIS_GCC_H */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_iccarm.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_iccarm.h
new file mode 100644
index 000000000..7eeffca5c
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_iccarm.h
@@ -0,0 +1,968 @@
+/**************************************************************************//**
+ * @file cmsis_iccarm.h
+ * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file
+ * @version V5.2.0
+ * @date 28. January 2020
+ ******************************************************************************/
+
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2017-2019 IAR Systems
+// Copyright (c) 2017-2019 Arm Limited. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+// Licensed under the Apache License, Version 2.0 (the "License")
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//------------------------------------------------------------------------------
+
+
+#ifndef __CMSIS_ICCARM_H__
+#define __CMSIS_ICCARM_H__
+
+#ifndef __ICCARM__
+ #error This file should only be compiled by ICCARM
+#endif
+
+#pragma system_include
+
+#define __IAR_FT _Pragma("inline=forced") __intrinsic
+
+#if (__VER__ >= 8000000)
+ #define __ICCARM_V8 1
+#else
+ #define __ICCARM_V8 0
+#endif
+
+#ifndef __ALIGNED
+ #if __ICCARM_V8
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+ #elif (__VER__ >= 7080000)
+ /* Needs IAR language extensions */
+ #define __ALIGNED(x) __attribute__((aligned(x)))
+ #else
+ #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
+ #define __ALIGNED(x)
+ #endif
+#endif
+
+
+/* Define compiler macros for CPU architecture, used in CMSIS 5.
+ */
+#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__
+/* Macros already defined */
+#else
+ #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
+ #define __ARM_ARCH_8M_MAIN__ 1
+ #elif defined(__ARM8M_BASELINE__)
+ #define __ARM_ARCH_8M_BASE__ 1
+ #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M'
+ #if __ARM_ARCH == 6
+ #define __ARM_ARCH_6M__ 1
+ #elif __ARM_ARCH == 7
+ #if __ARM_FEATURE_DSP
+ #define __ARM_ARCH_7EM__ 1
+ #else
+ #define __ARM_ARCH_7M__ 1
+ #endif
+ #endif /* __ARM_ARCH */
+ #endif /* __ARM_ARCH_PROFILE == 'M' */
+#endif
+
+/* Alternativ core deduction for older ICCARM's */
+#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \
+ !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__)
+ #if defined(__ARM6M__) && (__CORE__ == __ARM6M__)
+ #define __ARM_ARCH_6M__ 1
+ #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__)
+ #define __ARM_ARCH_7M__ 1
+ #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__)
+ #define __ARM_ARCH_7EM__ 1
+ #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__)
+ #define __ARM_ARCH_8M_BASE__ 1
+ #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__)
+ #define __ARM_ARCH_8M_MAIN__ 1
+ #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__)
+ #define __ARM_ARCH_8M_MAIN__ 1
+ #else
+ #error "Unknown target."
+ #endif
+#endif
+
+
+
+#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1
+ #define __IAR_M0_FAMILY 1
+#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1
+ #define __IAR_M0_FAMILY 1
+#else
+ #define __IAR_M0_FAMILY 0
+#endif
+
+
+#ifndef __ASM
+ #define __ASM __asm
+#endif
+
+#ifndef __COMPILER_BARRIER
+ #define __COMPILER_BARRIER() __ASM volatile("":::"memory")
+#endif
+
+#ifndef __INLINE
+ #define __INLINE inline
+#endif
+
+#ifndef __NO_RETURN
+ #if __ICCARM_V8
+ #define __NO_RETURN __attribute__((__noreturn__))
+ #else
+ #define __NO_RETURN _Pragma("object_attribute=__noreturn")
+ #endif
+#endif
+
+#ifndef __PACKED
+ #if __ICCARM_V8
+ #define __PACKED __attribute__((packed, aligned(1)))
+ #else
+ /* Needs IAR language extensions */
+ #define __PACKED __packed
+ #endif
+#endif
+
+#ifndef __PACKED_STRUCT
+ #if __ICCARM_V8
+ #define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
+ #else
+ /* Needs IAR language extensions */
+ #define __PACKED_STRUCT __packed struct
+ #endif
+#endif
+
+#ifndef __PACKED_UNION
+ #if __ICCARM_V8
+ #define __PACKED_UNION union __attribute__((packed, aligned(1)))
+ #else
+ /* Needs IAR language extensions */
+ #define __PACKED_UNION __packed union
+ #endif
+#endif
+
+#ifndef __RESTRICT
+ #if __ICCARM_V8
+ #define __RESTRICT __restrict
+ #else
+ /* Needs IAR language extensions */
+ #define __RESTRICT restrict
+ #endif
+#endif
+
+#ifndef __STATIC_INLINE
+ #define __STATIC_INLINE static inline
+#endif
+
+#ifndef __FORCEINLINE
+ #define __FORCEINLINE _Pragma("inline=forced")
+#endif
+
+#ifndef __STATIC_FORCEINLINE
+ #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE
+#endif
+
+#ifndef __UNALIGNED_UINT16_READ
+#pragma language=save
+#pragma language=extended
+__IAR_FT uint16_t __iar_uint16_read(void const *ptr)
+{
+ return *(__packed uint16_t*)(ptr);
+}
+#pragma language=restore
+#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR)
+#endif
+
+
+#ifndef __UNALIGNED_UINT16_WRITE
+#pragma language=save
+#pragma language=extended
+__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val)
+{
+ *(__packed uint16_t*)(ptr) = val;;
+}
+#pragma language=restore
+#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL)
+#endif
+
+#ifndef __UNALIGNED_UINT32_READ
+#pragma language=save
+#pragma language=extended
+__IAR_FT uint32_t __iar_uint32_read(void const *ptr)
+{
+ return *(__packed uint32_t*)(ptr);
+}
+#pragma language=restore
+#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR)
+#endif
+
+#ifndef __UNALIGNED_UINT32_WRITE
+#pragma language=save
+#pragma language=extended
+__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val)
+{
+ *(__packed uint32_t*)(ptr) = val;;
+}
+#pragma language=restore
+#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL)
+#endif
+
+#ifndef __UNALIGNED_UINT32 /* deprecated */
+#pragma language=save
+#pragma language=extended
+__packed struct __iar_u32 { uint32_t v; };
+#pragma language=restore
+#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v)
+#endif
+
+#ifndef __USED
+ #if __ICCARM_V8
+ #define __USED __attribute__((used))
+ #else
+ #define __USED _Pragma("__root")
+ #endif
+#endif
+
+#ifndef __WEAK
+ #if __ICCARM_V8
+ #define __WEAK __attribute__((weak))
+ #else
+ #define __WEAK _Pragma("__weak")
+ #endif
+#endif
+
+#ifndef __PROGRAM_START
+#define __PROGRAM_START __iar_program_start
+#endif
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP CSTACK$$Limit
+#endif
+
+#ifndef __STACK_LIMIT
+#define __STACK_LIMIT CSTACK$$Base
+#endif
+
+#ifndef __VECTOR_TABLE
+#define __VECTOR_TABLE __vector_table
+#endif
+
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE @".intvec"
+#endif
+
+#ifndef __ICCARM_INTRINSICS_VERSION__
+ #define __ICCARM_INTRINSICS_VERSION__ 0
+#endif
+
+#if __ICCARM_INTRINSICS_VERSION__ == 2
+
+ #if defined(__CLZ)
+ #undef __CLZ
+ #endif
+ #if defined(__REVSH)
+ #undef __REVSH
+ #endif
+ #if defined(__RBIT)
+ #undef __RBIT
+ #endif
+ #if defined(__SSAT)
+ #undef __SSAT
+ #endif
+ #if defined(__USAT)
+ #undef __USAT
+ #endif
+
+ #include "iccarm_builtin.h"
+
+ #define __disable_fault_irq __iar_builtin_disable_fiq
+ #define __disable_irq __iar_builtin_disable_interrupt
+ #define __enable_fault_irq __iar_builtin_enable_fiq
+ #define __enable_irq __iar_builtin_enable_interrupt
+ #define __arm_rsr __iar_builtin_rsr
+ #define __arm_wsr __iar_builtin_wsr
+
+
+ #define __get_APSR() (__arm_rsr("APSR"))
+ #define __get_BASEPRI() (__arm_rsr("BASEPRI"))
+ #define __get_CONTROL() (__arm_rsr("CONTROL"))
+ #define __get_FAULTMASK() (__arm_rsr("FAULTMASK"))
+
+ #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
+ #define __get_FPSCR() (__arm_rsr("FPSCR"))
+ #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE)))
+ #else
+ #define __get_FPSCR() ( 0 )
+ #define __set_FPSCR(VALUE) ((void)VALUE)
+ #endif
+
+ #define __get_IPSR() (__arm_rsr("IPSR"))
+ #define __get_MSP() (__arm_rsr("MSP"))
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ #define __get_MSPLIM() (0U)
+ #else
+ #define __get_MSPLIM() (__arm_rsr("MSPLIM"))
+ #endif
+ #define __get_PRIMASK() (__arm_rsr("PRIMASK"))
+ #define __get_PSP() (__arm_rsr("PSP"))
+
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ #define __get_PSPLIM() (0U)
+ #else
+ #define __get_PSPLIM() (__arm_rsr("PSPLIM"))
+ #endif
+
+ #define __get_xPSR() (__arm_rsr("xPSR"))
+
+ #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE)))
+ #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE)))
+ #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE)))
+ #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE)))
+ #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE)))
+
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ #define __set_MSPLIM(VALUE) ((void)(VALUE))
+ #else
+ #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE)))
+ #endif
+ #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE)))
+ #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE)))
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ #define __set_PSPLIM(VALUE) ((void)(VALUE))
+ #else
+ #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE)))
+ #endif
+
+ #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS"))
+ #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE)))
+ #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS"))
+ #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE)))
+ #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS"))
+ #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE)))
+ #define __TZ_get_SP_NS() (__arm_rsr("SP_NS"))
+ #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE)))
+ #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS"))
+ #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE)))
+ #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS"))
+ #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE)))
+ #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS"))
+ #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE)))
+
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ #define __TZ_get_PSPLIM_NS() (0U)
+ #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE))
+ #else
+ #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS"))
+ #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE)))
+ #endif
+
+ #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS"))
+ #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE)))
+
+ #define __NOP __iar_builtin_no_operation
+
+ #define __CLZ __iar_builtin_CLZ
+ #define __CLREX __iar_builtin_CLREX
+
+ #define __DMB __iar_builtin_DMB
+ #define __DSB __iar_builtin_DSB
+ #define __ISB __iar_builtin_ISB
+
+ #define __LDREXB __iar_builtin_LDREXB
+ #define __LDREXH __iar_builtin_LDREXH
+ #define __LDREXW __iar_builtin_LDREX
+
+ #define __RBIT __iar_builtin_RBIT
+ #define __REV __iar_builtin_REV
+ #define __REV16 __iar_builtin_REV16
+
+ __IAR_FT int16_t __REVSH(int16_t val)
+ {
+ return (int16_t) __iar_builtin_REVSH(val);
+ }
+
+ #define __ROR __iar_builtin_ROR
+ #define __RRX __iar_builtin_RRX
+
+ #define __SEV __iar_builtin_SEV
+
+ #if !__IAR_M0_FAMILY
+ #define __SSAT __iar_builtin_SSAT
+ #endif
+
+ #define __STREXB __iar_builtin_STREXB
+ #define __STREXH __iar_builtin_STREXH
+ #define __STREXW __iar_builtin_STREX
+
+ #if !__IAR_M0_FAMILY
+ #define __USAT __iar_builtin_USAT
+ #endif
+
+ #define __WFE __iar_builtin_WFE
+ #define __WFI __iar_builtin_WFI
+
+ #if __ARM_MEDIA__
+ #define __SADD8 __iar_builtin_SADD8
+ #define __QADD8 __iar_builtin_QADD8
+ #define __SHADD8 __iar_builtin_SHADD8
+ #define __UADD8 __iar_builtin_UADD8
+ #define __UQADD8 __iar_builtin_UQADD8
+ #define __UHADD8 __iar_builtin_UHADD8
+ #define __SSUB8 __iar_builtin_SSUB8
+ #define __QSUB8 __iar_builtin_QSUB8
+ #define __SHSUB8 __iar_builtin_SHSUB8
+ #define __USUB8 __iar_builtin_USUB8
+ #define __UQSUB8 __iar_builtin_UQSUB8
+ #define __UHSUB8 __iar_builtin_UHSUB8
+ #define __SADD16 __iar_builtin_SADD16
+ #define __QADD16 __iar_builtin_QADD16
+ #define __SHADD16 __iar_builtin_SHADD16
+ #define __UADD16 __iar_builtin_UADD16
+ #define __UQADD16 __iar_builtin_UQADD16
+ #define __UHADD16 __iar_builtin_UHADD16
+ #define __SSUB16 __iar_builtin_SSUB16
+ #define __QSUB16 __iar_builtin_QSUB16
+ #define __SHSUB16 __iar_builtin_SHSUB16
+ #define __USUB16 __iar_builtin_USUB16
+ #define __UQSUB16 __iar_builtin_UQSUB16
+ #define __UHSUB16 __iar_builtin_UHSUB16
+ #define __SASX __iar_builtin_SASX
+ #define __QASX __iar_builtin_QASX
+ #define __SHASX __iar_builtin_SHASX
+ #define __UASX __iar_builtin_UASX
+ #define __UQASX __iar_builtin_UQASX
+ #define __UHASX __iar_builtin_UHASX
+ #define __SSAX __iar_builtin_SSAX
+ #define __QSAX __iar_builtin_QSAX
+ #define __SHSAX __iar_builtin_SHSAX
+ #define __USAX __iar_builtin_USAX
+ #define __UQSAX __iar_builtin_UQSAX
+ #define __UHSAX __iar_builtin_UHSAX
+ #define __USAD8 __iar_builtin_USAD8
+ #define __USADA8 __iar_builtin_USADA8
+ #define __SSAT16 __iar_builtin_SSAT16
+ #define __USAT16 __iar_builtin_USAT16
+ #define __UXTB16 __iar_builtin_UXTB16
+ #define __UXTAB16 __iar_builtin_UXTAB16
+ #define __SXTB16 __iar_builtin_SXTB16
+ #define __SXTAB16 __iar_builtin_SXTAB16
+ #define __SMUAD __iar_builtin_SMUAD
+ #define __SMUADX __iar_builtin_SMUADX
+ #define __SMMLA __iar_builtin_SMMLA
+ #define __SMLAD __iar_builtin_SMLAD
+ #define __SMLADX __iar_builtin_SMLADX
+ #define __SMLALD __iar_builtin_SMLALD
+ #define __SMLALDX __iar_builtin_SMLALDX
+ #define __SMUSD __iar_builtin_SMUSD
+ #define __SMUSDX __iar_builtin_SMUSDX
+ #define __SMLSD __iar_builtin_SMLSD
+ #define __SMLSDX __iar_builtin_SMLSDX
+ #define __SMLSLD __iar_builtin_SMLSLD
+ #define __SMLSLDX __iar_builtin_SMLSLDX
+ #define __SEL __iar_builtin_SEL
+ #define __QADD __iar_builtin_QADD
+ #define __QSUB __iar_builtin_QSUB
+ #define __PKHBT __iar_builtin_PKHBT
+ #define __PKHTB __iar_builtin_PKHTB
+ #endif
+
+#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */
+
+ #if __IAR_M0_FAMILY
+ /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
+ #define __CLZ __cmsis_iar_clz_not_active
+ #define __SSAT __cmsis_iar_ssat_not_active
+ #define __USAT __cmsis_iar_usat_not_active
+ #define __RBIT __cmsis_iar_rbit_not_active
+ #define __get_APSR __cmsis_iar_get_APSR_not_active
+ #endif
+
+
+ #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
+ #define __get_FPSCR __cmsis_iar_get_FPSR_not_active
+ #define __set_FPSCR __cmsis_iar_set_FPSR_not_active
+ #endif
+
+ #ifdef __INTRINSICS_INCLUDED
+ #error intrinsics.h is already included previously!
+ #endif
+
+ #include
+
+ #if __IAR_M0_FAMILY
+ /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
+ #undef __CLZ
+ #undef __SSAT
+ #undef __USAT
+ #undef __RBIT
+ #undef __get_APSR
+
+ __STATIC_INLINE uint8_t __CLZ(uint32_t data)
+ {
+ if (data == 0U) { return 32U; }
+
+ uint32_t count = 0U;
+ uint32_t mask = 0x80000000U;
+
+ while ((data & mask) == 0U)
+ {
+ count += 1U;
+ mask = mask >> 1U;
+ }
+ return count;
+ }
+
+ __STATIC_INLINE uint32_t __RBIT(uint32_t v)
+ {
+ uint8_t sc = 31U;
+ uint32_t r = v;
+ for (v >>= 1U; v; v >>= 1U)
+ {
+ r <<= 1U;
+ r |= v & 1U;
+ sc--;
+ }
+ return (r << sc);
+ }
+
+ __STATIC_INLINE uint32_t __get_APSR(void)
+ {
+ uint32_t res;
+ __asm("MRS %0,APSR" : "=r" (res));
+ return res;
+ }
+
+ #endif
+
+ #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
+ (defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
+ #undef __get_FPSCR
+ #undef __set_FPSCR
+ #define __get_FPSCR() (0)
+ #define __set_FPSCR(VALUE) ((void)VALUE)
+ #endif
+
+ #pragma diag_suppress=Pe940
+ #pragma diag_suppress=Pe177
+
+ #define __enable_irq __enable_interrupt
+ #define __disable_irq __disable_interrupt
+ #define __NOP __no_operation
+
+ #define __get_xPSR __get_PSR
+
+ #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0)
+
+ __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr)
+ {
+ return __LDREX((unsigned long *)ptr);
+ }
+
+ __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr)
+ {
+ return __STREX(value, (unsigned long *)ptr);
+ }
+ #endif
+
+
+ /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
+ #if (__CORTEX_M >= 0x03)
+
+ __IAR_FT uint32_t __RRX(uint32_t value)
+ {
+ uint32_t result;
+ __ASM volatile("RRX %0, %1" : "=r"(result) : "r" (value));
+ return(result);
+ }
+
+ __IAR_FT void __set_BASEPRI_MAX(uint32_t value)
+ {
+ __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value));
+ }
+
+
+ #define __enable_fault_irq __enable_fiq
+ #define __disable_fault_irq __disable_fiq
+
+
+ #endif /* (__CORTEX_M >= 0x03) */
+
+ __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2)
+ {
+ return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2));
+ }
+
+ #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
+
+ __IAR_FT uint32_t __get_MSPLIM(void)
+ {
+ uint32_t res;
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ res = 0U;
+ #else
+ __asm volatile("MRS %0,MSPLIM" : "=r" (res));
+ #endif
+ return res;
+ }
+
+ __IAR_FT void __set_MSPLIM(uint32_t value)
+ {
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure MSPLIM is RAZ/WI
+ (void)value;
+ #else
+ __asm volatile("MSR MSPLIM,%0" :: "r" (value));
+ #endif
+ }
+
+ __IAR_FT uint32_t __get_PSPLIM(void)
+ {
+ uint32_t res;
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ res = 0U;
+ #else
+ __asm volatile("MRS %0,PSPLIM" : "=r" (res));
+ #endif
+ return res;
+ }
+
+ __IAR_FT void __set_PSPLIM(uint32_t value)
+ {
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)value;
+ #else
+ __asm volatile("MSR PSPLIM,%0" :: "r" (value));
+ #endif
+ }
+
+ __IAR_FT uint32_t __TZ_get_CONTROL_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,CONTROL_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value)
+ {
+ __asm volatile("MSR CONTROL_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_PSP_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,PSP_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_PSP_NS(uint32_t value)
+ {
+ __asm volatile("MSR PSP_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_MSP_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,MSP_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_MSP_NS(uint32_t value)
+ {
+ __asm volatile("MSR MSP_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_SP_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,SP_NS" : "=r" (res));
+ return res;
+ }
+ __IAR_FT void __TZ_set_SP_NS(uint32_t value)
+ {
+ __asm volatile("MSR SP_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value)
+ {
+ __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value)
+ {
+ __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value)
+ {
+ __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value));
+ }
+
+ __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void)
+ {
+ uint32_t res;
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ res = 0U;
+ #else
+ __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res));
+ #endif
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value)
+ {
+ #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
+ (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
+ // without main extensions, the non-secure PSPLIM is RAZ/WI
+ (void)value;
+ #else
+ __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value));
+ #endif
+ }
+
+ __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void)
+ {
+ uint32_t res;
+ __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res));
+ return res;
+ }
+
+ __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value)
+ {
+ __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value));
+ }
+
+ #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
+
+#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */
+
+#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value))
+
+#if __IAR_M0_FAMILY
+ __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
+ {
+ if ((sat >= 1U) && (sat <= 32U))
+ {
+ const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
+ const int32_t min = -1 - max ;
+ if (val > max)
+ {
+ return max;
+ }
+ else if (val < min)
+ {
+ return min;
+ }
+ }
+ return val;
+ }
+
+ __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
+ {
+ if (sat <= 31U)
+ {
+ const uint32_t max = ((1U << sat) - 1U);
+ if (val > (int32_t)max)
+ {
+ return max;
+ }
+ else if (val < 0)
+ {
+ return 0U;
+ }
+ }
+ return (uint32_t)val;
+ }
+#endif
+
+#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
+
+ __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
+ return ((uint8_t)res);
+ }
+
+ __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
+ return ((uint16_t)res);
+ }
+
+ __IAR_FT uint32_t __LDRT(volatile uint32_t *addr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
+ return res;
+ }
+
+ __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr)
+ {
+ __ASM volatile ("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
+ }
+
+ __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr)
+ {
+ __ASM volatile ("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
+ }
+
+ __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr)
+ {
+ __ASM volatile ("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory");
+ }
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
+ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
+
+
+ __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return ((uint8_t)res);
+ }
+
+ __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return ((uint16_t)res);
+ }
+
+ __IAR_FT uint32_t __LDA(volatile uint32_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return res;
+ }
+
+ __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr)
+ {
+ __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
+ }
+
+ __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr)
+ {
+ __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
+ }
+
+ __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr)
+ {
+ __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
+ }
+
+ __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return ((uint8_t)res);
+ }
+
+ __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return ((uint16_t)res);
+ }
+
+ __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
+ return res;
+ }
+
+ __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
+ return res;
+ }
+
+ __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
+ return res;
+ }
+
+ __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
+ {
+ uint32_t res;
+ __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
+ return res;
+ }
+
+#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
+
+#undef __IAR_FT
+#undef __IAR_M0_FAMILY
+#undef __ICCARM_V8
+
+#pragma diag_default=Pe940
+#pragma diag_default=Pe177
+
+#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2))
+
+#endif /* __CMSIS_ICCARM_H__ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_version.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_version.h
new file mode 100644
index 000000000..2f048e455
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/cmsis_version.h
@@ -0,0 +1,39 @@
+/**************************************************************************//**
+ * @file cmsis_version.h
+ * @brief CMSIS Core(M) Version definitions
+ * @version V5.0.4
+ * @date 23. July 2019
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2019 ARM Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if defined ( __ICCARM__ )
+ #pragma system_include /* treat file as system include file for MISRA check */
+#elif defined (__clang__)
+ #pragma clang system_header /* treat file as system include file */
+#endif
+
+#ifndef __CMSIS_VERSION_H
+#define __CMSIS_VERSION_H
+
+/* CMSIS Version definitions */
+#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
+#define __CM_CMSIS_VERSION_SUB ( 4U) /*!< [15:0] CMSIS Core(M) sub version */
+#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
+ __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/core_cm4.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/core_cm4.h
new file mode 100644
index 000000000..4e0e88669
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/core_cm4.h
@@ -0,0 +1,2129 @@
+/**************************************************************************//**
+ * @file core_cm4.h
+ * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File
+ * @version V5.1.1
+ * @date 27. March 2020
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if defined ( __ICCARM__ )
+ #pragma system_include /* treat file as system include file for MISRA check */
+#elif defined (__clang__)
+ #pragma clang system_header /* treat file as system include file */
+#endif
+
+#ifndef __CORE_CM4_H_GENERIC
+#define __CORE_CM4_H_GENERIC
+
+#include
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/**
+ \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
+ CMSIS violates the following MISRA-C:2004 rules:
+
+ \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'.
+
+ \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers.
+
+ \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code.
+ */
+
+
+/*******************************************************************************
+ * CMSIS definitions
+ ******************************************************************************/
+/**
+ \ingroup Cortex_M4
+ @{
+ */
+
+#include "cmsis_version.h"
+
+/* CMSIS CM4 definitions */
+#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
+#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
+#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \
+ __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
+
+#define __CORTEX_M (4U) /*!< Cortex-M Core */
+
+/** __FPU_USED indicates whether an FPU is used or not.
+ For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.
+*/
+#if defined ( __CC_ARM )
+ #if defined __TARGET_FPU_VFP
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+ #if defined __ARM_FP
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined ( __GNUC__ )
+ #if defined (__VFP_FP__) && !defined(__SOFTFP__)
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined ( __ICCARM__ )
+ #if defined __ARMVFP__
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined ( __TI_ARM__ )
+ #if defined __TI_VFP_SUPPORT__
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined ( __TASKING__ )
+ #if defined __FPU_VFP__
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#elif defined ( __CSMC__ )
+ #if ( __CSMC__ & 0x400U)
+ #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
+ #define __FPU_USED 1U
+ #else
+ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+ #define __FPU_USED 0U
+ #endif
+ #else
+ #define __FPU_USED 0U
+ #endif
+
+#endif
+
+#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CORE_CM4_H_GENERIC */
+
+#ifndef __CMSIS_GENERIC
+
+#ifndef __CORE_CM4_H_DEPENDANT
+#define __CORE_CM4_H_DEPENDANT
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* check device defines and use defaults */
+#if defined __CHECK_DEVICE_DEFINES
+ #ifndef __CM4_REV
+ #define __CM4_REV 0x0000U
+ #warning "__CM4_REV not defined in device header file; using default!"
+ #endif
+
+ #ifndef __FPU_PRESENT
+ #define __FPU_PRESENT 0U
+ #warning "__FPU_PRESENT not defined in device header file; using default!"
+ #endif
+
+ #ifndef __MPU_PRESENT
+ #define __MPU_PRESENT 0U
+ #warning "__MPU_PRESENT not defined in device header file; using default!"
+ #endif
+
+ #ifndef __VTOR_PRESENT
+ #define __VTOR_PRESENT 1U
+ #warning "__VTOR_PRESENT not defined in device header file; using default!"
+ #endif
+
+ #ifndef __NVIC_PRIO_BITS
+ #define __NVIC_PRIO_BITS 3U
+ #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
+ #endif
+
+ #ifndef __Vendor_SysTickConfig
+ #define __Vendor_SysTickConfig 0U
+ #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
+ #endif
+#endif
+
+/* IO definitions (access restrictions to peripheral registers) */
+/**
+ \defgroup CMSIS_glob_defs CMSIS Global Defines
+
+ IO Type Qualifiers are used
+ \li to specify the access to peripheral variables.
+ \li for automatic generation of peripheral register debug information.
+*/
+#ifdef __cplusplus
+ #define __I volatile /*!< Defines 'read only' permissions */
+#else
+ #define __I volatile const /*!< Defines 'read only' permissions */
+#endif
+#define __O volatile /*!< Defines 'write only' permissions */
+#define __IO volatile /*!< Defines 'read / write' permissions */
+
+/* following defines should be used for structure members */
+#define __IM volatile const /*! Defines 'read only' structure member permissions */
+#define __OM volatile /*! Defines 'write only' structure member permissions */
+#define __IOM volatile /*! Defines 'read / write' structure member permissions */
+
+/*@} end of group Cortex_M4 */
+
+
+
+/*******************************************************************************
+ * Register Abstraction
+ Core Register contain:
+ - Core Register
+ - Core NVIC Register
+ - Core SCB Register
+ - Core SysTick Register
+ - Core Debug Register
+ - Core MPU Register
+ - Core FPU Register
+ ******************************************************************************/
+/**
+ \defgroup CMSIS_core_register Defines and Type Definitions
+ \brief Type definitions and defines for Cortex-M processor based devices.
+*/
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_CORE Status and Control Registers
+ \brief Core Register type definitions.
+ @{
+ */
+
+/**
+ \brief Union type to access the Application Program Status Register (APSR).
+ */
+typedef union
+{
+ struct
+ {
+ uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */
+ uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */
+ uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */
+ uint32_t Q:1; /*!< bit: 27 Saturation condition flag */
+ uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
+ uint32_t C:1; /*!< bit: 29 Carry condition code flag */
+ uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
+ uint32_t N:1; /*!< bit: 31 Negative condition code flag */
+ } b; /*!< Structure used for bit access */
+ uint32_t w; /*!< Type used for word access */
+} APSR_Type;
+
+/* APSR Register Definitions */
+#define APSR_N_Pos 31U /*!< APSR: N Position */
+#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
+
+#define APSR_Z_Pos 30U /*!< APSR: Z Position */
+#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
+
+#define APSR_C_Pos 29U /*!< APSR: C Position */
+#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
+
+#define APSR_V_Pos 28U /*!< APSR: V Position */
+#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
+
+#define APSR_Q_Pos 27U /*!< APSR: Q Position */
+#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */
+
+#define APSR_GE_Pos 16U /*!< APSR: GE Position */
+#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */
+
+
+/**
+ \brief Union type to access the Interrupt Program Status Register (IPSR).
+ */
+typedef union
+{
+ struct
+ {
+ uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
+ uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */
+ } b; /*!< Structure used for bit access */
+ uint32_t w; /*!< Type used for word access */
+} IPSR_Type;
+
+/* IPSR Register Definitions */
+#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
+#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
+
+
+/**
+ \brief Union type to access the Special-Purpose Program Status Registers (xPSR).
+ */
+typedef union
+{
+ struct
+ {
+ uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
+ uint32_t _reserved0:1; /*!< bit: 9 Reserved */
+ uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */
+ uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */
+ uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */
+ uint32_t T:1; /*!< bit: 24 Thumb bit */
+ uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */
+ uint32_t Q:1; /*!< bit: 27 Saturation condition flag */
+ uint32_t V:1; /*!< bit: 28 Overflow condition code flag */
+ uint32_t C:1; /*!< bit: 29 Carry condition code flag */
+ uint32_t Z:1; /*!< bit: 30 Zero condition code flag */
+ uint32_t N:1; /*!< bit: 31 Negative condition code flag */
+ } b; /*!< Structure used for bit access */
+ uint32_t w; /*!< Type used for word access */
+} xPSR_Type;
+
+/* xPSR Register Definitions */
+#define xPSR_N_Pos 31U /*!< xPSR: N Position */
+#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
+
+#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
+#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
+
+#define xPSR_C_Pos 29U /*!< xPSR: C Position */
+#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
+
+#define xPSR_V_Pos 28U /*!< xPSR: V Position */
+#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
+
+#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */
+#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */
+
+#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */
+#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */
+
+#define xPSR_T_Pos 24U /*!< xPSR: T Position */
+#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
+
+#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */
+#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */
+
+#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */
+#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */
+
+#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
+#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
+
+
+/**
+ \brief Union type to access the Control Registers (CONTROL).
+ */
+typedef union
+{
+ struct
+ {
+ uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */
+ uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */
+ uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */
+ uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */
+ } b; /*!< Structure used for bit access */
+ uint32_t w; /*!< Type used for word access */
+} CONTROL_Type;
+
+/* CONTROL Register Definitions */
+#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */
+#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */
+
+#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
+#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
+
+#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */
+#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */
+
+/*@} end of group CMSIS_CORE */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
+ \brief Type definitions for the NVIC Registers
+ @{
+ */
+
+/**
+ \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
+ */
+typedef struct
+{
+ __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
+ uint32_t RESERVED0[24U];
+ __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
+ uint32_t RESERVED1[24U];
+ __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
+ uint32_t RESERVED2[24U];
+ __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
+ uint32_t RESERVED3[24U];
+ __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
+ uint32_t RESERVED4[56U];
+ __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
+ uint32_t RESERVED5[644U];
+ __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
+} NVIC_Type;
+
+/* Software Triggered Interrupt Register Definitions */
+#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */
+#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */
+
+/*@} end of group CMSIS_NVIC */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_SCB System Control Block (SCB)
+ \brief Type definitions for the System Control Block Registers
+ @{
+ */
+
+/**
+ \brief Structure type to access the System Control Block (SCB).
+ */
+typedef struct
+{
+ __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */
+ __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */
+ __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */
+ __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */
+ __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */
+ __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */
+ __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */
+ __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
+ __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */
+ __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */
+ __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */
+ __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */
+ __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */
+ __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */
+ __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */
+ __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */
+ __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */
+ __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */
+ __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */
+ uint32_t RESERVED0[5U];
+ __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */
+} SCB_Type;
+
+/* SCB CPUID Register Definitions */
+#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
+#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
+
+#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
+#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
+
+#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
+#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
+
+#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
+#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
+
+#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
+#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
+
+/* SCB Interrupt Control State Register Definitions */
+#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
+#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
+
+#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
+#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
+
+#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
+#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
+
+#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
+#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
+
+#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
+#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
+
+#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
+#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
+
+#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
+#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
+
+#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
+#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
+
+#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */
+#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */
+
+#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
+#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
+
+/* SCB Vector Table Offset Register Definitions */
+#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */
+#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */
+
+/* SCB Application Interrupt and Reset Control Register Definitions */
+#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
+#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
+
+#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
+#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
+
+#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
+#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
+
+#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */
+#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */
+
+#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
+#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
+
+#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
+#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
+
+#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */
+#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */
+
+/* SCB System Control Register Definitions */
+#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
+#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
+
+#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
+#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
+
+#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
+#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
+
+/* SCB Configuration Control Register Definitions */
+#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
+#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
+
+#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */
+#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */
+
+#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */
+#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */
+
+#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
+#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
+
+#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */
+#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */
+
+#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */
+#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */
+
+/* SCB System Handler Control and State Register Definitions */
+#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */
+#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */
+
+#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */
+#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */
+
+#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */
+#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */
+
+#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
+#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
+
+#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */
+#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */
+
+#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */
+#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */
+
+#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */
+#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */
+
+#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */
+#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */
+
+#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */
+#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */
+
+#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */
+#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */
+
+#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */
+#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */
+
+#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */
+#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */
+
+#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */
+#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */
+
+#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */
+#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */
+
+/* SCB Configurable Fault Status Register Definitions */
+#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */
+#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */
+
+#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */
+#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */
+
+#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */
+#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */
+
+/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */
+#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */
+#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */
+
+#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */
+#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */
+
+#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */
+#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */
+
+#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */
+#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */
+
+#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */
+#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */
+
+#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */
+#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */
+
+/* BusFault Status Register (part of SCB Configurable Fault Status Register) */
+#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */
+#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */
+
+#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */
+#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */
+
+#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */
+#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */
+
+#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */
+#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */
+
+#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */
+#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */
+
+#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */
+#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */
+
+#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */
+#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */
+
+/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */
+#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */
+#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */
+
+#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */
+#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */
+
+#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */
+#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */
+
+#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */
+#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */
+
+#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */
+#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */
+
+#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */
+#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */
+
+/* SCB Hard Fault Status Register Definitions */
+#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */
+#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */
+
+#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */
+#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */
+
+#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */
+#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */
+
+/* SCB Debug Fault Status Register Definitions */
+#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */
+#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */
+
+#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */
+#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */
+
+#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */
+#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */
+
+#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */
+#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */
+
+#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */
+#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */
+
+/*@} end of group CMSIS_SCB */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)
+ \brief Type definitions for the System Control and ID Register not in the SCB
+ @{
+ */
+
+/**
+ \brief Structure type to access the System Control and ID Register not in the SCB.
+ */
+typedef struct
+{
+ uint32_t RESERVED0[1U];
+ __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */
+ __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */
+} SCnSCB_Type;
+
+/* Interrupt Controller Type Register Definitions */
+#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */
+#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */
+
+/* Auxiliary Control Register Definitions */
+#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */
+#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */
+
+#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */
+#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */
+
+#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */
+#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */
+
+#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */
+#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */
+
+#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */
+#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */
+
+/*@} end of group CMSIS_SCnotSCB */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_SysTick System Tick Timer (SysTick)
+ \brief Type definitions for the System Timer Registers.
+ @{
+ */
+
+/**
+ \brief Structure type to access the System Timer (SysTick).
+ */
+typedef struct
+{
+ __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
+ __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */
+ __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */
+ __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */
+} SysTick_Type;
+
+/* SysTick Control / Status Register Definitions */
+#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
+
+#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
+
+#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
+
+#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
+#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
+
+/* SysTick Reload Register Definitions */
+#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
+#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
+
+/* SysTick Current Register Definitions */
+#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
+#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
+
+/* SysTick Calibration Register Definitions */
+#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
+
+#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
+
+#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
+
+/*@} end of group CMSIS_SysTick */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM)
+ \brief Type definitions for the Instrumentation Trace Macrocell (ITM)
+ @{
+ */
+
+/**
+ \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM).
+ */
+typedef struct
+{
+ __OM union
+ {
+ __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */
+ __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */
+ __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */
+ } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */
+ uint32_t RESERVED0[864U];
+ __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */
+ uint32_t RESERVED1[15U];
+ __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */
+ uint32_t RESERVED2[15U];
+ __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */
+ uint32_t RESERVED3[32U];
+ uint32_t RESERVED4[43U];
+ __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */
+ __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */
+ uint32_t RESERVED5[6U];
+ __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */
+ __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */
+ __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */
+ __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */
+ __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */
+ __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */
+ __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */
+ __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */
+ __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */
+ __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */
+ __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */
+ __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */
+} ITM_Type;
+
+/* ITM Trace Privilege Register Definitions */
+#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */
+#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */
+
+/* ITM Trace Control Register Definitions */
+#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */
+#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */
+
+#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */
+#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */
+
+#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */
+#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */
+
+#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */
+#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */
+
+#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */
+#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */
+
+#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */
+#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */
+
+#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */
+#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */
+
+#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */
+#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */
+
+#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */
+#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */
+
+/* ITM Lock Status Register Definitions */
+#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */
+#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */
+
+#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */
+#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */
+
+#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */
+#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */
+
+/*@}*/ /* end of group CMSIS_ITM */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT)
+ \brief Type definitions for the Data Watchpoint and Trace (DWT)
+ @{
+ */
+
+/**
+ \brief Structure type to access the Data Watchpoint and Trace Register (DWT).
+ */
+typedef struct
+{
+ __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */
+ __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */
+ __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */
+ __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */
+ __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */
+ __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */
+ __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */
+ __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */
+ __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */
+ __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */
+ __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */
+ uint32_t RESERVED0[1U];
+ __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */
+ __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */
+ __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */
+ uint32_t RESERVED1[1U];
+ __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */
+ __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */
+ __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */
+ uint32_t RESERVED2[1U];
+ __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */
+ __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */
+ __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */
+} DWT_Type;
+
+/* DWT Control Register Definitions */
+#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */
+#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */
+
+#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */
+#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */
+
+#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */
+#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */
+
+#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */
+#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */
+
+#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */
+#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */
+
+#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */
+#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */
+
+#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */
+#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */
+
+#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */
+#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */
+
+#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */
+#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */
+
+#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */
+#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */
+
+#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */
+#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */
+
+#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */
+#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */
+
+#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */
+#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */
+
+#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */
+#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */
+
+#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */
+#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */
+
+#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */
+#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */
+
+#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */
+#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */
+
+#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */
+#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */
+
+/* DWT CPI Count Register Definitions */
+#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */
+#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */
+
+/* DWT Exception Overhead Count Register Definitions */
+#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */
+#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */
+
+/* DWT Sleep Count Register Definitions */
+#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */
+#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */
+
+/* DWT LSU Count Register Definitions */
+#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */
+#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */
+
+/* DWT Folded-instruction Count Register Definitions */
+#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */
+#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */
+
+/* DWT Comparator Mask Register Definitions */
+#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */
+#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */
+
+/* DWT Comparator Function Register Definitions */
+#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */
+#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */
+
+#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */
+#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */
+
+#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */
+#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */
+
+#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */
+#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */
+
+#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */
+#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */
+
+#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */
+#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */
+
+#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */
+#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */
+
+#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */
+#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */
+
+#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */
+#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */
+
+/*@}*/ /* end of group CMSIS_DWT */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_TPI Trace Port Interface (TPI)
+ \brief Type definitions for the Trace Port Interface (TPI)
+ @{
+ */
+
+/**
+ \brief Structure type to access the Trace Port Interface Register (TPI).
+ */
+typedef struct
+{
+ __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */
+ __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */
+ uint32_t RESERVED0[2U];
+ __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */
+ uint32_t RESERVED1[55U];
+ __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */
+ uint32_t RESERVED2[131U];
+ __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */
+ __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */
+ __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */
+ uint32_t RESERVED3[759U];
+ __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */
+ __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */
+ __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */
+ uint32_t RESERVED4[1U];
+ __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */
+ __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */
+ __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */
+ uint32_t RESERVED5[39U];
+ __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */
+ __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */
+ uint32_t RESERVED7[8U];
+ __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */
+ __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */
+} TPI_Type;
+
+/* TPI Asynchronous Clock Prescaler Register Definitions */
+#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */
+#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */
+
+/* TPI Selected Pin Protocol Register Definitions */
+#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */
+#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */
+
+/* TPI Formatter and Flush Status Register Definitions */
+#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */
+#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */
+
+#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */
+#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */
+
+#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */
+#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */
+
+#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */
+#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */
+
+/* TPI Formatter and Flush Control Register Definitions */
+#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */
+#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */
+
+#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */
+#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */
+
+/* TPI TRIGGER Register Definitions */
+#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */
+#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */
+
+/* TPI Integration ETM Data Register Definitions (FIFO0) */
+#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */
+#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */
+
+#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */
+#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */
+
+#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */
+#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */
+
+#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */
+#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */
+
+#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */
+#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */
+
+#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */
+#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */
+
+#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */
+#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */
+
+/* TPI ITATBCTR2 Register Definitions */
+#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */
+#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */
+
+#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */
+#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */
+
+/* TPI Integration ITM Data Register Definitions (FIFO1) */
+#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */
+#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */
+
+#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */
+#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */
+
+#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */
+#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */
+
+#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */
+#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */
+
+#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */
+#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */
+
+#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */
+#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */
+
+#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */
+#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */
+
+/* TPI ITATBCTR0 Register Definitions */
+#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */
+#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */
+
+#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */
+#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */
+
+/* TPI Integration Mode Control Register Definitions */
+#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */
+#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */
+
+/* TPI DEVID Register Definitions */
+#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */
+#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */
+
+#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */
+#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */
+
+#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */
+#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */
+
+#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */
+#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */
+
+#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */
+#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */
+
+#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */
+#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */
+
+/* TPI DEVTYPE Register Definitions */
+#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */
+#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */
+
+#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */
+#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */
+
+/*@}*/ /* end of group CMSIS_TPI */
+
+
+#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_MPU Memory Protection Unit (MPU)
+ \brief Type definitions for the Memory Protection Unit (MPU)
+ @{
+ */
+
+/**
+ \brief Structure type to access the Memory Protection Unit (MPU).
+ */
+typedef struct
+{
+ __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */
+ __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */
+ __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */
+ __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */
+ __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */
+ __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */
+ __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */
+ __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */
+ __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */
+ __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */
+ __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */
+} MPU_Type;
+
+#define MPU_TYPE_RALIASES 4U
+
+/* MPU Type Register Definitions */
+#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */
+#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */
+
+#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */
+#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */
+
+#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */
+#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */
+
+/* MPU Control Register Definitions */
+#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */
+#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */
+
+#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */
+#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */
+
+#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */
+#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */
+
+/* MPU Region Number Register Definitions */
+#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */
+#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */
+
+/* MPU Region Base Address Register Definitions */
+#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */
+#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */
+
+#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */
+#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */
+
+#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */
+#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */
+
+/* MPU Region Attribute and Size Register Definitions */
+#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */
+#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */
+
+#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */
+#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */
+
+#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */
+#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */
+
+#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */
+#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */
+
+#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */
+#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */
+
+#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */
+#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */
+
+#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */
+#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */
+
+#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */
+#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */
+
+#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */
+#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */
+
+#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */
+#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */
+
+/*@} end of group CMSIS_MPU */
+#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_FPU Floating Point Unit (FPU)
+ \brief Type definitions for the Floating Point Unit (FPU)
+ @{
+ */
+
+/**
+ \brief Structure type to access the Floating Point Unit (FPU).
+ */
+typedef struct
+{
+ uint32_t RESERVED0[1U];
+ __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */
+ __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */
+ __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */
+ __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */
+ __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */
+ __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */
+} FPU_Type;
+
+/* Floating-Point Context Control Register Definitions */
+#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */
+#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */
+
+#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */
+#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */
+
+#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */
+#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */
+
+#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */
+#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */
+
+#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */
+#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */
+
+#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */
+#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */
+
+#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */
+#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */
+
+#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */
+#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */
+
+#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */
+#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */
+
+/* Floating-Point Context Address Register Definitions */
+#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */
+#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */
+
+/* Floating-Point Default Status Control Register Definitions */
+#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */
+#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */
+
+#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */
+#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */
+
+#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */
+#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */
+
+#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */
+#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */
+
+/* Media and FP Feature Register 0 Definitions */
+#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */
+#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */
+
+#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */
+#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */
+
+#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */
+#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */
+
+#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */
+#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */
+
+#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */
+#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */
+
+#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */
+#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */
+
+#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */
+#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */
+
+#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */
+#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */
+
+/* Media and FP Feature Register 1 Definitions */
+#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */
+#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */
+
+#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */
+#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */
+
+#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */
+#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */
+
+#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */
+#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */
+
+/* Media and FP Feature Register 2 Definitions */
+
+#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */
+#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */
+
+/*@} end of group CMSIS_FPU */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
+ \brief Type definitions for the Core Debug Registers
+ @{
+ */
+
+/**
+ \brief Structure type to access the Core Debug Register (CoreDebug).
+ */
+typedef struct
+{
+ __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */
+ __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */
+ __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */
+ __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */
+} CoreDebug_Type;
+
+/* Debug Halting Control and Status Register Definitions */
+#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */
+#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */
+
+#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */
+#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */
+
+#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */
+#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */
+
+#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */
+#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */
+
+#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */
+#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */
+
+#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */
+#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */
+
+#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */
+#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */
+
+#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */
+#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */
+
+#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */
+#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */
+
+#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */
+#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */
+
+#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */
+#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */
+
+#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */
+#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */
+
+/* Debug Core Register Selector Register Definitions */
+#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */
+#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */
+
+#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */
+#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */
+
+/* Debug Exception and Monitor Control Register Definitions */
+#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */
+#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */
+
+#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */
+#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */
+
+#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */
+#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */
+
+#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */
+#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */
+
+#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */
+#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */
+
+#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */
+#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */
+
+#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */
+#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */
+
+#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */
+#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */
+
+#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */
+#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */
+
+#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */
+#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */
+
+#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */
+#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */
+
+#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */
+#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */
+
+#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */
+#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */
+
+/*@} end of group CMSIS_CoreDebug */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_core_bitfield Core register bit field macros
+ \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
+ @{
+ */
+
+/**
+ \brief Mask and shift a bit field value for use in a register bit range.
+ \param[in] field Name of the register bit field.
+ \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
+ \return Masked and shifted value.
+*/
+#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
+
+/**
+ \brief Mask and shift a register value to extract a bit filed value.
+ \param[in] field Name of the register bit field.
+ \param[in] value Value of register. This parameter is interpreted as an uint32_t type.
+ \return Masked and shifted bit field value.
+*/
+#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
+
+/*@} end of group CMSIS_core_bitfield */
+
+
+/**
+ \ingroup CMSIS_core_register
+ \defgroup CMSIS_core_base Core Definitions
+ \brief Definitions for base addresses, unions, and structures.
+ @{
+ */
+
+/* Memory mapping of Core Hardware */
+#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
+#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */
+#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */
+#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */
+#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */
+#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
+#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
+#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
+
+#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
+#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
+#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
+#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
+#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */
+#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */
+#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */
+#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */
+
+#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
+ #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */
+ #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */
+#endif
+
+#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */
+#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */
+
+/*@} */
+
+
+
+/*******************************************************************************
+ * Hardware Abstraction Layer
+ Core Function Interface contains:
+ - Core NVIC Functions
+ - Core SysTick Functions
+ - Core Debug Functions
+ - Core Register Access Functions
+ ******************************************************************************/
+/**
+ \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
+*/
+
+
+
+/* ########################## NVIC functions #################################### */
+/**
+ \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_NVICFunctions NVIC Functions
+ \brief Functions that manage interrupts and exceptions via the NVIC.
+ @{
+ */
+
+#ifdef CMSIS_NVIC_VIRTUAL
+ #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
+ #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
+ #endif
+ #include CMSIS_NVIC_VIRTUAL_HEADER_FILE
+#else
+ #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
+ #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
+ #define NVIC_EnableIRQ __NVIC_EnableIRQ
+ #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
+ #define NVIC_DisableIRQ __NVIC_DisableIRQ
+ #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
+ #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
+ #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
+ #define NVIC_GetActive __NVIC_GetActive
+ #define NVIC_SetPriority __NVIC_SetPriority
+ #define NVIC_GetPriority __NVIC_GetPriority
+ #define NVIC_SystemReset __NVIC_SystemReset
+#endif /* CMSIS_NVIC_VIRTUAL */
+
+#ifdef CMSIS_VECTAB_VIRTUAL
+ #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
+ #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
+ #endif
+ #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
+#else
+ #define NVIC_SetVector __NVIC_SetVector
+ #define NVIC_GetVector __NVIC_GetVector
+#endif /* (CMSIS_VECTAB_VIRTUAL) */
+
+#define NVIC_USER_IRQ_OFFSET 16
+
+
+/* The following EXC_RETURN values are saved the LR on exception entry */
+#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
+#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
+#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
+#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */
+#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */
+#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */
+
+
+/**
+ \brief Set Priority Grouping
+ \details Sets the priority grouping field using the required unlock sequence.
+ The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
+ Only values from 0..7 are used.
+ In case of a conflict between priority grouping and available
+ priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
+ \param [in] PriorityGroup Priority grouping field.
+ */
+__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
+{
+ uint32_t reg_value;
+ uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
+
+ reg_value = SCB->AIRCR; /* read old register configuration */
+ reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */
+ reg_value = (reg_value |
+ ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
+ (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */
+ SCB->AIRCR = reg_value;
+}
+
+
+/**
+ \brief Get Priority Grouping
+ \details Reads the priority grouping field from the NVIC Interrupt Controller.
+ \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).
+ */
+__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)
+{
+ return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));
+}
+
+
+/**
+ \brief Enable Interrupt
+ \details Enables a device specific interrupt in the NVIC interrupt controller.
+ \param [in] IRQn Device specific interrupt number.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ __COMPILER_BARRIER();
+ NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
+ __COMPILER_BARRIER();
+ }
+}
+
+
+/**
+ \brief Get Interrupt Enable status
+ \details Returns a device specific interrupt enable status from the NVIC interrupt controller.
+ \param [in] IRQn Device specific interrupt number.
+ \return 0 Interrupt is not enabled.
+ \return 1 Interrupt is enabled.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
+ }
+ else
+ {
+ return(0U);
+ }
+}
+
+
+/**
+ \brief Disable Interrupt
+ \details Disables a device specific interrupt in the NVIC interrupt controller.
+ \param [in] IRQn Device specific interrupt number.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
+ __DSB();
+ __ISB();
+ }
+}
+
+
+/**
+ \brief Get Pending Interrupt
+ \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
+ \param [in] IRQn Device specific interrupt number.
+ \return 0 Interrupt status is not pending.
+ \return 1 Interrupt status is pending.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
+ }
+ else
+ {
+ return(0U);
+ }
+}
+
+
+/**
+ \brief Set Pending Interrupt
+ \details Sets the pending bit of a device specific interrupt in the NVIC pending register.
+ \param [in] IRQn Device specific interrupt number.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
+ }
+}
+
+
+/**
+ \brief Clear Pending Interrupt
+ \details Clears the pending bit of a device specific interrupt in the NVIC pending register.
+ \param [in] IRQn Device specific interrupt number.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
+ }
+}
+
+
+/**
+ \brief Get Active Interrupt
+ \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.
+ \param [in] IRQn Device specific interrupt number.
+ \return 0 Interrupt status is not active.
+ \return 1 Interrupt status is active.
+ \note IRQn must not be negative.
+ */
+__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
+ }
+ else
+ {
+ return(0U);
+ }
+}
+
+
+/**
+ \brief Set Interrupt Priority
+ \details Sets the priority of a device specific interrupt or a processor exception.
+ The interrupt number can be positive to specify a device specific interrupt,
+ or negative to specify a processor exception.
+ \param [in] IRQn Interrupt number.
+ \param [in] priority Priority to set.
+ \note The priority cannot be set for every processor exception.
+ */
+__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
+{
+ if ((int32_t)(IRQn) >= 0)
+ {
+ NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
+ }
+ else
+ {
+ SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
+ }
+}
+
+
+/**
+ \brief Get Interrupt Priority
+ \details Reads the priority of a device specific interrupt or a processor exception.
+ The interrupt number can be positive to specify a device specific interrupt,
+ or negative to specify a processor exception.
+ \param [in] IRQn Interrupt number.
+ \return Interrupt Priority.
+ Value is aligned automatically to the implemented priority bits of the microcontroller.
+ */
+__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
+{
+
+ if ((int32_t)(IRQn) >= 0)
+ {
+ return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS)));
+ }
+ else
+ {
+ return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));
+ }
+}
+
+
+/**
+ \brief Encode Priority
+ \details Encodes the priority for an interrupt with the given priority group,
+ preemptive priority value, and subpriority value.
+ In case of a conflict between priority grouping and available
+ priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
+ \param [in] PriorityGroup Used priority group.
+ \param [in] PreemptPriority Preemptive priority value (starting from 0).
+ \param [in] SubPriority Subpriority value (starting from 0).
+ \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
+ */
+__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
+{
+ uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
+ uint32_t PreemptPriorityBits;
+ uint32_t SubPriorityBits;
+
+ PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
+ SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
+
+ return (
+ ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
+ ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
+ );
+}
+
+
+/**
+ \brief Decode Priority
+ \details Decodes an interrupt priority value with a given priority group to
+ preemptive priority value and subpriority value.
+ In case of a conflict between priority grouping and available
+ priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
+ \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
+ \param [in] PriorityGroup Used priority group.
+ \param [out] pPreemptPriority Preemptive priority value (starting from 0).
+ \param [out] pSubPriority Subpriority value (starting from 0).
+ */
+__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
+{
+ uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
+ uint32_t PreemptPriorityBits;
+ uint32_t SubPriorityBits;
+
+ PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
+ SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
+
+ *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
+ *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
+}
+
+
+/**
+ \brief Set Interrupt Vector
+ \details Sets an interrupt vector in SRAM based interrupt vector table.
+ The interrupt number can be positive to specify a device specific interrupt,
+ or negative to specify a processor exception.
+ VTOR must been relocated to SRAM before.
+ \param [in] IRQn Interrupt number
+ \param [in] vector Address of interrupt handler function
+ */
+__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
+{
+ uint32_t *vectors = (uint32_t *)SCB->VTOR;
+ vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
+ /* ARM Application Note 321 states that the M4 does not require the architectural barrier */
+}
+
+
+/**
+ \brief Get Interrupt Vector
+ \details Reads an interrupt vector from interrupt vector table.
+ The interrupt number can be positive to specify a device specific interrupt,
+ or negative to specify a processor exception.
+ \param [in] IRQn Interrupt number.
+ \return Address of interrupt handler function
+ */
+__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
+{
+ uint32_t *vectors = (uint32_t *)SCB->VTOR;
+ return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
+}
+
+
+/**
+ \brief System Reset
+ \details Initiates a system reset request to reset the MCU.
+ */
+__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
+{
+ __DSB(); /* Ensure all outstanding memory accesses included
+ buffered write are completed before reset */
+ SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
+ (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
+ SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */
+ __DSB(); /* Ensure completion of memory access */
+
+ for(;;) /* wait until reset */
+ {
+ __NOP();
+ }
+}
+
+/*@} end of CMSIS_Core_NVICFunctions */
+
+
+/* ########################## MPU functions #################################### */
+
+#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
+
+#include "mpu_armv7.h"
+
+#endif
+
+
+/* ########################## FPU functions #################################### */
+/**
+ \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_FpuFunctions FPU Functions
+ \brief Function that provides FPU type.
+ @{
+ */
+
+/**
+ \brief get FPU type
+ \details returns the FPU type
+ \returns
+ - \b 0: No FPU
+ - \b 1: Single precision FPU
+ - \b 2: Double + Single precision FPU
+ */
+__STATIC_INLINE uint32_t SCB_GetFPUType(void)
+{
+ uint32_t mvfr0;
+
+ mvfr0 = FPU->MVFR0;
+ if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)
+ {
+ return 1U; /* Single precision FPU */
+ }
+ else
+ {
+ return 0U; /* No FPU */
+ }
+}
+
+
+/*@} end of CMSIS_Core_FpuFunctions */
+
+
+
+/* ################################## SysTick function ############################################ */
+/**
+ \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
+ \brief Functions that configure the System.
+ @{
+ */
+
+#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
+
+/**
+ \brief System Tick Configuration
+ \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
+ Counter is in free running mode to generate periodic interrupts.
+ \param [in] ticks Number of ticks between two interrupts.
+ \return 0 Function succeeded.
+ \return 1 Function failed.
+ \note When the variable __Vendor_SysTickConfig is set to 1, then the
+ function SysTick_Config is not included. In this case, the file device.h
+ must contain a vendor-specific implementation of this function.
+ */
+__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
+{
+ if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
+ {
+ return (1UL); /* Reload value impossible */
+ }
+
+ SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
+ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
+ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
+ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
+ SysTick_CTRL_TICKINT_Msk |
+ SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
+ return (0UL); /* Function successful */
+}
+
+#endif
+
+/*@} end of CMSIS_Core_SysTickFunctions */
+
+
+
+/* ##################################### Debug In/Output function ########################################### */
+/**
+ \ingroup CMSIS_Core_FunctionInterface
+ \defgroup CMSIS_core_DebugFunctions ITM Functions
+ \brief Functions that access the ITM debug interface.
+ @{
+ */
+
+extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */
+#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */
+
+
+/**
+ \brief ITM Send Character
+ \details Transmits a character via the ITM channel 0, and
+ \li Just returns when no debugger is connected that has booked the output.
+ \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.
+ \param [in] ch Character to transmit.
+ \returns Character to transmit.
+ */
+__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
+{
+ if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */
+ ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */
+ {
+ while (ITM->PORT[0U].u32 == 0UL)
+ {
+ __NOP();
+ }
+ ITM->PORT[0U].u8 = (uint8_t)ch;
+ }
+ return (ch);
+}
+
+
+/**
+ \brief ITM Receive Character
+ \details Inputs a character via the external variable \ref ITM_RxBuffer.
+ \return Received character.
+ \return -1 No character pending.
+ */
+__STATIC_INLINE int32_t ITM_ReceiveChar (void)
+{
+ int32_t ch = -1; /* no character available */
+
+ if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)
+ {
+ ch = ITM_RxBuffer;
+ ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */
+ }
+
+ return (ch);
+}
+
+
+/**
+ \brief ITM Check Character
+ \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer.
+ \return 0 No character available.
+ \return 1 Character available.
+ */
+__STATIC_INLINE int32_t ITM_CheckChar (void)
+{
+
+ if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)
+ {
+ return (0); /* no character available */
+ }
+ else
+ {
+ return (1); /* character available */
+ }
+}
+
+/*@} end of CMSIS_core_DebugFunctions */
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CORE_CM4_H_DEPENDANT */
+
+#endif /* __CMSIS_GENERIC */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/mpu_armv7.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/mpu_armv7.h
new file mode 100644
index 000000000..791a8dae6
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/mpu_armv7.h
@@ -0,0 +1,275 @@
+/******************************************************************************
+ * @file mpu_armv7.h
+ * @brief CMSIS MPU API for Armv7-M MPU
+ * @version V5.1.1
+ * @date 10. February 2020
+ ******************************************************************************/
+/*
+ * Copyright (c) 2017-2020 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if defined ( __ICCARM__ )
+ #pragma system_include /* treat file as system include file for MISRA check */
+#elif defined (__clang__)
+ #pragma clang system_header /* treat file as system include file */
+#endif
+
+#ifndef ARM_MPU_ARMV7_H
+#define ARM_MPU_ARMV7_H
+
+#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes
+#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes
+#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes
+#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes
+#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes
+#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte
+#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes
+#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes
+#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes
+#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes
+#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes
+#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes
+#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes
+#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes
+#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes
+#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte
+#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes
+#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes
+#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes
+#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes
+#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes
+#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes
+#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes
+#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes
+#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes
+#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte
+#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes
+#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes
+
+#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access
+#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only
+#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only
+#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access
+#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only
+#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access
+
+/** MPU Region Base Address Register Value
+*
+* \param Region The region to be configured, number 0 to 15.
+* \param BaseAddress The base address for the region.
+*/
+#define ARM_MPU_RBAR(Region, BaseAddress) \
+ (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \
+ ((Region) & MPU_RBAR_REGION_Msk) | \
+ (MPU_RBAR_VALID_Msk))
+
+/**
+* MPU Memory Access Attributes
+*
+* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
+* \param IsShareable Region is shareable between multiple bus masters.
+* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
+* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
+*/
+#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \
+ ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \
+ (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \
+ (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \
+ (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk))
+
+/**
+* MPU Region Attribute and Size Register Value
+*
+* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
+* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
+* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_.
+* \param SubRegionDisable Sub-region disable field.
+* \param Size Region size of the region to be configured, for example 4K, 8K.
+*/
+#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \
+ ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \
+ (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \
+ (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \
+ (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \
+ (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \
+ (((MPU_RASR_ENABLE_Msk))))
+
+/**
+* MPU Region Attribute and Size Register Value
+*
+* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
+* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
+* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
+* \param IsShareable Region is shareable between multiple bus masters.
+* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
+* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
+* \param SubRegionDisable Sub-region disable field.
+* \param Size Region size of the region to be configured, for example 4K, 8K.
+*/
+#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \
+ ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size)
+
+/**
+* MPU Memory Access Attribute for strongly ordered memory.
+* - TEX: 000b
+* - Shareable
+* - Non-cacheable
+* - Non-bufferable
+*/
+#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U)
+
+/**
+* MPU Memory Access Attribute for device memory.
+* - TEX: 000b (if shareable) or 010b (if non-shareable)
+* - Shareable or non-shareable
+* - Non-cacheable
+* - Bufferable (if shareable) or non-bufferable (if non-shareable)
+*
+* \param IsShareable Configures the device memory as shareable or non-shareable.
+*/
+#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U))
+
+/**
+* MPU Memory Access Attribute for normal memory.
+* - TEX: 1BBb (reflecting outer cacheability rules)
+* - Shareable or non-shareable
+* - Cacheable or non-cacheable (reflecting inner cacheability rules)
+* - Bufferable or non-bufferable (reflecting inner cacheability rules)
+*
+* \param OuterCp Configures the outer cache policy.
+* \param InnerCp Configures the inner cache policy.
+* \param IsShareable Configures the memory as shareable or non-shareable.
+*/
+#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U))
+
+/**
+* MPU Memory Access Attribute non-cacheable policy.
+*/
+#define ARM_MPU_CACHEP_NOCACHE 0U
+
+/**
+* MPU Memory Access Attribute write-back, write and read allocate policy.
+*/
+#define ARM_MPU_CACHEP_WB_WRA 1U
+
+/**
+* MPU Memory Access Attribute write-through, no write allocate policy.
+*/
+#define ARM_MPU_CACHEP_WT_NWA 2U
+
+/**
+* MPU Memory Access Attribute write-back, no write allocate policy.
+*/
+#define ARM_MPU_CACHEP_WB_NWA 3U
+
+
+/**
+* Struct for a single MPU Region
+*/
+typedef struct {
+ uint32_t RBAR; //!< The region base address register value (RBAR)
+ uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR
+} ARM_MPU_Region_t;
+
+/** Enable the MPU.
+* \param MPU_Control Default access permissions for unconfigured regions.
+*/
+__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
+{
+ __DMB();
+ MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
+#ifdef SCB_SHCSR_MEMFAULTENA_Msk
+ SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
+#endif
+ __DSB();
+ __ISB();
+}
+
+/** Disable the MPU.
+*/
+__STATIC_INLINE void ARM_MPU_Disable(void)
+{
+ __DMB();
+#ifdef SCB_SHCSR_MEMFAULTENA_Msk
+ SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
+#endif
+ MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
+ __DSB();
+ __ISB();
+}
+
+/** Clear and disable the given MPU region.
+* \param rnr Region number to be cleared.
+*/
+__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
+{
+ MPU->RNR = rnr;
+ MPU->RASR = 0U;
+}
+
+/** Configure an MPU region.
+* \param rbar Value for RBAR register.
+* \param rsar Value for RSAR register.
+*/
+__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr)
+{
+ MPU->RBAR = rbar;
+ MPU->RASR = rasr;
+}
+
+/** Configure the given MPU region.
+* \param rnr Region number to be configured.
+* \param rbar Value for RBAR register.
+* \param rsar Value for RSAR register.
+*/
+__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr)
+{
+ MPU->RNR = rnr;
+ MPU->RBAR = rbar;
+ MPU->RASR = rasr;
+}
+
+/** Memcopy with strictly ordered memory access, e.g. for register targets.
+* \param dst Destination data is copied to.
+* \param src Source data is copied from.
+* \param len Amount of data words to be copied.
+*/
+__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
+{
+ uint32_t i;
+ for (i = 0U; i < len; ++i)
+ {
+ dst[i] = src[i];
+ }
+}
+
+/** Load the given number of MPU regions from a table.
+* \param table Pointer to the MPU configuration table.
+* \param cnt Amount of regions to be configured.
+*/
+__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)
+{
+ const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
+ while (cnt > MPU_TYPE_RALIASES) {
+ ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize);
+ table += MPU_TYPE_RALIASES;
+ cnt -= MPU_TYPE_RALIASES;
+ }
+ ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize);
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/tz_context.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/tz_context.h
new file mode 100644
index 000000000..0d09749f3
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/cmsis/Include/tz_context.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * @file tz_context.h
+ * @brief Context Management for Armv8-M TrustZone
+ * @version V1.0.1
+ * @date 10. January 2018
+ ******************************************************************************/
+/*
+ * Copyright (c) 2017-2018 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if defined ( __ICCARM__ )
+ #pragma system_include /* treat file as system include file for MISRA check */
+#elif defined (__clang__)
+ #pragma clang system_header /* treat file as system include file */
+#endif
+
+#ifndef TZ_CONTEXT_H
+#define TZ_CONTEXT_H
+
+#include
+
+#ifndef TZ_MODULEID_T
+#define TZ_MODULEID_T
+/// \details Data type that identifies secure software modules called by a process.
+typedef uint32_t TZ_ModuleId_t;
+#endif
+
+/// \details TZ Memory ID identifies an allocated memory slot.
+typedef uint32_t TZ_MemoryId_t;
+
+/// Initialize secure context memory system
+/// \return execution status (1: success, 0: error)
+uint32_t TZ_InitContextSystem_S (void);
+
+/// Allocate context memory for calling secure software modules in TrustZone
+/// \param[in] module identifies software modules called from non-secure mode
+/// \return value != 0 id TrustZone memory slot identifier
+/// \return value 0 no memory available or internal error
+TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);
+
+/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
+/// \param[in] id TrustZone memory slot identifier
+/// \return execution status (1: success, 0: error)
+uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);
+
+/// Load secure context (called on RTOS thread context switch)
+/// \param[in] id TrustZone memory slot identifier
+/// \return execution status (1: success, 0: error)
+uint32_t TZ_LoadContext_S (TZ_MemoryId_t id);
+
+/// Store secure context (called on RTOS thread context switch)
+/// \param[in] id TrustZone memory slot identifier
+/// \return execution status (1: success, 0: error)
+uint32_t TZ_StoreContext_S (TZ_MemoryId_t id);
+
+#endif // TZ_CONTEXT_H
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/LICENSE b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/LICENSE
new file mode 100644
index 000000000..ddd4ab410
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018, hathach (tinyusb.org)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/README.rst b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/README.rst
new file mode 100644
index 000000000..7825a1b0a
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/README.rst
@@ -0,0 +1,149 @@
+.. figure:: docs/assets/logo.svg
+ :alt: TinyUSB
+
+|Build Status| |Documentation Status| |Fuzzing Status| |License|
+
+TinyUSB is an open-source cross-platform USB Host/Device stack for
+embedded system, designed to be memory-safe with no dynamic allocation
+and thread-safe with all interrupt events are deferred then handled in
+the non-ISR task function.
+
+Please take a look at the online `documentation `__.
+
+.. figure:: docs/assets/stack.svg
+ :width: 500px
+ :alt: stackup
+
+::
+
+ .
+ ├── docs # Documentation
+ ├── examples # Sample with Makefile build support
+ ├── hw
+ │  ├── bsp # Supported boards source files
+ │  └── mcu # Low level mcu core & peripheral drivers
+ ├── lib # Sources from 3rd party such as freeRTOS, fatfs ...
+ ├── src # All sources files for TinyUSB stack itself.
+ ├── test # Unit tests for the stack
+ └── tools # Files used internally
+
+Supported MCUs
+==============
+
+The stack supports the following MCUs:
+
+- **Allwinner:** F1C100s/F1C200s
+- **Broadcom:** BCM2837, BCM2711
+- **Dialog:** DA1469x
+- **Espressif:** ESP32-S2, ESP32-S3
+- **GigaDevice:** GD32VF103
+- **Infineon:** XMC4500
+- **MicroChip:** SAMD11, SAMD21, SAMD51, SAME5x, SAMG55, SAML21, SAML22, SAME7x
+- **NordicSemi:** nRF52833, nRF52840, nRF5340
+- **Nuvoton:** NUC120, NUC121/NUC125, NUC126, NUC505
+- **NXP:**
+
+ - iMX RT Series: RT10xx, RT11xx
+ - Kinetis: KL25, K32L2
+ - LPC Series: 11u, 13, 15, 17, 18, 40, 43, 51u, 54, 55
+
+- **Raspberry Pi:** RP2040
+- **Renesas:** RX63N, RX65N, RX72N
+- **Silabs:** EFM32GG
+- **Sony:** CXD56
+- **ST:** STM32 series: F0, F1, F2, F3, F4, F7, H7, G4, L0, L1, L4, L4+, WB
+- **TI:** MSP430, MSP432E4, TM4C123
+- **ValentyUSB:** eptri
+- **WCH:** CH32V307
+
+Here is the list of `Supported Devices`_ that can be used with provided examples.
+
+Device Stack
+============
+
+Supports multiple device configurations by dynamically changing USB descriptors, low power functions such like suspend, resume, and remote wakeup. The following device classes are supported:
+
+- Audio Class 2.0 (UAC2)
+- Bluetooth Host Controller Interface (BTH HCI)
+- Communication Device Class (CDC)
+- Device Firmware Update (DFU): DFU mode (WIP) and Runtime
+- Human Interface Device (HID): Generic (In & Out), Keyboard, Mouse, Gamepad etc ...
+- Mass Storage Class (MSC): with multiple LUNs
+- Musical Instrument Digital Interface (MIDI)
+- Network with RNDIS, Ethernet Control Model (ECM), Network Control Model (NCM)
+- Test and Measurement Class (USBTMC)
+- Video class 1.5 (UVC): work in progress
+- Vendor-specific class support with generic In & Out endpoints. Can be used with MS OS 2.0 compatible descriptor to load winUSB driver without INF file.
+- `WebUSB `__ with vendor-specific class
+
+If you have a special requirement, `usbd_app_driver_get_cb()` can be used to write your own class driver without modifying the stack. Here is how the RPi team added their reset interface `raspberrypi/pico-sdk#197 `_
+
+Host Stack
+==========
+
+- Human Interface Device (HID): Keyboard, Mouse, Generic
+- Mass Storage Class (MSC)
+- Hub with multiple-level support
+
+OS Abstraction layer
+====================
+
+TinyUSB is completely thread-safe by pushing all Interrupt Service Request (ISR) events into a central queue, then processing them later in the non-ISR context task function. It also uses semaphore/mutex to access shared resources such as Communication Device Class (CDC) FIFO. Therefore the stack needs to use some of the OS's basic APIs. Following OSes are already supported out of the box.
+
+- **No OS**
+- **FreeRTOS**
+- `RT-Thread `_: `repo `_
+- **Mynewt** Due to the newt package build system, Mynewt examples are better to be on its `own repo `_
+
+Docs
+====
+
+- Info
+
+ - `Uses`_
+ - `Changelog`_
+ - `Contributors`_
+
+- `Reference`_
+
+ - `Supported Devices`_
+ - `Getting Started`_
+ - `Concurrency`_
+
+- `Contributing`_
+
+ - `Code of Conduct`_
+ - `Structure`_
+ - `Porting`_
+
+License
+=======
+
+All TinyUSB sources in the ``src`` folder are licensed under MIT
+license, the `Full license is here `__. However, each file can be
+individually licensed especially those in ``lib`` and ``hw/mcu`` folder.
+Please make sure you understand all the license term for files you use
+in your project.
+
+
+.. |Build Status| image:: https://github.com/hathach/tinyusb/workflows/Build/badge.svg
+ :target: https://github.com/hathach/tinyusb/actions
+.. |Documentation Status| image:: https://readthedocs.org/projects/tinyusb/badge/?version=latest
+ :target: https://docs.tinyusb.org/en/latest/?badge=latest
+.. |Fuzzing Status| image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/tinyusb.svg
+ :target: https://oss-fuzz-build-logs.storage.googleapis.com/index.html#tinyusb
+.. |License| image:: https://img.shields.io/badge/license-MIT-brightgreen.svg
+ :target: https://opensource.org/licenses/MIT
+
+
+.. _Uses: docs/info/uses.rst
+.. _Changelog: docs/info/changelog.rst
+.. _Contributors: CONTRIBUTORS.rst
+.. _Reference: docs/reference/index.rst
+.. _Supported Devices: docs/reference/supported.rst
+.. _Getting Started: docs/reference/getting_started.rst
+.. _Concurrency: docs/reference/concurrency.rst
+.. _Contributing: docs/contributing/index.rst
+.. _Code of Conduct: CODE_OF_CONDUCT.rst
+.. _Structure: docs/contributing/structure.rst
+.. _Porting: docs/contributing/porting.rst
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/tusb_config.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/tusb_config.h
new file mode 100644
index 000000000..9536f9641
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/tusb_config.h
@@ -0,0 +1,130 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+#ifndef _TUSB_CONFIG_H_
+#define _TUSB_CONFIG_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Board Specific Configuration
+//--------------------------------------------------------------------+
+
+// RHPort number used for device can be defined by board.mk, default to port 0
+#ifndef BOARD_TUD_RHPORT
+#define BOARD_TUD_RHPORT 0
+#endif
+
+// RHPort max operational speed can defined by board.mk
+#ifndef BOARD_TUD_MAX_SPEED
+#define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED
+#endif
+
+//--------------------------------------------------------------------
+// COMMON CONFIGURATION
+//--------------------------------------------------------------------
+
+ // Select the MCU port to use
+#ifndef CFG_TUSB_MCU
+#define CFG_TUSB_MCU OPT_MCU_TM4C123
+#endif
+
+#ifndef CFG_TUSB_OS
+#define CFG_TUSB_OS OPT_OS_NONE
+#endif
+
+#ifndef CFG_TUSB_DEBUG
+#define CFG_TUSB_DEBUG 0
+#endif
+
+// Enable Device stack
+#define CFG_TUD_ENABLED 1
+
+// Default is max speed that hardware controller could support with on-chip PHY
+#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED
+
+// Added feature in the port to support polling only mode, without interrupts. This does
+// require tud_int_handler() to be called continuously in the program's infinite loop.
+#define CFG_TUSB_POLLING_ENABLED 1
+
+// Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+// makes it possible to automatically install WinUSB devices without having to provide
+// a device specific INF file.
+#define CFG_TUD_WINUSB_ENABLED 1
+
+/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
+ * Tinyusb use follows macros to declare transferring memory so that they can be put
+ * into those specific section.
+ * e.g
+ * - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") ))
+ * - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4)))
+ */
+#ifndef CFG_TUSB_MEM_SECTION
+#define CFG_TUSB_MEM_SECTION
+#endif
+
+#ifndef CFG_TUSB_MEM_ALIGN
+#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4)))
+#endif
+
+//--------------------------------------------------------------------
+// DEVICE CONFIGURATION
+//--------------------------------------------------------------------
+
+#ifndef CFG_TUD_ENDPOINT0_SIZE
+#define CFG_TUD_ENDPOINT0_SIZE 64
+#endif
+
+//------------- CLASS -------------//
+#define CFG_TUD_CDC 0
+#define CFG_TUD_MSC 0
+#define CFG_TUD_HID 0
+#define CFG_TUD_MIDI 0
+#define CFG_TUD_VENDOR 1
+
+// Vendor FIFO size of TX and RX
+// If not configured vendor endpoints will not be buffered
+#define CFG_TUD_VENDOR_RX_BUFSIZE (64)
+#define CFG_TUD_VENDOR_TX_BUFSIZE (64)
+
+//--------------------------------------------------------------------
+// WORKAROUND
+//--------------------------------------------------------------------
+#if defined ( __ICCARM__ )
+// IAR doesn't offer the function __builtin_ctz(). It does offer
+// __clz() and __rbit() which can be used instead.
+//
+// More info: https://github.com/hathach/tinyusb/issues/2060
+#include
+#define __builtin_ctz(x) __clz(__rbit(x))
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_CONFIG_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/usb_descriptors.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/usb_descriptors.c
new file mode 100644
index 000000000..03dc5f718
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/cfg/usb_descriptors.c
@@ -0,0 +1,251 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+#include "tusb.h"
+
+
+#define USB_VID 0x1D50 // OpenMoko
+#define USB_PID 0x60AC // OpenBLT Bootloader
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+#define USB_BCD 0x0201 // Needs to be >= 2.01 for BOS
+#else
+#define USB_BCD 0x0200
+#endif
+
+//--------------------------------------------------------------------+
+// Device Descriptors
+//--------------------------------------------------------------------+
+tusb_desc_device_t const desc_device =
+{
+ .bLength = sizeof(tusb_desc_device_t),
+ .bDescriptorType = TUSB_DESC_DEVICE,
+ .bcdUSB = USB_BCD,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+
+ .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
+
+ .idVendor = USB_VID,
+ .idProduct = USB_PID,
+ .bcdDevice = 0x0100,
+
+ .iManufacturer = 0x01,
+ .iProduct = 0x02,
+ .iSerialNumber = 0x03,
+
+ .bNumConfigurations = 0x01
+};
+
+// Invoked when received GET DEVICE DESCRIPTOR
+// Application return pointer to descriptor
+uint8_t const * tud_descriptor_device_cb(void)
+{
+ return (uint8_t const *) &desc_device;
+}
+
+//--------------------------------------------------------------------+
+// Configuration Descriptor
+//--------------------------------------------------------------------+
+
+enum
+{
+ ITF_NUM_VENDOR,
+ ITF_NUM_TOTAL
+};
+
+#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VENDOR_DESC_LEN)
+
+#define EPNUM_VENDOR_OUT 0x01
+#define EPNUM_VENDOR_IN 0x81
+
+uint8_t const desc_fs_configuration[] =
+{
+ // Config number, interface count, string index, total length, attribute, power in mA
+ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 150),
+
+ // Interface number, string index, EP Out & EP In address, EP size
+ TUD_VENDOR_DESCRIPTOR(ITF_NUM_VENDOR, 0, EPNUM_VENDOR_OUT, EPNUM_VENDOR_IN, 64),
+};
+
+// Invoked when received GET CONFIGURATION DESCRIPTOR
+// Application return pointer to descriptor
+// Descriptor contents must exist long enough for transfer to complete
+uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
+{
+ (void) index; // for multiple configurations
+
+ return desc_fs_configuration;
+}
+
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+//--------------------------------------------------------------------+
+// BOS Descriptor
+//--------------------------------------------------------------------+
+
+/* Microsoft OS 2.0 registry property descriptor per MS requirements:
+ * https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx
+ * device should create DeviceInterfaceGUID. It can be done by driver and
+ * in case of real PnP solution device should expose MS "Microsoft OS 2.0
+ * registry property descriptor". Such descriptor can insert any record
+ * into Windows registry per device/configuration/interface. In our case it
+ * will insert "DeviceInterfaceGUID" string property.
+ */
+
+#define BOS_TOTAL_LEN (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)
+
+#define MS_OS_20_DESC_LEN 0x9E
+
+#define VENDOR_REQUEST_MICROSOFT 1
+
+// BOS Descriptor is required for MS OS 2.0.
+uint8_t const desc_bos[] =
+{
+ // total length, number of device caps
+ TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),
+
+ // Microsoft OS 2.0 descriptor
+ TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, VENDOR_REQUEST_MICROSOFT)
+};
+
+uint8_t const * tud_descriptor_bos_cb(void)
+{
+ return desc_bos;
+}
+
+uint8_t const desc_ms_os_20[] =
+{
+ // Set header: length, type, windows version, total length
+ U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),
+
+ // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID
+ U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible
+
+ // MS OS 2.0 Registry property descriptor: length, type
+ U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),
+ U16_TO_U8S_LE(0x0001), U16_TO_U8S_LE(0x0028), // wPropertyDataType, wPropertyNameLength and PropertyName "DeviceInterfaceGUID\0" in UTF-16
+ 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,
+ 'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00,
+
+ U16_TO_U8S_LE(0x004E), // wPropertyDataLength
+ //bPropertyData: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0"
+ '{', 0x00, '8', 0x00, '0', 0x00, '7', 0x00, '9', 0x00, '9', 0x00, '9', 0x00, 'C', 0x00, '3', 0x00, '-', 0x00,
+ 'E', 0x00, '4', 0x00, 'E', 0x00, '0', 0x00, '-', 0x00, '4', 0x00, '0', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00,
+ '8', 0x00, '1', 0x00, '8', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '8', 0x00, 'E', 0x00, '8', 0x00, '5', 0x00,
+ '2', 0x00, 'B', 0x00, '5', 0x00, '4', 0x00, 'F', 0x00, '2', 0x00, 'B', 0x00, '}', 0x00, 0x00, 0x00
+};
+
+TU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, "Incorrect size");
+
+bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
+{
+ // nothing to with DATA & ACK stage
+ if (stage != CONTROL_STAGE_SETUP) return true;
+
+ switch (request->bmRequestType_bit.type)
+ {
+ case TUSB_REQ_TYPE_VENDOR:
+ switch (request->bRequest)
+ {
+ case VENDOR_REQUEST_MICROSOFT:
+ if ( request->wIndex == 7 )
+ {
+ // Get Microsoft OS 2.0 compatible descriptor
+ uint16_t total_len;
+ memcpy(&total_len, desc_ms_os_20+8, 2);
+
+ return tud_control_xfer(rhport, request, (void*)(uintptr_t) desc_ms_os_20, total_len);
+ }else
+ {
+ return false;
+ }
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // stall unknown request
+ return false;
+}
+#endif /* (CFG_TUD_WINUSB_ENABLED == 1) */
+
+//--------------------------------------------------------------------+
+// String Descriptors
+//--------------------------------------------------------------------+
+
+// array of pointer to string descriptors
+char const* string_desc_arr [] =
+{
+ (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
+ "OpenBLT User", // 1: Manufacturer
+ "WinUSB Bulk Device", // 2: Product
+ "0123456789", // 3: Serials, should use chip ID
+};
+
+static uint16_t _desc_str[32];
+
+// Invoked when received GET STRING DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
+uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
+{
+ (void) langid;
+
+ uint8_t chr_count;
+
+ if ( index == 0)
+ {
+ memcpy(&_desc_str[1], string_desc_arr[0], 2);
+ chr_count = 1;
+ }else
+ {
+ // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.
+ // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors
+
+ if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL;
+
+ const char* str = string_desc_arr[index];
+
+ // Cap at max char
+ chr_count = (uint8_t) strlen(str);
+ if ( chr_count > 31 ) chr_count = 31;
+
+ // Convert ASCII string into UTF-16
+ for(uint8_t i=0; i 8 && defined(__ARM_FEATURE_UNALIGNED)
+/* GCC warns that an address may be unaligned, even though
+ * the target CPU has the capability for unaligned memory access. */
+_Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"");
+#endif
+
+#include "device/dcd.h"
+
+#if TU_CHECK_MCU(OPT_MCU_MSP432E4)
+ #include "musb_msp432e.h"
+
+#elif TU_CHECK_MCU(OPT_MCU_TM4C123, OPT_MCU_TM4C129)
+ #include "musb_tm4c.h"
+
+ // HACK generalize later
+ #include "musb_type.h"
+ #define FIFO0_WORD FIFO0
+ #define FIFO1_WORD FIFO1
+
+#else
+ #error "Unsupported MCUs"
+#endif
+
+/*------------------------------------------------------------------
+ * MACRO TYPEDEF CONSTANT ENUM DECLARATION
+ *------------------------------------------------------------------*/
+#define REQUEST_TYPE_INVALID (0xFFu)
+
+typedef struct {
+ uint_fast16_t beg; /* offset of including first element */
+ uint_fast16_t end; /* offset of excluding the last element */
+} free_block_t;
+
+typedef struct TU_ATTR_PACKED {
+ uint16_t TXMAXP;
+ uint8_t TXCSRL;
+ uint8_t TXCSRH;
+ uint16_t RXMAXP;
+ uint8_t RXCSRL;
+ uint8_t RXCSRH;
+ uint16_t RXCOUNT;
+ uint16_t RESERVED[3];
+} hw_endpoint_t;
+
+typedef union {
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+} hw_fifo_t;
+
+typedef struct TU_ATTR_PACKED
+{
+ void *buf; /* the start address of a transfer data buffer */
+ uint16_t length; /* the number of bytes in the buffer */
+ uint16_t remaining; /* the number of bytes remaining in the buffer */
+} pipe_state_t;
+
+typedef struct
+{
+ tusb_control_request_t setup_packet;
+ uint16_t remaining_ctrl; /* The number of bytes remaining in data stage of control transfer. */
+ int8_t status_out;
+ pipe_state_t pipe0;
+ pipe_state_t pipe[2][7]; /* pipe[direction][endpoint number - 1] */
+ uint16_t pipe_buf_is_fifo[2]; /* Bitmap. Each bit means whether 1:TU_FIFO or 0:POD. */
+} dcd_data_t;
+
+/*------------------------------------------------------------------
+ * INTERNAL OBJECT & FUNCTION DECLARATION
+ *------------------------------------------------------------------*/
+static dcd_data_t _dcd;
+
+
+static inline free_block_t *find_containing_block(free_block_t *beg, free_block_t *end, uint_fast16_t addr)
+{
+ free_block_t *cur = beg;
+ for (; cur < end && ((addr < cur->beg) || (cur->end <= addr)); ++cur) ;
+ return cur;
+}
+
+static inline int update_free_block_list(free_block_t *blks, unsigned num, uint_fast16_t addr, uint_fast16_t size)
+{
+ free_block_t *p = find_containing_block(blks, blks + num, addr);
+ TU_ASSERT(p != blks + num, -2);
+ if (p->beg == addr) {
+ /* Shrink block */
+ p->beg = addr + size;
+ if (p->beg != p->end) return 0;
+ /* remove block */
+ free_block_t *end = blks + num;
+ while (p + 1 < end) {
+ *p = *(p + 1);
+ ++p;
+ }
+ return -1;
+ } else {
+ /* Split into 2 blocks */
+ free_block_t tmp = {
+ .beg = addr + size,
+ .end = p->end
+ };
+ p->end = addr;
+ if (p->beg == p->end) {
+ if (tmp.beg != tmp.end) {
+ *p = tmp;
+ return 0;
+ }
+ /* remove block */
+ free_block_t *end = blks + num;
+ while (p + 1 < end) {
+ *p = *(p + 1);
+ ++p;
+ }
+ return -1;
+ }
+ if (tmp.beg == tmp.end) return 0;
+ blks[num] = tmp;
+ return 1;
+ }
+}
+
+static inline unsigned free_block_size(free_block_t const *blk)
+{
+ return blk->end - blk->beg;
+}
+
+#if 0
+static inline void print_block_list(free_block_t const *blk, unsigned num)
+{
+ TU_LOG1("*************\n");
+ for (unsigned i = 0; i < num; ++i) {
+ TU_LOG1(" Blk%u %u %u\n", i, blk->beg, blk->end);
+ ++blk;
+ }
+}
+#else
+#define print_block_list(a,b)
+#endif
+
+static unsigned find_free_memory(uint_fast16_t size_in_log2_minus3)
+{
+ free_block_t free_blocks[2 * (TUP_DCD_ENDPOINT_MAX - 1)];
+ unsigned num_blocks = 1;
+
+ /* Initialize free memory block list */
+ free_blocks[0].beg = 64 / 8;
+ free_blocks[0].end = (4 << 10) / 8; /* 4KiB / 8 bytes */
+ for (int i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {
+ uint_fast16_t addr;
+ int num;
+ USB0->EPIDX = i;
+ addr = USB0->TXFIFOADD;
+ if (addr) {
+ unsigned sz = USB0->TXFIFOSZ;
+ unsigned sft = (sz & USB_TXFIFOSZ_SIZE_M) + ((sz & USB_TXFIFOSZ_DPB) ? 1: 0);
+ num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);
+ TU_ASSERT(-2 < num, 0);
+ num_blocks += num;
+ print_block_list(free_blocks, num_blocks);
+ }
+ addr = USB0->RXFIFOADD;
+ if (addr) {
+ unsigned sz = USB0->RXFIFOSZ;
+ unsigned sft = (sz & USB_RXFIFOSZ_SIZE_M) + ((sz & USB_RXFIFOSZ_DPB) ? 1: 0);
+ num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);
+ TU_ASSERT(-2 < num, 0);
+ num_blocks += num;
+ print_block_list(free_blocks, num_blocks);
+ }
+ }
+ print_block_list(free_blocks, num_blocks);
+
+ /* Find the best fit memory block */
+ uint_fast16_t size_in_8byte_unit = 1 << size_in_log2_minus3;
+ free_block_t const *min = NULL;
+ uint_fast16_t min_sz = 0xFFFFu;
+ free_block_t const *end = &free_blocks[num_blocks];
+ for (free_block_t const *cur = &free_blocks[0]; cur < end; ++cur) {
+ uint_fast16_t sz = free_block_size(cur);
+ if (sz < size_in_8byte_unit) continue;
+ if (size_in_8byte_unit == sz) return cur->beg;
+ if (sz < min_sz) min = cur;
+ }
+ TU_ASSERT(min, 0);
+ return min->beg;
+}
+
+static inline volatile hw_endpoint_t* edpt_regs(unsigned epnum_minus1)
+{
+ volatile hw_endpoint_t *regs = (volatile hw_endpoint_t*)((uintptr_t)&USB0->TXMAXP1);
+ return regs + epnum_minus1;
+}
+
+static void pipe_write_packet(void *buf, volatile void *fifo, unsigned len)
+{
+ volatile hw_fifo_t *reg = (volatile hw_fifo_t*)fifo;
+ uintptr_t addr = (uintptr_t)buf;
+ while (len >= 4) {
+ reg->u32 = *(uint32_t const *)addr;
+ addr += 4;
+ len -= 4;
+ }
+ if (len >= 2) {
+ reg->u16 = *(uint16_t const *)addr;
+ addr += 2;
+ len -= 2;
+ }
+ if (len) {
+ reg->u8 = *(uint8_t const *)addr;
+ }
+}
+
+static void pipe_read_packet(void *buf, volatile void *fifo, unsigned len)
+{
+ volatile hw_fifo_t *reg = (volatile hw_fifo_t*)fifo;
+ uintptr_t addr = (uintptr_t)buf;
+ while (len >= 4) {
+ *(uint32_t *)addr = reg->u32;
+ addr += 4;
+ len -= 4;
+ }
+ if (len >= 2) {
+ *(uint16_t *)addr = reg->u16;
+ addr += 2;
+ len -= 2;
+ }
+ if (len) {
+ *(uint8_t *)addr = reg->u8;
+ }
+}
+
+static void pipe_read_write_packet_ff(tu_fifo_t *f, volatile void *fifo, unsigned len, unsigned dir)
+{
+ static const struct {
+ void (*tu_fifo_get_info)(tu_fifo_t *f, tu_fifo_buffer_info_t *info);
+ void (*tu_fifo_advance)(tu_fifo_t *f, uint16_t n);
+ void (*pipe_read_write)(void *buf, volatile void *fifo, unsigned len);
+ } ops[] = {
+ /* OUT */ {tu_fifo_get_write_info,tu_fifo_advance_write_pointer,pipe_read_packet},
+ /* IN */ {tu_fifo_get_read_info, tu_fifo_advance_read_pointer, pipe_write_packet},
+ };
+ tu_fifo_buffer_info_t info;
+ ops[dir].tu_fifo_get_info(f, &info);
+ unsigned total_len = len;
+ len = TU_MIN(total_len, info.len_lin);
+ ops[dir].pipe_read_write(info.ptr_lin, fifo, len);
+ unsigned rem = total_len - len;
+ if (rem) {
+ len = TU_MIN(rem, info.len_wrap);
+ ops[dir].pipe_read_write(info.ptr_wrap, fifo, len);
+ rem -= len;
+ }
+ ops[dir].tu_fifo_advance(f, total_len - rem);
+}
+
+static void process_setup_packet(uint8_t rhport)
+{
+ uint32_t *p = (void*)&_dcd.setup_packet;
+ p[0] = USB0->FIFO0_WORD;
+ p[1] = USB0->FIFO0_WORD;
+
+ _dcd.pipe0.buf = NULL;
+ _dcd.pipe0.length = 0;
+ _dcd.pipe0.remaining = 0;
+ dcd_event_setup_received(rhport, (const uint8_t*)(uintptr_t)&_dcd.setup_packet, true);
+
+ const unsigned len = _dcd.setup_packet.wLength;
+ _dcd.remaining_ctrl = len;
+ const unsigned dir_in = tu_edpt_dir(_dcd.setup_packet.bmRequestType);
+ /* Clear RX FIFO and reverse the transaction direction */
+ if (len && dir_in) USB0->CSRL0 = USB_CSRL0_RXRDYC;
+}
+
+static bool handle_xfer_in(uint_fast8_t ep_addr)
+{
+ unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;
+ pipe_state_t *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];
+ const unsigned rem = pipe->remaining;
+
+ if (!rem) {
+ pipe->buf = NULL;
+ return true;
+ }
+
+ volatile hw_endpoint_t *regs = edpt_regs(epnum_minus1);
+ const unsigned mps = regs->TXMAXP;
+ const unsigned len = TU_MIN(mps, rem);
+ void *buf = pipe->buf;
+ // TU_LOG1(" %p mps %d len %d rem %d\n", buf, mps, len, rem);
+ if (len) {
+ if (_dcd.pipe_buf_is_fifo[TUSB_DIR_IN] & TU_BIT(epnum_minus1)) {
+ pipe_read_write_packet_ff(buf, &USB0->FIFO1_WORD + epnum_minus1, len, TUSB_DIR_IN);
+ } else {
+ pipe_write_packet(buf, &USB0->FIFO1_WORD + epnum_minus1, len);
+ pipe->buf = (void *)((uint32_t)buf + len);
+ }
+ pipe->remaining = rem - len;
+ }
+ regs->TXCSRL = USB_TXCSRL1_TXRDY;
+ // TU_LOG1(" TXCSRL%d = %x %d\n", epnum_minus1 + 1, regs->TXCSRL, rem - len);
+ return false;
+}
+
+static bool handle_xfer_out(uint_fast8_t ep_addr)
+{
+ unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;
+ pipe_state_t *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];
+ volatile hw_endpoint_t *regs = edpt_regs(epnum_minus1);
+ // TU_LOG1(" RXCSRL%d = %x\n", epnum_minus1 + 1, regs->RXCSRL);
+
+ TU_ASSERT(regs->RXCSRL & USB_RXCSRL1_RXRDY);
+
+ const unsigned mps = regs->RXMAXP;
+ const unsigned rem = pipe->remaining;
+ const unsigned vld = regs->RXCOUNT;
+ const unsigned len = TU_MIN(TU_MIN(rem, mps), vld);
+ void *buf = pipe->buf;
+ if (len) {
+ if (_dcd.pipe_buf_is_fifo[TUSB_DIR_OUT] & TU_BIT(epnum_minus1)) {
+ pipe_read_write_packet_ff(buf, &USB0->FIFO1_WORD + epnum_minus1, len, TUSB_DIR_OUT);
+ } else {
+ pipe_read_packet(buf, &USB0->FIFO1_WORD + epnum_minus1, len);
+ pipe->buf = (void *)((uint32_t)buf + len);
+ }
+ pipe->remaining = rem - len;
+ }
+ if ((len < mps) || (rem == len)) {
+ pipe->buf = NULL;
+ return NULL != buf;
+ }
+ regs->RXCSRL = 0; /* Clear RXRDY bit */
+ return false;
+}
+
+static bool edpt_n_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
+{
+ (void)rhport;
+
+ unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;
+ unsigned dir_in = tu_edpt_dir(ep_addr);
+
+ pipe_state_t *pipe = &_dcd.pipe[dir_in][epnum_minus1];
+ pipe->buf = buffer;
+ pipe->length = total_bytes;
+ pipe->remaining = total_bytes;
+
+ if (dir_in) {
+ handle_xfer_in(ep_addr);
+ } else {
+ volatile hw_endpoint_t *regs = edpt_regs(epnum_minus1);
+ if (regs->RXCSRL & USB_RXCSRL1_RXRDY) regs->RXCSRL = 0;
+ }
+ return true;
+}
+
+static bool edpt0_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
+{
+ (void)rhport;
+ TU_ASSERT(total_bytes <= 64); /* Current implementation supports for only up to 64 bytes. */
+
+ const unsigned req = _dcd.setup_packet.bmRequestType;
+ TU_ASSERT(req != REQUEST_TYPE_INVALID || total_bytes == 0);
+
+ if (req == REQUEST_TYPE_INVALID || _dcd.status_out) {
+ /* STATUS OUT stage.
+ * MUSB controller automatically handles STATUS OUT packets without
+ * software helps. We do not have to do anything. And STATUS stage
+ * may have already finished and received the next setup packet
+ * without calling this function, so we have no choice but to
+ * invoke the callback function of status packet here. */
+ // TU_LOG1(" STATUS OUT USB0->CSRL0 = %x\n", USB0->CSRL0);
+ _dcd.status_out = 0;
+ if (req == REQUEST_TYPE_INVALID) {
+ dcd_event_xfer_complete(rhport, ep_addr, total_bytes, XFER_RESULT_SUCCESS, false);
+ } else {
+ /* The next setup packet has already been received, it aborts
+ * invoking callback function to avoid confusing TUSB stack. */
+ TU_LOG1("Drop CONTROL_STAGE_ACK\n");
+ }
+ return true;
+ }
+ const unsigned dir_in = tu_edpt_dir(ep_addr);
+ if (tu_edpt_dir(req) == dir_in) { /* DATA stage */
+ TU_ASSERT(total_bytes <= _dcd.remaining_ctrl);
+ const unsigned rem = _dcd.remaining_ctrl;
+ const unsigned len = TU_MIN(TU_MIN(rem, 64), total_bytes);
+ if (dir_in) {
+ pipe_write_packet(buffer, &USB0->FIFO0_WORD, len);
+
+ _dcd.pipe0.buf = buffer + len;
+ _dcd.pipe0.length = len;
+ _dcd.pipe0.remaining = 0;
+
+ _dcd.remaining_ctrl = rem - len;
+ if ((len < 64) || (rem == len)) {
+ _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID; /* Change to STATUS/SETUP stage */
+ _dcd.status_out = 1;
+ /* Flush TX FIFO and reverse the transaction direction. */
+ USB0->CSRL0 = USB_CSRL0_TXRDY | USB_CSRL0_DATAEND;
+ } else {
+ USB0->CSRL0 = USB_CSRL0_TXRDY; /* Flush TX FIFO to return ACK. */
+ }
+ // TU_LOG1(" IN USB0->CSRL0 = %x\n", USB0->CSRL0);
+ } else {
+ // TU_LOG1(" OUT USB0->CSRL0 = %x\n", USB0->CSRL0);
+ _dcd.pipe0.buf = buffer;
+ _dcd.pipe0.length = len;
+ _dcd.pipe0.remaining = len;
+ USB0->CSRL0 = USB_CSRL0_RXRDYC; /* Clear RX FIFO to return ACK. */
+ }
+ } else if (dir_in) {
+ // TU_LOG1(" STATUS IN USB0->CSRL0 = %x\n", USB0->CSRL0);
+ _dcd.pipe0.buf = NULL;
+ _dcd.pipe0.length = 0;
+ _dcd.pipe0.remaining = 0;
+ /* Clear RX FIFO and reverse the transaction direction */
+ USB0->CSRL0 = USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND;
+ }
+ return true;
+}
+
+static void process_ep0(uint8_t rhport)
+{
+ uint_fast8_t csrl = USB0->CSRL0;
+
+ // TU_LOG1(" EP0 USB0->CSRL0 = %x\n", csrl);
+
+ if (csrl & USB_CSRL0_STALLED) {
+ /* Returned STALL packet to HOST. */
+ USB0->CSRL0 = 0; /* Clear STALL */
+ return;
+ }
+
+ unsigned req = _dcd.setup_packet.bmRequestType;
+ if (csrl & USB_CSRL0_SETEND) {
+ TU_LOG1(" ABORT by the next packets\n");
+ USB0->CSRL0 = USB_CSRL0_SETENDC;
+ if (req != REQUEST_TYPE_INVALID && _dcd.pipe0.buf) {
+ /* DATA stage was aborted by receiving STATUS or SETUP packet. */
+ _dcd.pipe0.buf = NULL;
+ _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
+ dcd_event_xfer_complete(rhport,
+ req & TUSB_DIR_IN_MASK,
+ _dcd.pipe0.length - _dcd.pipe0.remaining,
+ XFER_RESULT_SUCCESS, true);
+ }
+ req = REQUEST_TYPE_INVALID;
+ if (!(csrl & USB_CSRL0_RXRDY)) return; /* Received SETUP packet */
+ }
+
+ if (csrl & USB_CSRL0_RXRDY) {
+ /* Received SETUP or DATA OUT packet */
+ if (req == REQUEST_TYPE_INVALID) {
+ /* SETUP */
+ TU_ASSERT(sizeof(tusb_control_request_t) == USB0->COUNT0,);
+ process_setup_packet(rhport);
+ return;
+ }
+ if (_dcd.pipe0.buf) {
+ /* DATA OUT */
+ const unsigned vld = USB0->COUNT0;
+ const unsigned rem = _dcd.pipe0.remaining;
+ const unsigned len = TU_MIN(TU_MIN(rem, 64), vld);
+ pipe_read_packet(_dcd.pipe0.buf, &USB0->FIFO0_WORD, len);
+
+ _dcd.pipe0.remaining = rem - len;
+ _dcd.remaining_ctrl -= len;
+
+ _dcd.pipe0.buf = NULL;
+ dcd_event_xfer_complete(rhport,
+ tu_edpt_addr(0, TUSB_DIR_OUT),
+ _dcd.pipe0.length - _dcd.pipe0.remaining,
+ XFER_RESULT_SUCCESS, true);
+ }
+ return;
+ }
+
+ /* When CSRL0 is zero, it means that completion of sending a any length packet
+ * or receiving a zero length packet. */
+ if (req != REQUEST_TYPE_INVALID && !tu_edpt_dir(req)) {
+ /* STATUS IN */
+ if (*(const uint16_t*)(uintptr_t)&_dcd.setup_packet == 0x0500) {
+ /* The address must be changed on completion of the control transfer. */
+ USB0->FADDR = (uint8_t)_dcd.setup_packet.wValue;
+ }
+ _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
+ dcd_event_xfer_complete(rhport,
+ tu_edpt_addr(0, TUSB_DIR_IN),
+ _dcd.pipe0.length - _dcd.pipe0.remaining,
+ XFER_RESULT_SUCCESS, true);
+ return;
+ }
+ if (_dcd.pipe0.buf) {
+ /* DATA IN */
+ _dcd.pipe0.buf = NULL;
+ dcd_event_xfer_complete(rhport,
+ tu_edpt_addr(0, TUSB_DIR_IN),
+ _dcd.pipe0.length - _dcd.pipe0.remaining,
+ XFER_RESULT_SUCCESS, true);
+ }
+}
+
+static void process_edpt_n(uint8_t rhport, uint_fast8_t ep_addr)
+{
+ bool completed;
+ const unsigned dir_in = tu_edpt_dir(ep_addr);
+ const unsigned epn_minus1 = tu_edpt_number(ep_addr) - 1;
+
+ volatile hw_endpoint_t *regs = edpt_regs(epn_minus1);
+ if (dir_in) {
+ // TU_LOG1(" TXCSRL%d = %x\n", epn_minus1 + 1, regs->TXCSRL);
+ if (regs->TXCSRL & USB_TXCSRL1_STALLED) {
+ regs->TXCSRL &= ~(USB_TXCSRL1_STALLED | USB_TXCSRL1_UNDRN);
+ return;
+ }
+ completed = handle_xfer_in(ep_addr);
+ } else {
+ // TU_LOG1(" RXCSRL%d = %x\n", epn_minus1 + 1, regs->RXCSRL);
+ if (regs->RXCSRL & USB_RXCSRL1_STALLED) {
+ regs->RXCSRL &= ~(USB_RXCSRL1_STALLED | USB_RXCSRL1_OVER);
+ return;
+ }
+ completed = handle_xfer_out(ep_addr);
+ }
+
+ if (completed) {
+ pipe_state_t *pipe = &_dcd.pipe[dir_in][tu_edpt_number(ep_addr) - 1];
+ dcd_event_xfer_complete(rhport, ep_addr,
+ pipe->length - pipe->remaining,
+ XFER_RESULT_SUCCESS, true);
+ }
+}
+
+static void process_bus_reset(uint8_t rhport)
+{
+ /* When bmRequestType is REQUEST_TYPE_INVALID(0xFF),
+ * a control transfer state is SETUP or STATUS stage. */
+ _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
+ _dcd.status_out = 0;
+ /* When pipe0.buf has not NULL, DATA stage works in progress. */
+ _dcd.pipe0.buf = NULL;
+
+ USB0->TXIE = 1; /* Enable only EP0 */
+ USB0->RXIE = 0;
+
+ /* Clear FIFO settings */
+ for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {
+ USB0->EPIDX = i;
+ USB0->TXFIFOSZ = 0;
+ USB0->TXFIFOADD = 0;
+ USB0->RXFIFOSZ = 0;
+ USB0->RXFIFOADD = 0;
+ }
+ dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);
+}
+
+/*------------------------------------------------------------------
+ * Device API
+ *------------------------------------------------------------------*/
+
+void dcd_init(uint8_t rhport)
+{
+ (void)rhport;
+ USB0->IE |= USB_IE_SUSPND;
+ NVIC_ClearPendingIRQ(USB0_IRQn);
+
+ dcd_connect(rhport);
+}
+
+void dcd_int_enable(uint8_t rhport)
+{
+ (void)rhport;
+
+ #if CFG_TUSB_POLLING_ENABLED == 0
+ NVIC_EnableIRQ(USB0_IRQn);
+ #endif
+}
+
+void dcd_int_disable(uint8_t rhport)
+{
+ (void)rhport;
+
+ #if CFG_TUSB_POLLING_ENABLED == 0
+ NVIC_DisableIRQ(USB0_IRQn);
+ #endif
+}
+
+// Receive Set Address request, mcu port must also include status IN response
+void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
+{
+ (void)rhport;
+ (void)dev_addr;
+ _dcd.pipe0.buf = NULL;
+ _dcd.pipe0.length = 0;
+ _dcd.pipe0.remaining = 0;
+ /* Clear RX FIFO to return ACK. */
+ USB0->CSRL0 = USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND;
+}
+
+// Wake up host
+void dcd_remote_wakeup(uint8_t rhport)
+{
+ (void)rhport;
+ USB0->POWER |= USB_POWER_RESUME;
+
+ unsigned cnt = SystemCoreClock / 1000;
+ while (cnt--) __NOP();
+
+ USB0->POWER &= ~USB_POWER_RESUME;
+}
+
+// Connect by enabling internal pull-up resistor on D+/D-
+void dcd_connect(uint8_t rhport)
+{
+ (void)rhport;
+ USB0->POWER |= USB_POWER_SOFTCONN;
+}
+
+// Disconnect by disabling internal pull-up resistor on D+/D-
+void dcd_disconnect(uint8_t rhport)
+{
+ (void)rhport;
+ USB0->POWER &= ~USB_POWER_SOFTCONN;
+}
+
+void dcd_sof_enable(uint8_t rhport, bool en)
+{
+ (void) rhport;
+ (void) en;
+
+ // TODO implement later
+}
+
+//--------------------------------------------------------------------+
+// Endpoint API
+//--------------------------------------------------------------------+
+
+// Configure endpoint's registers according to descriptor
+bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)
+{
+ (void) rhport;
+
+ const unsigned ep_addr = ep_desc->bEndpointAddress;
+ const unsigned epn = tu_edpt_number(ep_addr);
+ const unsigned dir_in = tu_edpt_dir(ep_addr);
+ const unsigned xfer = ep_desc->bmAttributes.xfer;
+ const unsigned mps = tu_edpt_packet_size(ep_desc);
+
+ TU_ASSERT(epn < TUP_DCD_ENDPOINT_MAX);
+
+ pipe_state_t *pipe = &_dcd.pipe[dir_in][epn - 1];
+ pipe->buf = NULL;
+ pipe->length = 0;
+ pipe->remaining = 0;
+
+ volatile hw_endpoint_t *regs = edpt_regs(epn - 1);
+ if (dir_in) {
+ regs->TXMAXP = mps;
+ regs->TXCSRH = (xfer == TUSB_XFER_ISOCHRONOUS) ? USB_TXCSRH1_ISO : 0;
+ if (regs->TXCSRL & USB_TXCSRL1_TXRDY)
+ regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;
+ else
+ regs->TXCSRL = USB_TXCSRL1_CLRDT;
+ USB0->TXIE |= TU_BIT(epn);
+ } else {
+ regs->RXMAXP = mps;
+ regs->RXCSRH = (xfer == TUSB_XFER_ISOCHRONOUS) ? USB_RXCSRH1_ISO : 0;
+ if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
+ regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
+ else
+ regs->RXCSRL = USB_RXCSRL1_CLRDT;
+ USB0->RXIE |= TU_BIT(epn);
+ }
+
+ /* Setup FIFO */
+ int size_in_log2_minus3 = 28 - TU_MIN(28, __CLZ((uint32_t)mps));
+ if ((8u << size_in_log2_minus3) < mps) ++size_in_log2_minus3;
+ unsigned addr = find_free_memory(size_in_log2_minus3);
+ TU_ASSERT(addr);
+
+ USB0->EPIDX = epn;
+ if (dir_in) {
+ USB0->TXFIFOADD = addr;
+ USB0->TXFIFOSZ = size_in_log2_minus3;
+ } else {
+ USB0->RXFIFOADD = addr;
+ USB0->RXFIFOSZ = size_in_log2_minus3;
+ }
+
+ return true;
+}
+
+void dcd_edpt_close_all(uint8_t rhport)
+{
+ (void) rhport;
+ volatile hw_endpoint_t *regs = (volatile hw_endpoint_t *)(uintptr_t)&USB0->TXMAXP1;
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ USB0->TXIE = 1; /* Enable only EP0 */
+ USB0->RXIE = 0;
+ for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {
+ regs->TXMAXP = 0;
+ regs->TXCSRH = 0;
+ if (regs->TXCSRL & USB_TXCSRL1_TXRDY)
+ regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;
+ else
+ regs->TXCSRL = USB_TXCSRL1_CLRDT;
+
+ regs->RXMAXP = 0;
+ regs->RXCSRH = 0;
+ if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
+ regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
+ else
+ regs->RXCSRL = USB_RXCSRL1_CLRDT;
+
+ USB0->EPIDX = i;
+ USB0->TXFIFOSZ = 0;
+ USB0->TXFIFOADD = 0;
+ USB0->RXFIFOSZ = 0;
+ USB0->RXFIFOADD = 0;
+ }
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+}
+
+void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
+{
+ (void)rhport;
+ unsigned const epn = tu_edpt_number(ep_addr);
+ unsigned const dir_in = tu_edpt_dir(ep_addr);
+
+ hw_endpoint_t volatile *regs = edpt_regs(epn - 1);
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ if (dir_in) {
+ USB0->TXIE &= ~TU_BIT(epn);
+ regs->TXMAXP = 0;
+ regs->TXCSRH = 0;
+ if (regs->TXCSRL & USB_TXCSRL1_TXRDY)
+ regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;
+ else
+ regs->TXCSRL = USB_TXCSRL1_CLRDT;
+
+ USB0->EPIDX = epn;
+ USB0->TXFIFOSZ = 0;
+ USB0->TXFIFOADD = 0;
+ } else {
+ USB0->RXIE &= ~TU_BIT(epn);
+ regs->RXMAXP = 0;
+ regs->RXCSRH = 0;
+ if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
+ regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
+ else
+ regs->RXCSRL = USB_RXCSRL1_CLRDT;
+
+ USB0->EPIDX = epn;
+ USB0->RXFIFOSZ = 0;
+ USB0->RXFIFOADD = 0;
+ }
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+}
+
+// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack
+bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes)
+{
+ (void)rhport;
+ bool ret;
+ // TU_LOG1("X %x %d\n", ep_addr, total_bytes);
+ unsigned const epnum = tu_edpt_number(ep_addr);
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ if (epnum) {
+ _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] &= ~TU_BIT(epnum - 1);
+ ret = edpt_n_xfer(rhport, ep_addr, buffer, total_bytes);
+ } else
+ ret = edpt0_xfer(rhport, ep_addr, buffer, total_bytes);
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+ return ret;
+}
+
+// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack - optional, however, must be listed in usbd.c
+bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes)
+{
+ (void)rhport;
+ bool ret;
+ // TU_LOG1("X %x %d\n", ep_addr, total_bytes);
+ unsigned const epnum = tu_edpt_number(ep_addr);
+ TU_ASSERT(epnum);
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] |= TU_BIT(epnum - 1);
+ ret = edpt_n_xfer(rhport, ep_addr, (uint8_t*)ff, total_bytes);
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+ return ret;
+}
+
+// Stall endpoint
+void dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
+{
+ (void)rhport;
+ unsigned const epn = tu_edpt_number(ep_addr);
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ if (0 == epn) {
+ if (!ep_addr) { /* Ignore EP80 */
+ _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
+ _dcd.pipe0.buf = NULL;
+ USB0->CSRL0 = USB_CSRL0_STALL;
+ }
+ } else {
+ volatile hw_endpoint_t *regs = edpt_regs(epn - 1);
+ if (tu_edpt_dir(ep_addr)) { /* IN */
+ regs->TXCSRL = USB_TXCSRL1_STALL;
+ } else { /* OUT */
+ TU_ASSERT(!(regs->RXCSRL & USB_RXCSRL1_RXRDY),);
+ regs->RXCSRL = USB_RXCSRL1_STALL;
+ }
+ }
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+}
+
+// clear stall, data toggle is also reset to DATA0
+void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
+{
+ (void)rhport;
+ unsigned const epn = tu_edpt_number(ep_addr);
+ hw_endpoint_t volatile *regs = edpt_regs(epn - 1);
+ unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);
+ NVIC_DisableIRQ(USB0_IRQn);
+ if (tu_edpt_dir(ep_addr)) { /* IN */
+ regs->TXCSRL = USB_TXCSRL1_CLRDT;
+ } else { /* OUT */
+ regs->RXCSRL = USB_RXCSRL1_CLRDT;
+ }
+ if (ie) NVIC_EnableIRQ(USB0_IRQn);
+}
+
+/*-------------------------------------------------------------------
+ * ISR
+ *-------------------------------------------------------------------*/
+void dcd_int_handler(uint8_t rhport)
+{
+ uint_fast8_t is, txis, rxis;
+
+ is = USB0->IS; /* read and clear interrupt status */
+ txis = USB0->TXIS; /* read and clear interrupt status */
+ rxis = USB0->RXIS; /* read and clear interrupt status */
+ // TU_LOG1("D%2x T%2x R%2x\n", is, txis, rxis);
+
+ is &= USB0->IE; /* Clear disabled interrupts */
+ if (is & USB_IS_DISCON) {
+ }
+ if (is & USB_IS_SOF) {
+ dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
+ }
+ if (is & USB_IS_RESET) {
+ process_bus_reset(rhport);
+ }
+ if (is & USB_IS_RESUME) {
+ dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);
+ }
+ if (is & USB_IS_SUSPEND) {
+ dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);
+ }
+
+ txis &= USB0->TXIE; /* Clear disabled interrupts */
+ if (txis & USB_TXIE_EP0) {
+ process_ep0(rhport);
+ txis &= ~TU_BIT(0);
+ }
+ while (txis) {
+ unsigned const num = __builtin_ctz(txis);
+ process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_IN));
+ txis &= ~TU_BIT(num);
+ }
+ rxis &= USB0->RXIE; /* Clear disabled interrupts */
+ while (rxis) {
+ unsigned const num = __builtin_ctz(rxis);
+ process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_OUT));
+ rxis &= ~TU_BIT(num);
+ }
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_tm4c.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_tm4c.h
new file mode 100644
index 000000000..95ad9df6c
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_tm4c.h
@@ -0,0 +1,45 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_MUSB_TM4C_H_
+#define _TUSB_MUSB_TM4C_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if CFG_TUSB_MCU == OPT_MCU_TM4C123
+ #include "TM4C123.h"
+//#elif CFG_TUSB_MCU == OPT_MCU_TM4C129
+#else
+ #error "Unsupported MCUs"
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_type.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_type.h
new file mode 100644
index 000000000..8f83305a5
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/port/mentor/musb/musb_type.h
@@ -0,0 +1,2624 @@
+/******************************************************************************
+*
+* Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
+*
+* 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 Texas Instruments Incorporated 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.
+*
+*******************************************************************************/
+
+#ifndef _TUSB_MUSB_TYPE_H_
+#define _TUSB_MUSB_TYPE_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FADDR register.
+//
+//*****************************************************************************
+#define USB_FADDR_M 0x0000007F // Function Address
+#define USB_FADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_POWER register.
+//
+//*****************************************************************************
+#define USB_POWER_ISOUP 0x00000080 // Isochronous Update
+#define USB_POWER_SOFTCONN 0x00000040 // Soft Connect/Disconnect
+#define USB_POWER_HSENAB 0x00000020 // High Speed Enable
+#define USB_POWER_HSMODE 0x00000010 // High Speed Enable
+#define USB_POWER_RESET 0x00000008 // RESET Signaling
+#define USB_POWER_RESUME 0x00000004 // RESUME Signaling
+#define USB_POWER_SUSPEND 0x00000002 // SUSPEND Mode
+#define USB_POWER_PWRDNPHY 0x00000001 // Power Down PHY
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXIS register.
+//
+//*****************************************************************************
+#define USB_TXIS_EP7 0x00000080 // TX Endpoint 7 Interrupt
+#define USB_TXIS_EP6 0x00000040 // TX Endpoint 6 Interrupt
+#define USB_TXIS_EP5 0x00000020 // TX Endpoint 5 Interrupt
+#define USB_TXIS_EP4 0x00000010 // TX Endpoint 4 Interrupt
+#define USB_TXIS_EP3 0x00000008 // TX Endpoint 3 Interrupt
+#define USB_TXIS_EP2 0x00000004 // TX Endpoint 2 Interrupt
+#define USB_TXIS_EP1 0x00000002 // TX Endpoint 1 Interrupt
+#define USB_TXIS_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXIS register.
+//
+//*****************************************************************************
+#define USB_RXIS_EP7 0x00000080 // RX Endpoint 7 Interrupt
+#define USB_RXIS_EP6 0x00000040 // RX Endpoint 6 Interrupt
+#define USB_RXIS_EP5 0x00000020 // RX Endpoint 5 Interrupt
+#define USB_RXIS_EP4 0x00000010 // RX Endpoint 4 Interrupt
+#define USB_RXIS_EP3 0x00000008 // RX Endpoint 3 Interrupt
+#define USB_RXIS_EP2 0x00000004 // RX Endpoint 2 Interrupt
+#define USB_RXIS_EP1 0x00000002 // RX Endpoint 1 Interrupt
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXIE register.
+//
+//*****************************************************************************
+#define USB_TXIE_EP7 0x00000080 // TX Endpoint 7 Interrupt Enable
+#define USB_TXIE_EP6 0x00000040 // TX Endpoint 6 Interrupt Enable
+#define USB_TXIE_EP5 0x00000020 // TX Endpoint 5 Interrupt Enable
+#define USB_TXIE_EP4 0x00000010 // TX Endpoint 4 Interrupt Enable
+#define USB_TXIE_EP3 0x00000008 // TX Endpoint 3 Interrupt Enable
+#define USB_TXIE_EP2 0x00000004 // TX Endpoint 2 Interrupt Enable
+#define USB_TXIE_EP1 0x00000002 // TX Endpoint 1 Interrupt Enable
+#define USB_TXIE_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt
+ // Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXIE register.
+//
+//*****************************************************************************
+#define USB_RXIE_EP7 0x00000080 // RX Endpoint 7 Interrupt Enable
+#define USB_RXIE_EP6 0x00000040 // RX Endpoint 6 Interrupt Enable
+#define USB_RXIE_EP5 0x00000020 // RX Endpoint 5 Interrupt Enable
+#define USB_RXIE_EP4 0x00000010 // RX Endpoint 4 Interrupt Enable
+#define USB_RXIE_EP3 0x00000008 // RX Endpoint 3 Interrupt Enable
+#define USB_RXIE_EP2 0x00000004 // RX Endpoint 2 Interrupt Enable
+#define USB_RXIE_EP1 0x00000002 // RX Endpoint 1 Interrupt Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_IS register.
+//
+//*****************************************************************************
+#define USB_IS_VBUSERR 0x00000080 // VBUS Error (OTG only)
+#define USB_IS_SESREQ 0x00000040 // SESSION REQUEST (OTG only)
+#define USB_IS_DISCON 0x00000020 // Session Disconnect (OTG only)
+#define USB_IS_CONN 0x00000010 // Session Connect
+#define USB_IS_SOF 0x00000008 // Start of Frame
+#define USB_IS_BABBLE 0x00000004 // Babble Detected
+#define USB_IS_RESET 0x00000004 // RESET Signaling Detected
+#define USB_IS_RESUME 0x00000002 // RESUME Signaling Detected
+#define USB_IS_SUSPEND 0x00000001 // SUSPEND Signaling Detected
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_IE register.
+//
+//*****************************************************************************
+#define USB_IE_VBUSERR 0x00000080 // Enable VBUS Error Interrupt (OTG
+ // only)
+#define USB_IE_SESREQ 0x00000040 // Enable Session Request (OTG
+ // only)
+#define USB_IE_DISCON 0x00000020 // Enable Disconnect Interrupt
+#define USB_IE_CONN 0x00000010 // Enable Connect Interrupt
+#define USB_IE_SOF 0x00000008 // Enable Start-of-Frame Interrupt
+#define USB_IE_BABBLE 0x00000004 // Enable Babble Interrupt
+#define USB_IE_RESET 0x00000004 // Enable RESET Interrupt
+#define USB_IE_RESUME 0x00000002 // Enable RESUME Interrupt
+#define USB_IE_SUSPND 0x00000001 // Enable SUSPEND Interrupt
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FRAME register.
+//
+//*****************************************************************************
+#define USB_FRAME_M 0x000007FF // Frame Number
+#define USB_FRAME_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPIDX register.
+//
+//*****************************************************************************
+#define USB_EPIDX_EPIDX_M 0x0000000F // Endpoint Index
+#define USB_EPIDX_EPIDX_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TEST register.
+//
+//*****************************************************************************
+#define USB_TEST_FORCEH 0x00000080 // Force Host Mode
+#define USB_TEST_FIFOACC 0x00000040 // FIFO Access
+#define USB_TEST_FORCEFS 0x00000020 // Force Full-Speed Mode
+#define USB_TEST_FORCEHS 0x00000010 // Force High-Speed Mode
+#define USB_TEST_TESTPKT 0x00000008 // Test Packet Mode Enable
+#define USB_TEST_TESTK 0x00000004 // Test_K Mode Enable
+#define USB_TEST_TESTJ 0x00000002 // Test_J Mode Enable
+#define USB_TEST_TESTSE0NAK 0x00000001 // Test_SE0_NAK Test Mode Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO0 register.
+//
+//*****************************************************************************
+#define USB_FIFO0_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO0_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO1 register.
+//
+//*****************************************************************************
+#define USB_FIFO1_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO1_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO2 register.
+//
+//*****************************************************************************
+#define USB_FIFO2_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO2_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO3 register.
+//
+//*****************************************************************************
+#define USB_FIFO3_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO3_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO4 register.
+//
+//*****************************************************************************
+#define USB_FIFO4_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO4_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO5 register.
+//
+//*****************************************************************************
+#define USB_FIFO5_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO5_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO6 register.
+//
+//*****************************************************************************
+#define USB_FIFO6_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO6_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FIFO7 register.
+//
+//*****************************************************************************
+#define USB_FIFO7_EPDATA_M 0xFFFFFFFF // Endpoint Data
+#define USB_FIFO7_EPDATA_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DEVCTL register.
+//
+//*****************************************************************************
+#define USB_DEVCTL_DEV 0x00000080 // Device Mode (OTG only)
+#define USB_DEVCTL_FSDEV 0x00000040 // Full-Speed Device Detected
+#define USB_DEVCTL_LSDEV 0x00000020 // Low-Speed Device Detected
+#define USB_DEVCTL_VBUS_M 0x00000018 // VBUS Level (OTG only)
+#define USB_DEVCTL_VBUS_NONE 0x00000000 // Below SessionEnd
+#define USB_DEVCTL_VBUS_SEND 0x00000008 // Above SessionEnd, below AValid
+#define USB_DEVCTL_VBUS_AVALID 0x00000010 // Above AValid, below VBUSValid
+#define USB_DEVCTL_VBUS_VALID 0x00000018 // Above VBUSValid
+#define USB_DEVCTL_HOST 0x00000004 // Host Mode
+#define USB_DEVCTL_HOSTREQ 0x00000002 // Host Request (OTG only)
+#define USB_DEVCTL_SESSION 0x00000001 // Session Start/End (OTG only)
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CCONF register.
+//
+//*****************************************************************************
+#define USB_CCONF_TXEDMA 0x00000002 // TX Early DMA Enable
+#define USB_CCONF_RXEDMA 0x00000001 // TX Early DMA Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFIFOSZ register.
+//
+//*****************************************************************************
+#define USB_TXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support
+#define USB_TXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size
+#define USB_TXFIFOSZ_SIZE_8 0x00000000 // 8
+#define USB_TXFIFOSZ_SIZE_16 0x00000001 // 16
+#define USB_TXFIFOSZ_SIZE_32 0x00000002 // 32
+#define USB_TXFIFOSZ_SIZE_64 0x00000003 // 64
+#define USB_TXFIFOSZ_SIZE_128 0x00000004 // 128
+#define USB_TXFIFOSZ_SIZE_256 0x00000005 // 256
+#define USB_TXFIFOSZ_SIZE_512 0x00000006 // 512
+#define USB_TXFIFOSZ_SIZE_1024 0x00000007 // 1024
+#define USB_TXFIFOSZ_SIZE_2048 0x00000008 // 2048
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFIFOSZ register.
+//
+//*****************************************************************************
+#define USB_RXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support
+#define USB_RXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size
+#define USB_RXFIFOSZ_SIZE_8 0x00000000 // 8
+#define USB_RXFIFOSZ_SIZE_16 0x00000001 // 16
+#define USB_RXFIFOSZ_SIZE_32 0x00000002 // 32
+#define USB_RXFIFOSZ_SIZE_64 0x00000003 // 64
+#define USB_RXFIFOSZ_SIZE_128 0x00000004 // 128
+#define USB_RXFIFOSZ_SIZE_256 0x00000005 // 256
+#define USB_RXFIFOSZ_SIZE_512 0x00000006 // 512
+#define USB_RXFIFOSZ_SIZE_1024 0x00000007 // 1024
+#define USB_RXFIFOSZ_SIZE_2048 0x00000008 // 2048
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFIFOADD
+// register.
+//
+//*****************************************************************************
+#define USB_TXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address
+#define USB_TXFIFOADD_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFIFOADD
+// register.
+//
+//*****************************************************************************
+#define USB_RXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address
+#define USB_RXFIFOADD_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_ULPIVBUSCTL
+// register.
+//
+//*****************************************************************************
+#define USB_ULPIVBUSCTL_USEEXTVBUSIND \
+ 0x00000002 // Use External VBUS Indicator
+#define USB_ULPIVBUSCTL_USEEXTVBUS \
+ 0x00000001 // Use External VBUS
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_ULPIREGDATA
+// register.
+//
+//*****************************************************************************
+#define USB_ULPIREGDATA_REGDATA_M \
+ 0x000000FF // Register Data
+#define USB_ULPIREGDATA_REGDATA_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_ULPIREGADDR
+// register.
+//
+//*****************************************************************************
+#define USB_ULPIREGADDR_ADDR_M 0x000000FF // Register Address
+#define USB_ULPIREGADDR_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_ULPIREGCTL
+// register.
+//
+//*****************************************************************************
+#define USB_ULPIREGCTL_RDWR 0x00000004 // Read/Write Control
+#define USB_ULPIREGCTL_REGCMPLT 0x00000002 // Register Access Complete
+#define USB_ULPIREGCTL_REGACC 0x00000001 // Initiate Register Access
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPINFO register.
+//
+//*****************************************************************************
+#define USB_EPINFO_RXEP_M 0x000000F0 // RX Endpoints
+#define USB_EPINFO_TXEP_M 0x0000000F // TX Endpoints
+#define USB_EPINFO_RXEP_S 4
+#define USB_EPINFO_TXEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RAMINFO register.
+//
+//*****************************************************************************
+#define USB_RAMINFO_DMACHAN_M 0x000000F0 // DMA Channels
+#define USB_RAMINFO_RAMBITS_M 0x0000000F // RAM Address Bus Width
+#define USB_RAMINFO_DMACHAN_S 4
+#define USB_RAMINFO_RAMBITS_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CONTIM register.
+//
+//*****************************************************************************
+#define USB_CONTIM_WTCON_M 0x000000F0 // Connect Wait
+#define USB_CONTIM_WTID_M 0x0000000F // Wait ID
+#define USB_CONTIM_WTCON_S 4
+#define USB_CONTIM_WTID_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_VPLEN register.
+//
+//*****************************************************************************
+#define USB_VPLEN_VPLEN_M 0x000000FF // VBUS Pulse Length
+#define USB_VPLEN_VPLEN_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_HSEOF register.
+//
+//*****************************************************************************
+#define USB_HSEOF_HSEOFG_M 0x000000FF // HIgh-Speed End-of-Frame Gap
+#define USB_HSEOF_HSEOFG_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_FSEOF register.
+//
+//*****************************************************************************
+#define USB_FSEOF_FSEOFG_M 0x000000FF // Full-Speed End-of-Frame Gap
+#define USB_FSEOF_FSEOFG_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LSEOF register.
+//
+//*****************************************************************************
+#define USB_LSEOF_LSEOFG_M 0x000000FF // Low-Speed End-of-Frame Gap
+#define USB_LSEOF_LSEOFG_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR0
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR0_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR0_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR0
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR0_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR0_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT0
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT0_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT0_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR1
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR1_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR1_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR1
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR1_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR1_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT1
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT1_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT1_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR1
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR1_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR1_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR1
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR1_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR1_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT1
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT1_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT1_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR2
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR2_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR2_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR2
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR2_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR2_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT2
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT2_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT2_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR2
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR2_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR2_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR2
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR2_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR2_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT2
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT2_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT2_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR3
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR3_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR3_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR3
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR3_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR3_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT3
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT3_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT3_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR3
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR3_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR3_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR3
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR3_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR3_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT3
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT3_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT3_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR4
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR4_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR4_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR4
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR4_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR4_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT4
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT4_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT4_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR4
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR4_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR4_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR4
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR4_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR4_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT4
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT4_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT4_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR5
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR5_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR5_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR5
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR5_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR5_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT5
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT5_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT5_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR5
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR5_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR5_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR5
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR5_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR5_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT5
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT5_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT5_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR6
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR6_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR6_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR6
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR6_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR6_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT6
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT6_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT6_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR6
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR6_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR6_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR6
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR6_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR6_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT6
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT6_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT6_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXFUNCADDR7
+// register.
+//
+//*****************************************************************************
+#define USB_TXFUNCADDR7_ADDR_M 0x0000007F // Device Address
+#define USB_TXFUNCADDR7_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBADDR7
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBADDR7_ADDR_M 0x0000007F // Hub Address
+#define USB_TXHUBADDR7_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXHUBPORT7
+// register.
+//
+//*****************************************************************************
+#define USB_TXHUBPORT7_PORT_M 0x0000007F // Hub Port
+#define USB_TXHUBPORT7_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXFUNCADDR7
+// register.
+//
+//*****************************************************************************
+#define USB_RXFUNCADDR7_ADDR_M 0x0000007F // Device Address
+#define USB_RXFUNCADDR7_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBADDR7
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBADDR7_ADDR_M 0x0000007F // Hub Address
+#define USB_RXHUBADDR7_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXHUBPORT7
+// register.
+//
+//*****************************************************************************
+#define USB_RXHUBPORT7_PORT_M 0x0000007F // Hub Port
+#define USB_RXHUBPORT7_PORT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CSRL0 register.
+//
+//*****************************************************************************
+#define USB_CSRL0_NAKTO 0x00000080 // NAK Timeout
+#define USB_CSRL0_SETENDC 0x00000080 // Setup End Clear
+#define USB_CSRL0_STATUS 0x00000040 // STATUS Packet
+#define USB_CSRL0_RXRDYC 0x00000040 // RXRDY Clear
+#define USB_CSRL0_REQPKT 0x00000020 // Request Packet
+#define USB_CSRL0_STALL 0x00000020 // Send Stall
+#define USB_CSRL0_SETEND 0x00000010 // Setup End
+#define USB_CSRL0_ERROR 0x00000010 // Error
+#define USB_CSRL0_DATAEND 0x00000008 // Data End
+#define USB_CSRL0_SETUP 0x00000008 // Setup Packet
+#define USB_CSRL0_STALLED 0x00000004 // Endpoint Stalled
+#define USB_CSRL0_TXRDY 0x00000002 // Transmit Packet Ready
+#define USB_CSRL0_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CSRH0 register.
+//
+//*****************************************************************************
+#define USB_CSRH0_DISPING 0x00000008 // PING Disable
+#define USB_CSRH0_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_CSRH0_DT 0x00000002 // Data Toggle
+#define USB_CSRH0_FLUSH 0x00000001 // Flush FIFO
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_COUNT0 register.
+//
+//*****************************************************************************
+#define USB_COUNT0_COUNT_M 0x0000007F // FIFO Count
+#define USB_COUNT0_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TYPE0 register.
+//
+//*****************************************************************************
+#define USB_TYPE0_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TYPE0_SPEED_HIGH 0x00000040 // High
+#define USB_TYPE0_SPEED_FULL 0x00000080 // Full
+#define USB_TYPE0_SPEED_LOW 0x000000C0 // Low
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_NAKLMT register.
+//
+//*****************************************************************************
+#define USB_NAKLMT_NAKLMT_M 0x0000001F // EP0 NAK Limit
+#define USB_NAKLMT_NAKLMT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP1 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP1_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL1 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL1_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL1_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL1_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL1_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL1_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL1_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL1_ERROR 0x00000004 // Error
+#define USB_TXCSRL1_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL1_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL1_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH1 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH1_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH1_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH1_MODE 0x00000020 // Mode
+#define USB_TXCSRH1_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH1_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH1_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH1_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH1_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP1 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP1_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL1 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL1_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL1_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL1_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL1_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL1_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL1_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL1_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL1_OVER 0x00000004 // Overrun
+#define USB_RXCSRL1_ERROR 0x00000004 // Error
+#define USB_RXCSRL1_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL1_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH1 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH1_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH1_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH1_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH1_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH1_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH1_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH1_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH1_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH1_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH1_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT1 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT1_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT1_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE1 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE1_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE1_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE1_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE1_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE1_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE1_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE1_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE1_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE1_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE1_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE1_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE1_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL1
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL1_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL1_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL1_TXPOLL_S \
+ 0
+#define USB_TXINTERVAL1_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE1 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE1_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE1_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE1_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE1_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE1_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE1_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE1_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE1_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE1_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE1_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE1_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE1_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL1
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL1_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL1_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL1_TXPOLL_S \
+ 0
+#define USB_RXINTERVAL1_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP2 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP2_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL2 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL2_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL2_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL2_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL2_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL2_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL2_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL2_ERROR 0x00000004 // Error
+#define USB_TXCSRL2_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL2_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL2_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH2 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH2_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH2_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH2_MODE 0x00000020 // Mode
+#define USB_TXCSRH2_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH2_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH2_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH2_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH2_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP2 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP2_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL2 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL2_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL2_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL2_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL2_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL2_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL2_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL2_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL2_ERROR 0x00000004 // Error
+#define USB_RXCSRL2_OVER 0x00000004 // Overrun
+#define USB_RXCSRL2_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL2_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH2 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH2_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH2_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH2_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH2_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH2_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH2_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH2_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH2_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH2_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH2_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT2 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT2_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT2_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE2 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE2_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE2_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE2_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE2_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE2_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE2_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE2_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE2_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE2_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE2_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE2_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE2_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL2
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL2_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL2_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL2_NAKLMT_S \
+ 0
+#define USB_TXINTERVAL2_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE2 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE2_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE2_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE2_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE2_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE2_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE2_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE2_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE2_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE2_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE2_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE2_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE2_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL2
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL2_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL2_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL2_TXPOLL_S \
+ 0
+#define USB_RXINTERVAL2_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP3 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP3_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL3 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL3_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL3_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL3_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL3_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL3_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL3_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL3_ERROR 0x00000004 // Error
+#define USB_TXCSRL3_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL3_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL3_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH3 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH3_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH3_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH3_MODE 0x00000020 // Mode
+#define USB_TXCSRH3_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH3_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH3_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH3_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH3_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP3 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP3_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL3 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL3_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL3_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL3_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL3_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL3_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL3_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL3_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL3_ERROR 0x00000004 // Error
+#define USB_RXCSRL3_OVER 0x00000004 // Overrun
+#define USB_RXCSRL3_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL3_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH3 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH3_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH3_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH3_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH3_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH3_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH3_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH3_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH3_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH3_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH3_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT3 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT3_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT3_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE3 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE3_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE3_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE3_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE3_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE3_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE3_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE3_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE3_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE3_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE3_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE3_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE3_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL3
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL3_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL3_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL3_TXPOLL_S \
+ 0
+#define USB_TXINTERVAL3_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE3 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE3_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE3_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE3_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE3_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE3_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE3_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE3_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE3_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE3_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE3_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE3_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE3_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL3
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL3_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL3_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL3_TXPOLL_S \
+ 0
+#define USB_RXINTERVAL3_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP4 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP4_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL4 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL4_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL4_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL4_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL4_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL4_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL4_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL4_ERROR 0x00000004 // Error
+#define USB_TXCSRL4_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL4_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL4_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH4 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH4_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH4_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH4_MODE 0x00000020 // Mode
+#define USB_TXCSRH4_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH4_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH4_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH4_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH4_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP4 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP4_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL4 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL4_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL4_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL4_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL4_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL4_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL4_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL4_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL4_OVER 0x00000004 // Overrun
+#define USB_RXCSRL4_ERROR 0x00000004 // Error
+#define USB_RXCSRL4_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL4_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH4 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH4_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH4_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH4_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH4_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH4_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH4_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH4_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH4_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH4_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH4_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT4 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT4_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT4_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE4 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE4_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE4_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE4_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE4_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE4_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE4_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE4_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE4_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE4_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE4_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE4_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE4_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL4
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL4_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL4_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL4_NAKLMT_S \
+ 0
+#define USB_TXINTERVAL4_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE4 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE4_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE4_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE4_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE4_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE4_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE4_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE4_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE4_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE4_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE4_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE4_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE4_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL4
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL4_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL4_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL4_NAKLMT_S \
+ 0
+#define USB_RXINTERVAL4_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP5 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP5_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL5 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL5_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL5_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL5_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL5_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL5_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL5_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL5_ERROR 0x00000004 // Error
+#define USB_TXCSRL5_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL5_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL5_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH5 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH5_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH5_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH5_MODE 0x00000020 // Mode
+#define USB_TXCSRH5_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH5_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH5_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH5_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH5_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP5 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP5_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL5 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL5_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL5_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL5_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL5_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL5_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL5_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL5_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL5_ERROR 0x00000004 // Error
+#define USB_RXCSRL5_OVER 0x00000004 // Overrun
+#define USB_RXCSRL5_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL5_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH5 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH5_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH5_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH5_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH5_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH5_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH5_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH5_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH5_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH5_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH5_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT5 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT5_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT5_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE5 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE5_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE5_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE5_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE5_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE5_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE5_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE5_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE5_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE5_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE5_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE5_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE5_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL5
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL5_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL5_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL5_NAKLMT_S \
+ 0
+#define USB_TXINTERVAL5_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE5 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE5_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE5_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE5_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE5_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE5_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE5_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE5_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE5_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE5_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE5_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE5_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE5_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL5
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL5_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL5_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL5_TXPOLL_S \
+ 0
+#define USB_RXINTERVAL5_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP6 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP6_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL6 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL6_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL6_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL6_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL6_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL6_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL6_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL6_ERROR 0x00000004 // Error
+#define USB_TXCSRL6_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL6_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL6_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH6 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH6_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH6_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH6_MODE 0x00000020 // Mode
+#define USB_TXCSRH6_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH6_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH6_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH6_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH6_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP6 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP6_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL6 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL6_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL6_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL6_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL6_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL6_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL6_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL6_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL6_ERROR 0x00000004 // Error
+#define USB_RXCSRL6_OVER 0x00000004 // Overrun
+#define USB_RXCSRL6_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL6_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH6 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH6_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH6_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH6_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH6_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH6_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH6_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH6_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH6_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH6_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH6_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT6 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT6_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT6_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE6 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE6_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE6_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE6_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE6_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE6_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE6_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE6_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE6_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE6_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE6_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE6_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE6_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL6
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL6_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL6_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL6_TXPOLL_S \
+ 0
+#define USB_TXINTERVAL6_NAKLMT_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE6 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE6_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE6_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE6_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE6_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE6_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE6_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE6_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE6_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE6_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE6_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE6_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE6_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL6
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL6_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL6_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL6_NAKLMT_S \
+ 0
+#define USB_RXINTERVAL6_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXMAXP7 register.
+//
+//*****************************************************************************
+#define USB_TXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_TXMAXP7_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRL7 register.
+//
+//*****************************************************************************
+#define USB_TXCSRL7_NAKTO 0x00000080 // NAK Timeout
+#define USB_TXCSRL7_CLRDT 0x00000040 // Clear Data Toggle
+#define USB_TXCSRL7_STALLED 0x00000020 // Endpoint Stalled
+#define USB_TXCSRL7_STALL 0x00000010 // Send STALL
+#define USB_TXCSRL7_SETUP 0x00000010 // Setup Packet
+#define USB_TXCSRL7_FLUSH 0x00000008 // Flush FIFO
+#define USB_TXCSRL7_ERROR 0x00000004 // Error
+#define USB_TXCSRL7_UNDRN 0x00000004 // Underrun
+#define USB_TXCSRL7_FIFONE 0x00000002 // FIFO Not Empty
+#define USB_TXCSRL7_TXRDY 0x00000001 // Transmit Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXCSRH7 register.
+//
+//*****************************************************************************
+#define USB_TXCSRH7_AUTOSET 0x00000080 // Auto Set
+#define USB_TXCSRH7_ISO 0x00000040 // Isochronous Transfers
+#define USB_TXCSRH7_MODE 0x00000020 // Mode
+#define USB_TXCSRH7_DMAEN 0x00000010 // DMA Request Enable
+#define USB_TXCSRH7_FDT 0x00000008 // Force Data Toggle
+#define USB_TXCSRH7_DMAMOD 0x00000004 // DMA Request Mode
+#define USB_TXCSRH7_DTWE 0x00000002 // Data Toggle Write Enable
+#define USB_TXCSRH7_DT 0x00000001 // Data Toggle
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXMAXP7 register.
+//
+//*****************************************************************************
+#define USB_RXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload
+#define USB_RXMAXP7_MAXLOAD_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRL7 register.
+//
+//*****************************************************************************
+#define USB_RXCSRL7_CLRDT 0x00000080 // Clear Data Toggle
+#define USB_RXCSRL7_STALLED 0x00000040 // Endpoint Stalled
+#define USB_RXCSRL7_REQPKT 0x00000020 // Request Packet
+#define USB_RXCSRL7_STALL 0x00000020 // Send STALL
+#define USB_RXCSRL7_FLUSH 0x00000010 // Flush FIFO
+#define USB_RXCSRL7_DATAERR 0x00000008 // Data Error
+#define USB_RXCSRL7_NAKTO 0x00000008 // NAK Timeout
+#define USB_RXCSRL7_ERROR 0x00000004 // Error
+#define USB_RXCSRL7_OVER 0x00000004 // Overrun
+#define USB_RXCSRL7_FULL 0x00000002 // FIFO Full
+#define USB_RXCSRL7_RXRDY 0x00000001 // Receive Packet Ready
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCSRH7 register.
+//
+//*****************************************************************************
+#define USB_RXCSRH7_AUTOCL 0x00000080 // Auto Clear
+#define USB_RXCSRH7_ISO 0x00000040 // Isochronous Transfers
+#define USB_RXCSRH7_AUTORQ 0x00000040 // Auto Request
+#define USB_RXCSRH7_DMAEN 0x00000020 // DMA Request Enable
+#define USB_RXCSRH7_PIDERR 0x00000010 // PID Error
+#define USB_RXCSRH7_DISNYET 0x00000010 // Disable NYET
+#define USB_RXCSRH7_DMAMOD 0x00000008 // DMA Request Mode
+#define USB_RXCSRH7_DTWE 0x00000004 // Data Toggle Write Enable
+#define USB_RXCSRH7_DT 0x00000002 // Data Toggle
+#define USB_RXCSRH7_INCOMPRX 0x00000001 // Incomplete RX Transmission
+ // Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXCOUNT7 register.
+//
+//*****************************************************************************
+#define USB_RXCOUNT7_COUNT_M 0x00001FFF // Receive Packet Count
+#define USB_RXCOUNT7_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXTYPE7 register.
+//
+//*****************************************************************************
+#define USB_TXTYPE7_SPEED_M 0x000000C0 // Operating Speed
+#define USB_TXTYPE7_SPEED_DFLT 0x00000000 // Default
+#define USB_TXTYPE7_SPEED_HIGH 0x00000040 // High
+#define USB_TXTYPE7_SPEED_FULL 0x00000080 // Full
+#define USB_TXTYPE7_SPEED_LOW 0x000000C0 // Low
+#define USB_TXTYPE7_PROTO_M 0x00000030 // Protocol
+#define USB_TXTYPE7_PROTO_CTRL 0x00000000 // Control
+#define USB_TXTYPE7_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_TXTYPE7_PROTO_BULK 0x00000020 // Bulk
+#define USB_TXTYPE7_PROTO_INT 0x00000030 // Interrupt
+#define USB_TXTYPE7_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_TXTYPE7_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXINTERVAL7
+// register.
+//
+//*****************************************************************************
+#define USB_TXINTERVAL7_TXPOLL_M \
+ 0x000000FF // TX Polling
+#define USB_TXINTERVAL7_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_TXINTERVAL7_NAKLMT_S \
+ 0
+#define USB_TXINTERVAL7_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXTYPE7 register.
+//
+//*****************************************************************************
+#define USB_RXTYPE7_SPEED_M 0x000000C0 // Operating Speed
+#define USB_RXTYPE7_SPEED_DFLT 0x00000000 // Default
+#define USB_RXTYPE7_SPEED_HIGH 0x00000040 // High
+#define USB_RXTYPE7_SPEED_FULL 0x00000080 // Full
+#define USB_RXTYPE7_SPEED_LOW 0x000000C0 // Low
+#define USB_RXTYPE7_PROTO_M 0x00000030 // Protocol
+#define USB_RXTYPE7_PROTO_CTRL 0x00000000 // Control
+#define USB_RXTYPE7_PROTO_ISOC 0x00000010 // Isochronous
+#define USB_RXTYPE7_PROTO_BULK 0x00000020 // Bulk
+#define USB_RXTYPE7_PROTO_INT 0x00000030 // Interrupt
+#define USB_RXTYPE7_TEP_M 0x0000000F // Target Endpoint Number
+#define USB_RXTYPE7_TEP_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXINTERVAL7
+// register.
+//
+//*****************************************************************************
+#define USB_RXINTERVAL7_TXPOLL_M \
+ 0x000000FF // RX Polling
+#define USB_RXINTERVAL7_NAKLMT_M \
+ 0x000000FF // NAK Limit
+#define USB_RXINTERVAL7_NAKLMT_S \
+ 0
+#define USB_RXINTERVAL7_TXPOLL_S \
+ 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAINTR register.
+//
+//*****************************************************************************
+#define USB_DMAINTR_CH7 0x00000080 // Channel 7 DMA Interrupt
+#define USB_DMAINTR_CH6 0x00000040 // Channel 6 DMA Interrupt
+#define USB_DMAINTR_CH5 0x00000020 // Channel 5 DMA Interrupt
+#define USB_DMAINTR_CH4 0x00000010 // Channel 4 DMA Interrupt
+#define USB_DMAINTR_CH3 0x00000008 // Channel 3 DMA Interrupt
+#define USB_DMAINTR_CH2 0x00000004 // Channel 2 DMA Interrupt
+#define USB_DMAINTR_CH1 0x00000002 // Channel 1 DMA Interrupt
+#define USB_DMAINTR_CH0 0x00000001 // Channel 0 DMA Interrupt
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL0 register.
+//
+//*****************************************************************************
+#define USB_DMACTL0_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL0_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL0_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL0_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL0_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL0_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL0_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL0_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL0_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL0_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL0_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL0_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR0 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR0_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR0_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT0
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT0_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT0_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL1 register.
+//
+//*****************************************************************************
+#define USB_DMACTL1_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL1_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL1_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL1_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL1_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL1_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL1_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL1_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL1_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL1_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL1_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL1_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR1 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR1_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR1_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT1
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT1_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT1_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL2 register.
+//
+//*****************************************************************************
+#define USB_DMACTL2_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL2_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL2_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL2_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL2_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL2_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL2_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL2_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL2_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL2_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL2_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL2_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR2 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR2_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR2_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT2
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT2_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT2_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL3 register.
+//
+//*****************************************************************************
+#define USB_DMACTL3_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL3_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL3_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL3_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL3_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL3_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL3_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL3_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL3_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL3_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL3_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL3_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR3 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR3_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR3_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT3
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT3_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT3_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL4 register.
+//
+//*****************************************************************************
+#define USB_DMACTL4_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL4_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL4_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL4_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL4_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL4_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL4_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL4_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL4_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL4_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL4_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL4_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR4 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR4_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR4_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT4
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT4_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT4_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL5 register.
+//
+//*****************************************************************************
+#define USB_DMACTL5_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL5_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL5_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL5_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL5_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL5_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL5_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL5_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL5_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL5_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL5_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL5_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR5 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR5_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR5_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT5
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT5_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT5_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL6 register.
+//
+//*****************************************************************************
+#define USB_DMACTL6_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL6_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL6_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL6_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL6_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL6_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL6_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL6_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL6_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL6_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL6_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL6_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR6 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR6_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR6_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT6
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT6_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT6_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACTL7 register.
+//
+//*****************************************************************************
+#define USB_DMACTL7_BRSTM_M 0x00000600 // Burst Mode
+#define USB_DMACTL7_BRSTM_ANY 0x00000000 // Bursts of unspecified length
+#define USB_DMACTL7_BRSTM_INC4 0x00000200 // INCR4 or unspecified length
+#define USB_DMACTL7_BRSTM_INC8 0x00000400 // INCR8, INCR4 or unspecified
+ // length
+#define USB_DMACTL7_BRSTM_INC16 0x00000600 // INCR16, INCR8, INCR4 or
+ // unspecified length
+#define USB_DMACTL7_ERR 0x00000100 // Bus Error Bit
+#define USB_DMACTL7_EP_M 0x000000F0 // Endpoint number
+#define USB_DMACTL7_IE 0x00000008 // DMA Interrupt Enable
+#define USB_DMACTL7_MODE 0x00000004 // DMA Transfer Mode
+#define USB_DMACTL7_DIR 0x00000002 // DMA Direction
+#define USB_DMACTL7_ENABLE 0x00000001 // DMA Transfer Enable
+#define USB_DMACTL7_EP_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMAADDR7 register.
+//
+//*****************************************************************************
+#define USB_DMAADDR7_ADDR_M 0xFFFFFFFC // DMA Address
+#define USB_DMAADDR7_ADDR_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DMACOUNT7
+// register.
+//
+//*****************************************************************************
+#define USB_DMACOUNT7_COUNT_M 0xFFFFFFFC // DMA Count
+#define USB_DMACOUNT7_COUNT_S 2
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT1
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT1_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT1_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT2
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT2_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT2_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT3
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT3_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT3_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT4
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT4_COUNT_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT4_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT5
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT5_COUNT_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT5_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT6
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT6_COUNT_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT6_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RQPKTCOUNT7
+// register.
+//
+//*****************************************************************************
+#define USB_RQPKTCOUNT7_COUNT_M 0x0000FFFF // Block Transfer Packet Count
+#define USB_RQPKTCOUNT7_COUNT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_RXDPKTBUFDIS
+// register.
+//
+//*****************************************************************************
+#define USB_RXDPKTBUFDIS_EP7 0x00000080 // EP7 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP6 0x00000040 // EP6 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP5 0x00000020 // EP5 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP4 0x00000010 // EP4 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP3 0x00000008 // EP3 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP2 0x00000004 // EP2 RX Double-Packet Buffer
+ // Disable
+#define USB_RXDPKTBUFDIS_EP1 0x00000002 // EP1 RX Double-Packet Buffer
+ // Disable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_TXDPKTBUFDIS
+// register.
+//
+//*****************************************************************************
+#define USB_TXDPKTBUFDIS_EP7 0x00000080 // EP7 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP6 0x00000040 // EP6 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP5 0x00000020 // EP5 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP4 0x00000010 // EP4 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP3 0x00000008 // EP3 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP2 0x00000004 // EP2 TX Double-Packet Buffer
+ // Disable
+#define USB_TXDPKTBUFDIS_EP1 0x00000002 // EP1 TX Double-Packet Buffer
+ // Disable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CTO register.
+//
+//*****************************************************************************
+#define USB_CTO_CCTV_M 0x0000FFFF // Configurable Chirp Timeout Value
+#define USB_CTO_CCTV_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_HHSRTN register.
+//
+//*****************************************************************************
+#define USB_HHSRTN_HHSRTN_M 0x0000FFFF // HIgh Speed to UTM Operating
+ // Delay
+#define USB_HHSRTN_HHSRTN_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_HSBT register.
+//
+//*****************************************************************************
+#define USB_HSBT_HSBT_M 0x0000000F // High Speed Timeout Adder
+#define USB_HSBT_HSBT_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LPMATTR register.
+//
+//*****************************************************************************
+#define USB_LPMATTR_ENDPT_M 0x0000F000 // Endpoint
+#define USB_LPMATTR_RMTWAK 0x00000100 // Remote Wake
+#define USB_LPMATTR_HIRD_M 0x000000F0 // Host Initiated Resume Duration
+#define USB_LPMATTR_LS_M 0x0000000F // Link State
+#define USB_LPMATTR_LS_L1 0x00000001 // Sleep State (L1)
+#define USB_LPMATTR_ENDPT_S 12
+#define USB_LPMATTR_HIRD_S 4
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LPMCNTRL register.
+//
+//*****************************************************************************
+#define USB_LPMCNTRL_NAK 0x00000010 // LPM NAK
+#define USB_LPMCNTRL_EN_M 0x0000000C // LPM Enable
+#define USB_LPMCNTRL_EN_NONE 0x00000000 // LPM and Extended transactions
+ // are not supported. In this case,
+ // the USB does not respond to LPM
+ // transactions and LPM
+ // transactions cause a timeout
+#define USB_LPMCNTRL_EN_EXT 0x00000004 // LPM is not supported but
+ // extended transactions are
+ // supported. In this case, the USB
+ // does respond to an LPM
+ // transaction with a STALL
+#define USB_LPMCNTRL_EN_LPMEXT 0x0000000C // The USB supports LPM extended
+ // transactions. In this case, the
+ // USB responds with a NYET or an
+ // ACK as determined by the value
+ // of TXLPM and other conditions
+#define USB_LPMCNTRL_RES 0x00000002 // LPM Resume
+#define USB_LPMCNTRL_TXLPM 0x00000001 // Transmit LPM Transaction Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LPMIM register.
+//
+//*****************************************************************************
+#define USB_LPMIM_ERR 0x00000020 // LPM Error Interrupt Mask
+#define USB_LPMIM_RES 0x00000010 // LPM Resume Interrupt Mask
+#define USB_LPMIM_NC 0x00000008 // LPM NC Interrupt Mask
+#define USB_LPMIM_ACK 0x00000004 // LPM ACK Interrupt Mask
+#define USB_LPMIM_NY 0x00000002 // LPM NY Interrupt Mask
+#define USB_LPMIM_STALL 0x00000001 // LPM STALL Interrupt Mask
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LPMRIS register.
+//
+//*****************************************************************************
+#define USB_LPMRIS_ERR 0x00000020 // LPM Interrupt Status
+#define USB_LPMRIS_RES 0x00000010 // LPM Resume Interrupt Status
+#define USB_LPMRIS_NC 0x00000008 // LPM NC Interrupt Status
+#define USB_LPMRIS_ACK 0x00000004 // LPM ACK Interrupt Status
+#define USB_LPMRIS_NY 0x00000002 // LPM NY Interrupt Status
+#define USB_LPMRIS_LPMST 0x00000001 // LPM STALL Interrupt Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_LPMFADDR register.
+//
+//*****************************************************************************
+#define USB_LPMFADDR_ADDR_M 0x0000007F // LPM Function Address
+#define USB_LPMFADDR_ADDR_S 0
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPC register.
+//
+//*****************************************************************************
+#define USB_EPC_PFLTACT_M 0x00000300 // Power Fault Action
+#define USB_EPC_PFLTACT_UNCHG 0x00000000 // Unchanged
+#define USB_EPC_PFLTACT_TRIS 0x00000100 // Tristate
+#define USB_EPC_PFLTACT_LOW 0x00000200 // Low
+#define USB_EPC_PFLTACT_HIGH 0x00000300 // High
+#define USB_EPC_PFLTAEN 0x00000040 // Power Fault Action Enable
+#define USB_EPC_PFLTSEN_HIGH 0x00000020 // Power Fault Sense
+#define USB_EPC_PFLTEN 0x00000010 // Power Fault Input Enable
+#define USB_EPC_EPENDE 0x00000004 // EPEN Drive Enable
+#define USB_EPC_EPEN_M 0x00000003 // External Power Supply Enable
+ // Configuration
+#define USB_EPC_EPEN_LOW 0x00000000 // Power Enable Active Low
+#define USB_EPC_EPEN_HIGH 0x00000001 // Power Enable Active High
+#define USB_EPC_EPEN_VBLOW 0x00000002 // Power Enable High if VBUS Low
+ // (OTG only)
+#define USB_EPC_EPEN_VBHIGH 0x00000003 // Power Enable High if VBUS High
+ // (OTG only)
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPCRIS register.
+//
+//*****************************************************************************
+#define USB_EPCRIS_PF 0x00000001 // USB Power Fault Interrupt Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPCIM register.
+//
+//*****************************************************************************
+#define USB_EPCIM_PF 0x00000001 // USB Power Fault Interrupt Mask
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_EPCISC register.
+//
+//*****************************************************************************
+#define USB_EPCISC_PF 0x00000001 // USB Power Fault Interrupt Status
+ // and Clear
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DRRIS register.
+//
+//*****************************************************************************
+#define USB_DRRIS_RESUME 0x00000001 // RESUME Interrupt Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DRIM register.
+//
+//*****************************************************************************
+#define USB_DRIM_RESUME 0x00000001 // RESUME Interrupt Mask
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_DRISC register.
+//
+//*****************************************************************************
+#define USB_DRISC_RESUME 0x00000001 // RESUME Interrupt Status and
+ // Clear
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_GPCS register.
+//
+//*****************************************************************************
+#define USB_GPCS_DEVMOD_M 0x00000007 // Device Mode
+#define USB_GPCS_DEVMOD_OTG 0x00000000 // Use USB0VBUS and USB0ID pin
+#define USB_GPCS_DEVMOD_HOST 0x00000002 // Force USB0VBUS and USB0ID low
+#define USB_GPCS_DEVMOD_DEV 0x00000003 // Force USB0VBUS and USB0ID high
+#define USB_GPCS_DEVMOD_HOSTVBUS \
+ 0x00000004 // Use USB0VBUS and force USB0ID
+ // low
+#define USB_GPCS_DEVMOD_DEVVBUS 0x00000005 // Use USB0VBUS and force USB0ID
+ // high
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_VDC register.
+//
+//*****************************************************************************
+#define USB_VDC_VBDEN 0x00000001 // VBUS Droop Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_VDCRIS register.
+//
+//*****************************************************************************
+#define USB_VDCRIS_VD 0x00000001 // VBUS Droop Raw Interrupt Status
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_VDCIM register.
+//
+//*****************************************************************************
+#define USB_VDCIM_VD 0x00000001 // VBUS Droop Interrupt Mask
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_VDCISC register.
+//
+//*****************************************************************************
+#define USB_VDCISC_VD 0x00000001 // VBUS Droop Interrupt Status and
+ // Clear
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_PP register.
+//
+//*****************************************************************************
+#define USB_PP_ECNT_M 0x0000FF00 // Endpoint Count
+#define USB_PP_USB_M 0x000000C0 // USB Capability
+#define USB_PP_USB_DEVICE 0x00000040 // DEVICE
+#define USB_PP_USB_HOSTDEVICE 0x00000080 // HOST
+#define USB_PP_USB_OTG 0x000000C0 // OTG
+#define USB_PP_ULPI 0x00000020 // ULPI Present
+#define USB_PP_PHY 0x00000010 // PHY Present
+#define USB_PP_TYPE_M 0x0000000F // Controller Type
+#define USB_PP_TYPE_0 0x00000000 // The first-generation USB
+ // controller
+#define USB_PP_TYPE_1 0x00000001 // The second-generation USB
+ // controller revision
+#define USB_PP_ECNT_S 8
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_PC register.
+//
+//*****************************************************************************
+#define USB_PC_ULPIEN 0x00010000 // ULPI Enable
+
+//*****************************************************************************
+//
+// The following are defines for the bit fields in the USB_O_CC register.
+//
+//*****************************************************************************
+#define USB_CC_CLKEN 0x00000200 // USB Clock Enable
+#define USB_CC_CSD 0x00000100 // Clock Source/Direction
+#define USB_CC_CLKDIV_M 0x0000000F // PLL Clock Divisor
+#define USB_CC_CLKDIV_S 0
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid.h
new file mode 100644
index 000000000..d9b0ead10
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid.h
@@ -0,0 +1,1131 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/** \ingroup group_class
+ * \defgroup ClassDriver_HID Human Interface Device (HID)
+ * @{ */
+
+#ifndef _TUSB_HID_H_
+#define _TUSB_HID_H_
+
+#include "common/tusb_common.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Common Definitions
+//--------------------------------------------------------------------+
+/** \defgroup ClassDriver_HID_Common Common Definitions
+ * @{ */
+
+/// USB HID Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength; /**< Numeric expression that is the total size of the HID descriptor */
+ uint8_t bDescriptorType; /**< Constant name specifying type of HID descriptor. */
+
+ uint16_t bcdHID; /**< Numeric expression identifying the HID Class Specification release */
+ uint8_t bCountryCode; /**< Numeric expression identifying country code of the localized hardware. */
+ uint8_t bNumDescriptors; /**< Numeric expression specifying the number of class descriptors */
+
+ uint8_t bReportType; /**< Type of HID class report. */
+ uint16_t wReportLength; /**< the total size of the Report descriptor. */
+} tusb_hid_descriptor_hid_t;
+
+/// HID Subclass
+typedef enum
+{
+ HID_SUBCLASS_NONE = 0, ///< No Subclass
+ HID_SUBCLASS_BOOT = 1 ///< Boot Interface Subclass
+}hid_subclass_enum_t;
+
+/// HID Interface Protocol
+typedef enum
+{
+ HID_ITF_PROTOCOL_NONE = 0, ///< None
+ HID_ITF_PROTOCOL_KEYBOARD = 1, ///< Keyboard
+ HID_ITF_PROTOCOL_MOUSE = 2 ///< Mouse
+}hid_interface_protocol_enum_t;
+
+/// HID Descriptor Type
+typedef enum
+{
+ HID_DESC_TYPE_HID = 0x21, ///< HID Descriptor
+ HID_DESC_TYPE_REPORT = 0x22, ///< Report Descriptor
+ HID_DESC_TYPE_PHYSICAL = 0x23 ///< Physical Descriptor
+}hid_descriptor_enum_t;
+
+/// HID Request Report Type
+typedef enum
+{
+ HID_REPORT_TYPE_INVALID = 0,
+ HID_REPORT_TYPE_INPUT, ///< Input
+ HID_REPORT_TYPE_OUTPUT, ///< Output
+ HID_REPORT_TYPE_FEATURE ///< Feature
+}hid_report_type_t;
+
+/// HID Class Specific Control Request
+typedef enum
+{
+ HID_REQ_CONTROL_GET_REPORT = 0x01, ///< Get Report
+ HID_REQ_CONTROL_GET_IDLE = 0x02, ///< Get Idle
+ HID_REQ_CONTROL_GET_PROTOCOL = 0x03, ///< Get Protocol
+ HID_REQ_CONTROL_SET_REPORT = 0x09, ///< Set Report
+ HID_REQ_CONTROL_SET_IDLE = 0x0a, ///< Set Idle
+ HID_REQ_CONTROL_SET_PROTOCOL = 0x0b ///< Set Protocol
+}hid_request_enum_t;
+
+/// HID Local Code
+typedef enum
+{
+ HID_LOCAL_NotSupported = 0 , ///< NotSupported
+ HID_LOCAL_Arabic , ///< Arabic
+ HID_LOCAL_Belgian , ///< Belgian
+ HID_LOCAL_Canadian_Bilingual , ///< Canadian_Bilingual
+ HID_LOCAL_Canadian_French , ///< Canadian_French
+ HID_LOCAL_Czech_Republic , ///< Czech_Republic
+ HID_LOCAL_Danish , ///< Danish
+ HID_LOCAL_Finnish , ///< Finnish
+ HID_LOCAL_French , ///< French
+ HID_LOCAL_German , ///< German
+ HID_LOCAL_Greek , ///< Greek
+ HID_LOCAL_Hebrew , ///< Hebrew
+ HID_LOCAL_Hungary , ///< Hungary
+ HID_LOCAL_International , ///< International
+ HID_LOCAL_Italian , ///< Italian
+ HID_LOCAL_Japan_Katakana , ///< Japan_Katakana
+ HID_LOCAL_Korean , ///< Korean
+ HID_LOCAL_Latin_American , ///< Latin_American
+ HID_LOCAL_Netherlands_Dutch , ///< Netherlands/Dutch
+ HID_LOCAL_Norwegian , ///< Norwegian
+ HID_LOCAL_Persian_Farsi , ///< Persian (Farsi)
+ HID_LOCAL_Poland , ///< Poland
+ HID_LOCAL_Portuguese , ///< Portuguese
+ HID_LOCAL_Russia , ///< Russia
+ HID_LOCAL_Slovakia , ///< Slovakia
+ HID_LOCAL_Spanish , ///< Spanish
+ HID_LOCAL_Swedish , ///< Swedish
+ HID_LOCAL_Swiss_French , ///< Swiss/French
+ HID_LOCAL_Swiss_German , ///< Swiss/German
+ HID_LOCAL_Switzerland , ///< Switzerland
+ HID_LOCAL_Taiwan , ///< Taiwan
+ HID_LOCAL_Turkish_Q , ///< Turkish-Q
+ HID_LOCAL_UK , ///< UK
+ HID_LOCAL_US , ///< US
+ HID_LOCAL_Yugoslavia , ///< Yugoslavia
+ HID_LOCAL_Turkish_F ///< Turkish-F
+} hid_local_enum_t;
+
+// HID protocol value used by GetProtocol / SetProtocol
+typedef enum
+{
+ HID_PROTOCOL_BOOT = 0,
+ HID_PROTOCOL_REPORT = 1
+} hid_protocol_mode_enum_t;
+
+/** @} */
+
+//--------------------------------------------------------------------+
+// GAMEPAD
+//--------------------------------------------------------------------+
+/** \addtogroup ClassDriver_HID_Gamepad Gamepad
+ * @{ */
+
+/* From https://www.kernel.org/doc/html/latest/input/gamepad.html
+ ____________________________ __
+ / [__ZL__] [__ZR__] \ |
+ / [__ TL __] [__ TR __] \ | Front Triggers
+ __/________________________________\__ __|
+ / _ \ |
+ / /\ __ (N) \ |
+ / || __ |MO| __ _ _ \ | Main Pad
+ | <===DP===> |SE| |ST| (W) -|- (E) | |
+ \ || ___ ___ _ / |
+ /\ \/ / \ / \ (S) /\ __|
+ / \________ | LS | ____ | RS | ________/ \ |
+| / \ \___/ / \ \___/ / \ | | Control Sticks
+| / \_____/ \_____/ \ | __|
+| / \ |
+ \_____/ \_____/
+
+ |________|______| |______|___________|
+ D-Pad Left Right Action Pad
+ Stick Stick
+
+ |_____________|
+ Menu Pad
+
+ Most gamepads have the following features:
+ - Action-Pad 4 buttons in diamonds-shape (on the right side) NORTH, SOUTH, WEST and EAST.
+ - D-Pad (Direction-pad) 4 buttons (on the left side) that point up, down, left and right.
+ - Menu-Pad Different constellations, but most-times 2 buttons: SELECT - START.
+ - Analog-Sticks provide freely moveable sticks to control directions, Analog-sticks may also
+ provide a digital button if you press them.
+ - Triggers are located on the upper-side of the pad in vertical direction. The upper buttons
+ are normally named Left- and Right-Triggers, the lower buttons Z-Left and Z-Right.
+ - Rumble Many devices provide force-feedback features. But are mostly just simple rumble motors.
+ */
+
+/// HID Gamepad Protocol Report.
+typedef struct TU_ATTR_PACKED
+{
+ int8_t x; ///< Delta x movement of left analog-stick
+ int8_t y; ///< Delta y movement of left analog-stick
+ int8_t z; ///< Delta z movement of right analog-joystick
+ int8_t rz; ///< Delta Rz movement of right analog-joystick
+ int8_t rx; ///< Delta Rx movement of analog left trigger
+ int8_t ry; ///< Delta Ry movement of analog right trigger
+ uint8_t hat; ///< Buttons mask for currently pressed buttons in the DPad/hat
+ uint32_t buttons; ///< Buttons mask for currently pressed buttons
+}hid_gamepad_report_t;
+
+/// Standard Gamepad Buttons Bitmap
+typedef enum
+{
+ GAMEPAD_BUTTON_0 = TU_BIT(0),
+ GAMEPAD_BUTTON_1 = TU_BIT(1),
+ GAMEPAD_BUTTON_2 = TU_BIT(2),
+ GAMEPAD_BUTTON_3 = TU_BIT(3),
+ GAMEPAD_BUTTON_4 = TU_BIT(4),
+ GAMEPAD_BUTTON_5 = TU_BIT(5),
+ GAMEPAD_BUTTON_6 = TU_BIT(6),
+ GAMEPAD_BUTTON_7 = TU_BIT(7),
+ GAMEPAD_BUTTON_8 = TU_BIT(8),
+ GAMEPAD_BUTTON_9 = TU_BIT(9),
+ GAMEPAD_BUTTON_10 = TU_BIT(10),
+ GAMEPAD_BUTTON_11 = TU_BIT(11),
+ GAMEPAD_BUTTON_12 = TU_BIT(12),
+ GAMEPAD_BUTTON_13 = TU_BIT(13),
+ GAMEPAD_BUTTON_14 = TU_BIT(14),
+ GAMEPAD_BUTTON_15 = TU_BIT(15),
+ GAMEPAD_BUTTON_16 = TU_BIT(16),
+ GAMEPAD_BUTTON_17 = TU_BIT(17),
+ GAMEPAD_BUTTON_18 = TU_BIT(18),
+ GAMEPAD_BUTTON_19 = TU_BIT(19),
+ GAMEPAD_BUTTON_20 = TU_BIT(20),
+ GAMEPAD_BUTTON_21 = TU_BIT(21),
+ GAMEPAD_BUTTON_22 = TU_BIT(22),
+ GAMEPAD_BUTTON_23 = TU_BIT(23),
+ GAMEPAD_BUTTON_24 = TU_BIT(24),
+ GAMEPAD_BUTTON_25 = TU_BIT(25),
+ GAMEPAD_BUTTON_26 = TU_BIT(26),
+ GAMEPAD_BUTTON_27 = TU_BIT(27),
+ GAMEPAD_BUTTON_28 = TU_BIT(28),
+ GAMEPAD_BUTTON_29 = TU_BIT(29),
+ GAMEPAD_BUTTON_30 = TU_BIT(30),
+ GAMEPAD_BUTTON_31 = TU_BIT(31),
+}hid_gamepad_button_bm_t;
+
+/// Standard Gamepad Buttons Naming from Linux input event codes
+/// https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h
+#define GAMEPAD_BUTTON_A GAMEPAD_BUTTON_0
+#define GAMEPAD_BUTTON_SOUTH GAMEPAD_BUTTON_0
+
+#define GAMEPAD_BUTTON_B GAMEPAD_BUTTON_1
+#define GAMEPAD_BUTTON_EAST GAMEPAD_BUTTON_1
+
+#define GAMEPAD_BUTTON_C GAMEPAD_BUTTON_2
+
+#define GAMEPAD_BUTTON_X GAMEPAD_BUTTON_3
+#define GAMEPAD_BUTTON_NORTH GAMEPAD_BUTTON_3
+
+#define GAMEPAD_BUTTON_Y GAMEPAD_BUTTON_4
+#define GAMEPAD_BUTTON_WEST GAMEPAD_BUTTON_4
+
+#define GAMEPAD_BUTTON_Z GAMEPAD_BUTTON_5
+#define GAMEPAD_BUTTON_TL GAMEPAD_BUTTON_6
+#define GAMEPAD_BUTTON_TR GAMEPAD_BUTTON_7
+#define GAMEPAD_BUTTON_TL2 GAMEPAD_BUTTON_8
+#define GAMEPAD_BUTTON_TR2 GAMEPAD_BUTTON_9
+#define GAMEPAD_BUTTON_SELECT GAMEPAD_BUTTON_10
+#define GAMEPAD_BUTTON_START GAMEPAD_BUTTON_11
+#define GAMEPAD_BUTTON_MODE GAMEPAD_BUTTON_12
+#define GAMEPAD_BUTTON_THUMBL GAMEPAD_BUTTON_13
+#define GAMEPAD_BUTTON_THUMBR GAMEPAD_BUTTON_14
+
+/// Standard Gamepad HAT/DPAD Buttons (from Linux input event codes)
+typedef enum
+{
+ GAMEPAD_HAT_CENTERED = 0, ///< DPAD_CENTERED
+ GAMEPAD_HAT_UP = 1, ///< DPAD_UP
+ GAMEPAD_HAT_UP_RIGHT = 2, ///< DPAD_UP_RIGHT
+ GAMEPAD_HAT_RIGHT = 3, ///< DPAD_RIGHT
+ GAMEPAD_HAT_DOWN_RIGHT = 4, ///< DPAD_DOWN_RIGHT
+ GAMEPAD_HAT_DOWN = 5, ///< DPAD_DOWN
+ GAMEPAD_HAT_DOWN_LEFT = 6, ///< DPAD_DOWN_LEFT
+ GAMEPAD_HAT_LEFT = 7, ///< DPAD_LEFT
+ GAMEPAD_HAT_UP_LEFT = 8, ///< DPAD_UP_LEFT
+}hid_gamepad_hat_t;
+
+/// @}
+
+//--------------------------------------------------------------------+
+// MOUSE
+//--------------------------------------------------------------------+
+/** \addtogroup ClassDriver_HID_Mouse Mouse
+ * @{ */
+
+/// Standard HID Boot Protocol Mouse Report.
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t buttons; /**< buttons mask for currently pressed buttons in the mouse. */
+ int8_t x; /**< Current delta x movement of the mouse. */
+ int8_t y; /**< Current delta y movement on the mouse. */
+ int8_t wheel; /**< Current delta wheel movement on the mouse. */
+ int8_t pan; // using AC Pan
+} hid_mouse_report_t;
+
+/// Standard Mouse Buttons Bitmap
+typedef enum
+{
+ MOUSE_BUTTON_LEFT = TU_BIT(0), ///< Left button
+ MOUSE_BUTTON_RIGHT = TU_BIT(1), ///< Right button
+ MOUSE_BUTTON_MIDDLE = TU_BIT(2), ///< Middle button
+ MOUSE_BUTTON_BACKWARD = TU_BIT(3), ///< Backward button,
+ MOUSE_BUTTON_FORWARD = TU_BIT(4), ///< Forward button,
+}hid_mouse_button_bm_t;
+
+/// @}
+
+//--------------------------------------------------------------------+
+// Keyboard
+//--------------------------------------------------------------------+
+/** \addtogroup ClassDriver_HID_Keyboard Keyboard
+ * @{ */
+
+/// Standard HID Boot Protocol Keyboard Report.
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t modifier; /**< Keyboard modifier (KEYBOARD_MODIFIER_* masks). */
+ uint8_t reserved; /**< Reserved for OEM use, always set to 0. */
+ uint8_t keycode[6]; /**< Key codes of the currently pressed keys. */
+} hid_keyboard_report_t;
+
+/// Keyboard modifier codes bitmap
+typedef enum
+{
+ KEYBOARD_MODIFIER_LEFTCTRL = TU_BIT(0), ///< Left Control
+ KEYBOARD_MODIFIER_LEFTSHIFT = TU_BIT(1), ///< Left Shift
+ KEYBOARD_MODIFIER_LEFTALT = TU_BIT(2), ///< Left Alt
+ KEYBOARD_MODIFIER_LEFTGUI = TU_BIT(3), ///< Left Window
+ KEYBOARD_MODIFIER_RIGHTCTRL = TU_BIT(4), ///< Right Control
+ KEYBOARD_MODIFIER_RIGHTSHIFT = TU_BIT(5), ///< Right Shift
+ KEYBOARD_MODIFIER_RIGHTALT = TU_BIT(6), ///< Right Alt
+ KEYBOARD_MODIFIER_RIGHTGUI = TU_BIT(7) ///< Right Window
+}hid_keyboard_modifier_bm_t;
+
+typedef enum
+{
+ KEYBOARD_LED_NUMLOCK = TU_BIT(0), ///< Num Lock LED
+ KEYBOARD_LED_CAPSLOCK = TU_BIT(1), ///< Caps Lock LED
+ KEYBOARD_LED_SCROLLLOCK = TU_BIT(2), ///< Scroll Lock LED
+ KEYBOARD_LED_COMPOSE = TU_BIT(3), ///< Composition Mode
+ KEYBOARD_LED_KANA = TU_BIT(4) ///< Kana mode
+}hid_keyboard_led_bm_t;
+
+/// @}
+
+//--------------------------------------------------------------------+
+// HID KEYCODE
+//--------------------------------------------------------------------+
+#define HID_KEY_NONE 0x00
+#define HID_KEY_A 0x04
+#define HID_KEY_B 0x05
+#define HID_KEY_C 0x06
+#define HID_KEY_D 0x07
+#define HID_KEY_E 0x08
+#define HID_KEY_F 0x09
+#define HID_KEY_G 0x0A
+#define HID_KEY_H 0x0B
+#define HID_KEY_I 0x0C
+#define HID_KEY_J 0x0D
+#define HID_KEY_K 0x0E
+#define HID_KEY_L 0x0F
+#define HID_KEY_M 0x10
+#define HID_KEY_N 0x11
+#define HID_KEY_O 0x12
+#define HID_KEY_P 0x13
+#define HID_KEY_Q 0x14
+#define HID_KEY_R 0x15
+#define HID_KEY_S 0x16
+#define HID_KEY_T 0x17
+#define HID_KEY_U 0x18
+#define HID_KEY_V 0x19
+#define HID_KEY_W 0x1A
+#define HID_KEY_X 0x1B
+#define HID_KEY_Y 0x1C
+#define HID_KEY_Z 0x1D
+#define HID_KEY_1 0x1E
+#define HID_KEY_2 0x1F
+#define HID_KEY_3 0x20
+#define HID_KEY_4 0x21
+#define HID_KEY_5 0x22
+#define HID_KEY_6 0x23
+#define HID_KEY_7 0x24
+#define HID_KEY_8 0x25
+#define HID_KEY_9 0x26
+#define HID_KEY_0 0x27
+#define HID_KEY_ENTER 0x28
+#define HID_KEY_ESCAPE 0x29
+#define HID_KEY_BACKSPACE 0x2A
+#define HID_KEY_TAB 0x2B
+#define HID_KEY_SPACE 0x2C
+#define HID_KEY_MINUS 0x2D
+#define HID_KEY_EQUAL 0x2E
+#define HID_KEY_BRACKET_LEFT 0x2F
+#define HID_KEY_BRACKET_RIGHT 0x30
+#define HID_KEY_BACKSLASH 0x31
+#define HID_KEY_EUROPE_1 0x32
+#define HID_KEY_SEMICOLON 0x33
+#define HID_KEY_APOSTROPHE 0x34
+#define HID_KEY_GRAVE 0x35
+#define HID_KEY_COMMA 0x36
+#define HID_KEY_PERIOD 0x37
+#define HID_KEY_SLASH 0x38
+#define HID_KEY_CAPS_LOCK 0x39
+#define HID_KEY_F1 0x3A
+#define HID_KEY_F2 0x3B
+#define HID_KEY_F3 0x3C
+#define HID_KEY_F4 0x3D
+#define HID_KEY_F5 0x3E
+#define HID_KEY_F6 0x3F
+#define HID_KEY_F7 0x40
+#define HID_KEY_F8 0x41
+#define HID_KEY_F9 0x42
+#define HID_KEY_F10 0x43
+#define HID_KEY_F11 0x44
+#define HID_KEY_F12 0x45
+#define HID_KEY_PRINT_SCREEN 0x46
+#define HID_KEY_SCROLL_LOCK 0x47
+#define HID_KEY_PAUSE 0x48
+#define HID_KEY_INSERT 0x49
+#define HID_KEY_HOME 0x4A
+#define HID_KEY_PAGE_UP 0x4B
+#define HID_KEY_DELETE 0x4C
+#define HID_KEY_END 0x4D
+#define HID_KEY_PAGE_DOWN 0x4E
+#define HID_KEY_ARROW_RIGHT 0x4F
+#define HID_KEY_ARROW_LEFT 0x50
+#define HID_KEY_ARROW_DOWN 0x51
+#define HID_KEY_ARROW_UP 0x52
+#define HID_KEY_NUM_LOCK 0x53
+#define HID_KEY_KEYPAD_DIVIDE 0x54
+#define HID_KEY_KEYPAD_MULTIPLY 0x55
+#define HID_KEY_KEYPAD_SUBTRACT 0x56
+#define HID_KEY_KEYPAD_ADD 0x57
+#define HID_KEY_KEYPAD_ENTER 0x58
+#define HID_KEY_KEYPAD_1 0x59
+#define HID_KEY_KEYPAD_2 0x5A
+#define HID_KEY_KEYPAD_3 0x5B
+#define HID_KEY_KEYPAD_4 0x5C
+#define HID_KEY_KEYPAD_5 0x5D
+#define HID_KEY_KEYPAD_6 0x5E
+#define HID_KEY_KEYPAD_7 0x5F
+#define HID_KEY_KEYPAD_8 0x60
+#define HID_KEY_KEYPAD_9 0x61
+#define HID_KEY_KEYPAD_0 0x62
+#define HID_KEY_KEYPAD_DECIMAL 0x63
+#define HID_KEY_EUROPE_2 0x64
+#define HID_KEY_APPLICATION 0x65
+#define HID_KEY_POWER 0x66
+#define HID_KEY_KEYPAD_EQUAL 0x67
+#define HID_KEY_F13 0x68
+#define HID_KEY_F14 0x69
+#define HID_KEY_F15 0x6A
+#define HID_KEY_F16 0x6B
+#define HID_KEY_F17 0x6C
+#define HID_KEY_F18 0x6D
+#define HID_KEY_F19 0x6E
+#define HID_KEY_F20 0x6F
+#define HID_KEY_F21 0x70
+#define HID_KEY_F22 0x71
+#define HID_KEY_F23 0x72
+#define HID_KEY_F24 0x73
+#define HID_KEY_EXECUTE 0x74
+#define HID_KEY_HELP 0x75
+#define HID_KEY_MENU 0x76
+#define HID_KEY_SELECT 0x77
+#define HID_KEY_STOP 0x78
+#define HID_KEY_AGAIN 0x79
+#define HID_KEY_UNDO 0x7A
+#define HID_KEY_CUT 0x7B
+#define HID_KEY_COPY 0x7C
+#define HID_KEY_PASTE 0x7D
+#define HID_KEY_FIND 0x7E
+#define HID_KEY_MUTE 0x7F
+#define HID_KEY_VOLUME_UP 0x80
+#define HID_KEY_VOLUME_DOWN 0x81
+#define HID_KEY_LOCKING_CAPS_LOCK 0x82
+#define HID_KEY_LOCKING_NUM_LOCK 0x83
+#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
+#define HID_KEY_KEYPAD_COMMA 0x85
+#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
+#define HID_KEY_KANJI1 0x87
+#define HID_KEY_KANJI2 0x88
+#define HID_KEY_KANJI3 0x89
+#define HID_KEY_KANJI4 0x8A
+#define HID_KEY_KANJI5 0x8B
+#define HID_KEY_KANJI6 0x8C
+#define HID_KEY_KANJI7 0x8D
+#define HID_KEY_KANJI8 0x8E
+#define HID_KEY_KANJI9 0x8F
+#define HID_KEY_LANG1 0x90
+#define HID_KEY_LANG2 0x91
+#define HID_KEY_LANG3 0x92
+#define HID_KEY_LANG4 0x93
+#define HID_KEY_LANG5 0x94
+#define HID_KEY_LANG6 0x95
+#define HID_KEY_LANG7 0x96
+#define HID_KEY_LANG8 0x97
+#define HID_KEY_LANG9 0x98
+#define HID_KEY_ALTERNATE_ERASE 0x99
+#define HID_KEY_SYSREQ_ATTENTION 0x9A
+#define HID_KEY_CANCEL 0x9B
+#define HID_KEY_CLEAR 0x9C
+#define HID_KEY_PRIOR 0x9D
+#define HID_KEY_RETURN 0x9E
+#define HID_KEY_SEPARATOR 0x9F
+#define HID_KEY_OUT 0xA0
+#define HID_KEY_OPER 0xA1
+#define HID_KEY_CLEAR_AGAIN 0xA2
+#define HID_KEY_CRSEL_PROPS 0xA3
+#define HID_KEY_EXSEL 0xA4
+// RESERVED 0xA5-DF
+#define HID_KEY_CONTROL_LEFT 0xE0
+#define HID_KEY_SHIFT_LEFT 0xE1
+#define HID_KEY_ALT_LEFT 0xE2
+#define HID_KEY_GUI_LEFT 0xE3
+#define HID_KEY_CONTROL_RIGHT 0xE4
+#define HID_KEY_SHIFT_RIGHT 0xE5
+#define HID_KEY_ALT_RIGHT 0xE6
+#define HID_KEY_GUI_RIGHT 0xE7
+
+
+//--------------------------------------------------------------------+
+// REPORT DESCRIPTOR
+//--------------------------------------------------------------------+
+
+//------------- ITEM & TAG -------------//
+#define HID_REPORT_DATA_0(data)
+#define HID_REPORT_DATA_1(data) , data
+#define HID_REPORT_DATA_2(data) , U16_TO_U8S_LE(data)
+#define HID_REPORT_DATA_3(data) , U32_TO_U8S_LE(data)
+
+#define HID_REPORT_ITEM(data, tag, type, size) \
+ (((tag) << 4) | ((type) << 2) | (size)) HID_REPORT_DATA_##size(data)
+
+// Report Item Types
+enum {
+ RI_TYPE_MAIN = 0,
+ RI_TYPE_GLOBAL = 1,
+ RI_TYPE_LOCAL = 2
+};
+
+//------------- Main Items - HID 1.11 section 6.2.2.4 -------------//
+
+// Report Item Main group
+enum {
+ RI_MAIN_INPUT = 8,
+ RI_MAIN_OUTPUT = 9,
+ RI_MAIN_COLLECTION = 10,
+ RI_MAIN_FEATURE = 11,
+ RI_MAIN_COLLECTION_END = 12
+};
+
+#define HID_INPUT(x) HID_REPORT_ITEM(x, RI_MAIN_INPUT , RI_TYPE_MAIN, 1)
+#define HID_OUTPUT(x) HID_REPORT_ITEM(x, RI_MAIN_OUTPUT , RI_TYPE_MAIN, 1)
+#define HID_COLLECTION(x) HID_REPORT_ITEM(x, RI_MAIN_COLLECTION , RI_TYPE_MAIN, 1)
+#define HID_FEATURE(x) HID_REPORT_ITEM(x, RI_MAIN_FEATURE , RI_TYPE_MAIN, 1)
+#define HID_COLLECTION_END HID_REPORT_ITEM(x, RI_MAIN_COLLECTION_END, RI_TYPE_MAIN, 0)
+
+//------------- Input, Output, Feature - HID 1.11 section 6.2.2.5 -------------//
+#define HID_DATA (0<<0)
+#define HID_CONSTANT (1<<0)
+
+#define HID_ARRAY (0<<1)
+#define HID_VARIABLE (1<<1)
+
+#define HID_ABSOLUTE (0<<2)
+#define HID_RELATIVE (1<<2)
+
+#define HID_WRAP_NO (0<<3)
+#define HID_WRAP (1<<3)
+
+#define HID_LINEAR (0<<4)
+#define HID_NONLINEAR (1<<4)
+
+#define HID_PREFERRED_STATE (0<<5)
+#define HID_PREFERRED_NO (1<<5)
+
+#define HID_NO_NULL_POSITION (0<<6)
+#define HID_NULL_STATE (1<<6)
+
+#define HID_NON_VOLATILE (0<<7)
+#define HID_VOLATILE (1<<7)
+
+#define HID_BITFIELD (0<<8)
+#define HID_BUFFERED_BYTES (1<<8)
+
+//------------- Collection Item - HID 1.11 section 6.2.2.6 -------------//
+enum {
+ HID_COLLECTION_PHYSICAL = 0,
+ HID_COLLECTION_APPLICATION,
+ HID_COLLECTION_LOGICAL,
+ HID_COLLECTION_REPORT,
+ HID_COLLECTION_NAMED_ARRAY,
+ HID_COLLECTION_USAGE_SWITCH,
+ HID_COLLECTION_USAGE_MODIFIER
+};
+
+//------------- Global Items - HID 1.11 section 6.2.2.7 -------------//
+
+// Report Item Global group
+enum {
+ RI_GLOBAL_USAGE_PAGE = 0,
+ RI_GLOBAL_LOGICAL_MIN = 1,
+ RI_GLOBAL_LOGICAL_MAX = 2,
+ RI_GLOBAL_PHYSICAL_MIN = 3,
+ RI_GLOBAL_PHYSICAL_MAX = 4,
+ RI_GLOBAL_UNIT_EXPONENT = 5,
+ RI_GLOBAL_UNIT = 6,
+ RI_GLOBAL_REPORT_SIZE = 7,
+ RI_GLOBAL_REPORT_ID = 8,
+ RI_GLOBAL_REPORT_COUNT = 9,
+ RI_GLOBAL_PUSH = 10,
+ RI_GLOBAL_POP = 11
+};
+
+#define HID_USAGE_PAGE(x) HID_REPORT_ITEM(x, RI_GLOBAL_USAGE_PAGE, RI_TYPE_GLOBAL, 1)
+#define HID_USAGE_PAGE_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_USAGE_PAGE, RI_TYPE_GLOBAL, n)
+
+#define HID_LOGICAL_MIN(x) HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MIN, RI_TYPE_GLOBAL, 1)
+#define HID_LOGICAL_MIN_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MIN, RI_TYPE_GLOBAL, n)
+
+#define HID_LOGICAL_MAX(x) HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MAX, RI_TYPE_GLOBAL, 1)
+#define HID_LOGICAL_MAX_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MAX, RI_TYPE_GLOBAL, n)
+
+#define HID_PHYSICAL_MIN(x) HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MIN, RI_TYPE_GLOBAL, 1)
+#define HID_PHYSICAL_MIN_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MIN, RI_TYPE_GLOBAL, n)
+
+#define HID_PHYSICAL_MAX(x) HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MAX, RI_TYPE_GLOBAL, 1)
+#define HID_PHYSICAL_MAX_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MAX, RI_TYPE_GLOBAL, n)
+
+#define HID_UNIT_EXPONENT(x) HID_REPORT_ITEM(x, RI_GLOBAL_UNIT_EXPONENT, RI_TYPE_GLOBAL, 1)
+#define HID_UNIT_EXPONENT_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_UNIT_EXPONENT, RI_TYPE_GLOBAL, n)
+
+#define HID_UNIT(x) HID_REPORT_ITEM(x, RI_GLOBAL_UNIT, RI_TYPE_GLOBAL, 1)
+#define HID_UNIT_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_UNIT, RI_TYPE_GLOBAL, n)
+
+#define HID_REPORT_SIZE(x) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_SIZE, RI_TYPE_GLOBAL, 1)
+#define HID_REPORT_SIZE_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_SIZE, RI_TYPE_GLOBAL, n)
+
+#define HID_REPORT_ID(x) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_ID, RI_TYPE_GLOBAL, 1),
+#define HID_REPORT_ID_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_ID, RI_TYPE_GLOBAL, n),
+
+#define HID_REPORT_COUNT(x) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_COUNT, RI_TYPE_GLOBAL, 1)
+#define HID_REPORT_COUNT_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_COUNT, RI_TYPE_GLOBAL, n)
+
+#define HID_PUSH HID_REPORT_ITEM(x, RI_GLOBAL_PUSH, RI_TYPE_GLOBAL, 0)
+#define HID_POP HID_REPORT_ITEM(x, RI_GLOBAL_POP, RI_TYPE_GLOBAL, 0)
+
+//------------- LOCAL ITEMS 6.2.2.8 -------------//
+
+enum {
+ RI_LOCAL_USAGE = 0,
+ RI_LOCAL_USAGE_MIN = 1,
+ RI_LOCAL_USAGE_MAX = 2,
+ RI_LOCAL_DESIGNATOR_INDEX = 3,
+ RI_LOCAL_DESIGNATOR_MIN = 4,
+ RI_LOCAL_DESIGNATOR_MAX = 5,
+ // 6 is reserved
+ RI_LOCAL_STRING_INDEX = 7,
+ RI_LOCAL_STRING_MIN = 8,
+ RI_LOCAL_STRING_MAX = 9,
+ RI_LOCAL_DELIMITER = 10,
+};
+
+#define HID_USAGE(x) HID_REPORT_ITEM(x, RI_LOCAL_USAGE, RI_TYPE_LOCAL, 1)
+#define HID_USAGE_N(x, n) HID_REPORT_ITEM(x, RI_LOCAL_USAGE, RI_TYPE_LOCAL, n)
+
+#define HID_USAGE_MIN(x) HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MIN, RI_TYPE_LOCAL, 1)
+#define HID_USAGE_MIN_N(x, n) HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MIN, RI_TYPE_LOCAL, n)
+
+#define HID_USAGE_MAX(x) HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MAX, RI_TYPE_LOCAL, 1)
+#define HID_USAGE_MAX_N(x, n) HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MAX, RI_TYPE_LOCAL, n)
+
+//--------------------------------------------------------------------+
+// Usage Table
+//--------------------------------------------------------------------+
+
+/// HID Usage Table - Table 1: Usage Page Summary
+enum {
+ HID_USAGE_PAGE_DESKTOP = 0x01,
+ HID_USAGE_PAGE_SIMULATE = 0x02,
+ HID_USAGE_PAGE_VIRTUAL_REALITY = 0x03,
+ HID_USAGE_PAGE_SPORT = 0x04,
+ HID_USAGE_PAGE_GAME = 0x05,
+ HID_USAGE_PAGE_GENERIC_DEVICE = 0x06,
+ HID_USAGE_PAGE_KEYBOARD = 0x07,
+ HID_USAGE_PAGE_LED = 0x08,
+ HID_USAGE_PAGE_BUTTON = 0x09,
+ HID_USAGE_PAGE_ORDINAL = 0x0a,
+ HID_USAGE_PAGE_TELEPHONY = 0x0b,
+ HID_USAGE_PAGE_CONSUMER = 0x0c,
+ HID_USAGE_PAGE_DIGITIZER = 0x0d,
+ HID_USAGE_PAGE_PID = 0x0f,
+ HID_USAGE_PAGE_UNICODE = 0x10,
+ HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
+ HID_USAGE_PAGE_MEDICAL = 0x40,
+ HID_USAGE_PAGE_MONITOR = 0x80, //0x80 - 0x83
+ HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
+ HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,
+ HID_USAGE_PAGE_SCALE = 0x8d,
+ HID_USAGE_PAGE_MSR = 0x8e,
+ HID_USAGE_PAGE_CAMERA = 0x90,
+ HID_USAGE_PAGE_ARCADE = 0x91,
+ HID_USAGE_PAGE_FIDO = 0xF1D0, // FIDO alliance HID usage page
+ HID_USAGE_PAGE_VENDOR = 0xFF00 // 0xFF00 - 0xFFFF
+};
+
+/// HID Usage Table - Table 6: Generic Desktop Page
+enum {
+ HID_USAGE_DESKTOP_POINTER = 0x01,
+ HID_USAGE_DESKTOP_MOUSE = 0x02,
+ HID_USAGE_DESKTOP_JOYSTICK = 0x04,
+ HID_USAGE_DESKTOP_GAMEPAD = 0x05,
+ HID_USAGE_DESKTOP_KEYBOARD = 0x06,
+ HID_USAGE_DESKTOP_KEYPAD = 0x07,
+ HID_USAGE_DESKTOP_MULTI_AXIS_CONTROLLER = 0x08,
+ HID_USAGE_DESKTOP_TABLET_PC_SYSTEM = 0x09,
+ HID_USAGE_DESKTOP_X = 0x30,
+ HID_USAGE_DESKTOP_Y = 0x31,
+ HID_USAGE_DESKTOP_Z = 0x32,
+ HID_USAGE_DESKTOP_RX = 0x33,
+ HID_USAGE_DESKTOP_RY = 0x34,
+ HID_USAGE_DESKTOP_RZ = 0x35,
+ HID_USAGE_DESKTOP_SLIDER = 0x36,
+ HID_USAGE_DESKTOP_DIAL = 0x37,
+ HID_USAGE_DESKTOP_WHEEL = 0x38,
+ HID_USAGE_DESKTOP_HAT_SWITCH = 0x39,
+ HID_USAGE_DESKTOP_COUNTED_BUFFER = 0x3a,
+ HID_USAGE_DESKTOP_BYTE_COUNT = 0x3b,
+ HID_USAGE_DESKTOP_MOTION_WAKEUP = 0x3c,
+ HID_USAGE_DESKTOP_START = 0x3d,
+ HID_USAGE_DESKTOP_SELECT = 0x3e,
+ HID_USAGE_DESKTOP_VX = 0x40,
+ HID_USAGE_DESKTOP_VY = 0x41,
+ HID_USAGE_DESKTOP_VZ = 0x42,
+ HID_USAGE_DESKTOP_VBRX = 0x43,
+ HID_USAGE_DESKTOP_VBRY = 0x44,
+ HID_USAGE_DESKTOP_VBRZ = 0x45,
+ HID_USAGE_DESKTOP_VNO = 0x46,
+ HID_USAGE_DESKTOP_FEATURE_NOTIFICATION = 0x47,
+ HID_USAGE_DESKTOP_RESOLUTION_MULTIPLIER = 0x48,
+ HID_USAGE_DESKTOP_SYSTEM_CONTROL = 0x80,
+ HID_USAGE_DESKTOP_SYSTEM_POWER_DOWN = 0x81,
+ HID_USAGE_DESKTOP_SYSTEM_SLEEP = 0x82,
+ HID_USAGE_DESKTOP_SYSTEM_WAKE_UP = 0x83,
+ HID_USAGE_DESKTOP_SYSTEM_CONTEXT_MENU = 0x84,
+ HID_USAGE_DESKTOP_SYSTEM_MAIN_MENU = 0x85,
+ HID_USAGE_DESKTOP_SYSTEM_APP_MENU = 0x86,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_HELP = 0x87,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_EXIT = 0x88,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_SELECT = 0x89,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_RIGHT = 0x8A,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_LEFT = 0x8B,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_UP = 0x8C,
+ HID_USAGE_DESKTOP_SYSTEM_MENU_DOWN = 0x8D,
+ HID_USAGE_DESKTOP_SYSTEM_COLD_RESTART = 0x8E,
+ HID_USAGE_DESKTOP_SYSTEM_WARM_RESTART = 0x8F,
+ HID_USAGE_DESKTOP_DPAD_UP = 0x90,
+ HID_USAGE_DESKTOP_DPAD_DOWN = 0x91,
+ HID_USAGE_DESKTOP_DPAD_RIGHT = 0x92,
+ HID_USAGE_DESKTOP_DPAD_LEFT = 0x93,
+ HID_USAGE_DESKTOP_SYSTEM_DOCK = 0xA0,
+ HID_USAGE_DESKTOP_SYSTEM_UNDOCK = 0xA1,
+ HID_USAGE_DESKTOP_SYSTEM_SETUP = 0xA2,
+ HID_USAGE_DESKTOP_SYSTEM_BREAK = 0xA3,
+ HID_USAGE_DESKTOP_SYSTEM_DEBUGGER_BREAK = 0xA4,
+ HID_USAGE_DESKTOP_APPLICATION_BREAK = 0xA5,
+ HID_USAGE_DESKTOP_APPLICATION_DEBUGGER_BREAK = 0xA6,
+ HID_USAGE_DESKTOP_SYSTEM_SPEAKER_MUTE = 0xA7,
+ HID_USAGE_DESKTOP_SYSTEM_HIBERNATE = 0xA8,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_INVERT = 0xB0,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_INTERNAL = 0xB1,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_EXTERNAL = 0xB2,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_BOTH = 0xB3,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_DUAL = 0xB4,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_TOGGLE_INT_EXT = 0xB5,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_SWAP_PRIMARY_SECONDARY = 0xB6,
+ HID_USAGE_DESKTOP_SYSTEM_DISPLAY_LCD_AUTOSCALE = 0xB7
+};
+
+
+/// HID Usage Table: Consumer Page (0x0C)
+/// Only contains controls that supported by Windows (whole list is too long)
+enum
+{
+ // Generic Control
+ HID_USAGE_CONSUMER_CONTROL = 0x0001,
+
+ // Power Control
+ HID_USAGE_CONSUMER_POWER = 0x0030,
+ HID_USAGE_CONSUMER_RESET = 0x0031,
+ HID_USAGE_CONSUMER_SLEEP = 0x0032,
+
+ // Screen Brightness
+ HID_USAGE_CONSUMER_BRIGHTNESS_INCREMENT = 0x006F,
+ HID_USAGE_CONSUMER_BRIGHTNESS_DECREMENT = 0x0070,
+
+ // These HID usages operate only on mobile systems (battery powered) and
+ // require Windows 8 (build 8302 or greater).
+ HID_USAGE_CONSUMER_WIRELESS_RADIO_CONTROLS = 0x000C,
+ HID_USAGE_CONSUMER_WIRELESS_RADIO_BUTTONS = 0x00C6,
+ HID_USAGE_CONSUMER_WIRELESS_RADIO_LED = 0x00C7,
+ HID_USAGE_CONSUMER_WIRELESS_RADIO_SLIDER_SWITCH = 0x00C8,
+
+ // Media Control
+ HID_USAGE_CONSUMER_PLAY_PAUSE = 0x00CD,
+ HID_USAGE_CONSUMER_SCAN_NEXT = 0x00B5,
+ HID_USAGE_CONSUMER_SCAN_PREVIOUS = 0x00B6,
+ HID_USAGE_CONSUMER_STOP = 0x00B7,
+ HID_USAGE_CONSUMER_VOLUME = 0x00E0,
+ HID_USAGE_CONSUMER_MUTE = 0x00E2,
+ HID_USAGE_CONSUMER_BASS = 0x00E3,
+ HID_USAGE_CONSUMER_TREBLE = 0x00E4,
+ HID_USAGE_CONSUMER_BASS_BOOST = 0x00E5,
+ HID_USAGE_CONSUMER_VOLUME_INCREMENT = 0x00E9,
+ HID_USAGE_CONSUMER_VOLUME_DECREMENT = 0x00EA,
+ HID_USAGE_CONSUMER_BASS_INCREMENT = 0x0152,
+ HID_USAGE_CONSUMER_BASS_DECREMENT = 0x0153,
+ HID_USAGE_CONSUMER_TREBLE_INCREMENT = 0x0154,
+ HID_USAGE_CONSUMER_TREBLE_DECREMENT = 0x0155,
+
+ // Application Launcher
+ HID_USAGE_CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION = 0x0183,
+ HID_USAGE_CONSUMER_AL_EMAIL_READER = 0x018A,
+ HID_USAGE_CONSUMER_AL_CALCULATOR = 0x0192,
+ HID_USAGE_CONSUMER_AL_LOCAL_BROWSER = 0x0194,
+
+ // Browser/Explorer Specific
+ HID_USAGE_CONSUMER_AC_SEARCH = 0x0221,
+ HID_USAGE_CONSUMER_AC_HOME = 0x0223,
+ HID_USAGE_CONSUMER_AC_BACK = 0x0224,
+ HID_USAGE_CONSUMER_AC_FORWARD = 0x0225,
+ HID_USAGE_CONSUMER_AC_STOP = 0x0226,
+ HID_USAGE_CONSUMER_AC_REFRESH = 0x0227,
+ HID_USAGE_CONSUMER_AC_BOOKMARKS = 0x022A,
+
+ // Mouse Horizontal scroll
+ HID_USAGE_CONSUMER_AC_PAN = 0x0238,
+};
+
+/// HID Usage Table: FIDO Alliance Page (0xF1D0)
+enum
+{
+ HID_USAGE_FIDO_U2FHID = 0x01, // U2FHID usage for top-level collection
+ HID_USAGE_FIDO_DATA_IN = 0x20, // Raw IN data report
+ HID_USAGE_FIDO_DATA_OUT = 0x21 // Raw OUT data report
+};
+
+/*--------------------------------------------------------------------
+ * ASCII to KEYCODE Conversion
+ * Expand to array of [128][2] (shift, keycode)
+ *
+ * Usage: example to convert input chr into keyboard report (modifier + keycode)
+ *
+ * uint8_t const conv_table[128][2] = { HID_ASCII_TO_KEYCODE };
+ *
+ * uint8_t keycode[6] = { 0 };
+ * uint8_t modifier = 0;
+ *
+ * if ( conv_table[chr][0] ) modifier = KEYBOARD_MODIFIER_LEFTSHIFT;
+ * keycode[0] = conv_table[chr][1];
+ * tud_hid_keyboard_report(report_id, modifier, keycode);
+ *
+ *--------------------------------------------------------------------*/
+#define HID_ASCII_TO_KEYCODE \
+ {0, 0 }, /* 0x00 Null */ \
+ {0, 0 }, /* 0x01 */ \
+ {0, 0 }, /* 0x02 */ \
+ {0, 0 }, /* 0x03 */ \
+ {0, 0 }, /* 0x04 */ \
+ {0, 0 }, /* 0x05 */ \
+ {0, 0 }, /* 0x06 */ \
+ {0, 0 }, /* 0x07 */ \
+ {0, HID_KEY_BACKSPACE }, /* 0x08 Backspace */ \
+ {0, HID_KEY_TAB }, /* 0x09 Tab */ \
+ {0, HID_KEY_ENTER }, /* 0x0A Line Feed */ \
+ {0, 0 }, /* 0x0B */ \
+ {0, 0 }, /* 0x0C */ \
+ {0, HID_KEY_ENTER }, /* 0x0D CR */ \
+ {0, 0 }, /* 0x0E */ \
+ {0, 0 }, /* 0x0F */ \
+ {0, 0 }, /* 0x10 */ \
+ {0, 0 }, /* 0x11 */ \
+ {0, 0 }, /* 0x12 */ \
+ {0, 0 }, /* 0x13 */ \
+ {0, 0 }, /* 0x14 */ \
+ {0, 0 }, /* 0x15 */ \
+ {0, 0 }, /* 0x16 */ \
+ {0, 0 }, /* 0x17 */ \
+ {0, 0 }, /* 0x18 */ \
+ {0, 0 }, /* 0x19 */ \
+ {0, 0 }, /* 0x1A */ \
+ {0, HID_KEY_ESCAPE }, /* 0x1B Escape */ \
+ {0, 0 }, /* 0x1C */ \
+ {0, 0 }, /* 0x1D */ \
+ {0, 0 }, /* 0x1E */ \
+ {0, 0 }, /* 0x1F */ \
+ \
+ {0, HID_KEY_SPACE }, /* 0x20 */ \
+ {1, HID_KEY_1 }, /* 0x21 ! */ \
+ {1, HID_KEY_APOSTROPHE }, /* 0x22 " */ \
+ {1, HID_KEY_3 }, /* 0x23 # */ \
+ {1, HID_KEY_4 }, /* 0x24 $ */ \
+ {1, HID_KEY_5 }, /* 0x25 % */ \
+ {1, HID_KEY_7 }, /* 0x26 & */ \
+ {0, HID_KEY_APOSTROPHE }, /* 0x27 ' */ \
+ {1, HID_KEY_9 }, /* 0x28 ( */ \
+ {1, HID_KEY_0 }, /* 0x29 ) */ \
+ {1, HID_KEY_8 }, /* 0x2A * */ \
+ {1, HID_KEY_EQUAL }, /* 0x2B + */ \
+ {0, HID_KEY_COMMA }, /* 0x2C , */ \
+ {0, HID_KEY_MINUS }, /* 0x2D - */ \
+ {0, HID_KEY_PERIOD }, /* 0x2E . */ \
+ {0, HID_KEY_SLASH }, /* 0x2F / */ \
+ {0, HID_KEY_0 }, /* 0x30 0 */ \
+ {0, HID_KEY_1 }, /* 0x31 1 */ \
+ {0, HID_KEY_2 }, /* 0x32 2 */ \
+ {0, HID_KEY_3 }, /* 0x33 3 */ \
+ {0, HID_KEY_4 }, /* 0x34 4 */ \
+ {0, HID_KEY_5 }, /* 0x35 5 */ \
+ {0, HID_KEY_6 }, /* 0x36 6 */ \
+ {0, HID_KEY_7 }, /* 0x37 7 */ \
+ {0, HID_KEY_8 }, /* 0x38 8 */ \
+ {0, HID_KEY_9 }, /* 0x39 9 */ \
+ {1, HID_KEY_SEMICOLON }, /* 0x3A : */ \
+ {0, HID_KEY_SEMICOLON }, /* 0x3B ; */ \
+ {1, HID_KEY_COMMA }, /* 0x3C < */ \
+ {0, HID_KEY_EQUAL }, /* 0x3D = */ \
+ {1, HID_KEY_PERIOD }, /* 0x3E > */ \
+ {1, HID_KEY_SLASH }, /* 0x3F ? */ \
+ \
+ {1, HID_KEY_2 }, /* 0x40 @ */ \
+ {1, HID_KEY_A }, /* 0x41 A */ \
+ {1, HID_KEY_B }, /* 0x42 B */ \
+ {1, HID_KEY_C }, /* 0x43 C */ \
+ {1, HID_KEY_D }, /* 0x44 D */ \
+ {1, HID_KEY_E }, /* 0x45 E */ \
+ {1, HID_KEY_F }, /* 0x46 F */ \
+ {1, HID_KEY_G }, /* 0x47 G */ \
+ {1, HID_KEY_H }, /* 0x48 H */ \
+ {1, HID_KEY_I }, /* 0x49 I */ \
+ {1, HID_KEY_J }, /* 0x4A J */ \
+ {1, HID_KEY_K }, /* 0x4B K */ \
+ {1, HID_KEY_L }, /* 0x4C L */ \
+ {1, HID_KEY_M }, /* 0x4D M */ \
+ {1, HID_KEY_N }, /* 0x4E N */ \
+ {1, HID_KEY_O }, /* 0x4F O */ \
+ {1, HID_KEY_P }, /* 0x50 P */ \
+ {1, HID_KEY_Q }, /* 0x51 Q */ \
+ {1, HID_KEY_R }, /* 0x52 R */ \
+ {1, HID_KEY_S }, /* 0x53 S */ \
+ {1, HID_KEY_T }, /* 0x55 T */ \
+ {1, HID_KEY_U }, /* 0x55 U */ \
+ {1, HID_KEY_V }, /* 0x56 V */ \
+ {1, HID_KEY_W }, /* 0x57 W */ \
+ {1, HID_KEY_X }, /* 0x58 X */ \
+ {1, HID_KEY_Y }, /* 0x59 Y */ \
+ {1, HID_KEY_Z }, /* 0x5A Z */ \
+ {0, HID_KEY_BRACKET_LEFT }, /* 0x5B [ */ \
+ {0, HID_KEY_BACKSLASH }, /* 0x5C '\' */ \
+ {0, HID_KEY_BRACKET_RIGHT }, /* 0x5D ] */ \
+ {1, HID_KEY_6 }, /* 0x5E ^ */ \
+ {1, HID_KEY_MINUS }, /* 0x5F _ */ \
+ \
+ {0, HID_KEY_GRAVE }, /* 0x60 ` */ \
+ {0, HID_KEY_A }, /* 0x61 a */ \
+ {0, HID_KEY_B }, /* 0x62 b */ \
+ {0, HID_KEY_C }, /* 0x63 c */ \
+ {0, HID_KEY_D }, /* 0x66 d */ \
+ {0, HID_KEY_E }, /* 0x65 e */ \
+ {0, HID_KEY_F }, /* 0x66 f */ \
+ {0, HID_KEY_G }, /* 0x67 g */ \
+ {0, HID_KEY_H }, /* 0x68 h */ \
+ {0, HID_KEY_I }, /* 0x69 i */ \
+ {0, HID_KEY_J }, /* 0x6A j */ \
+ {0, HID_KEY_K }, /* 0x6B k */ \
+ {0, HID_KEY_L }, /* 0x6C l */ \
+ {0, HID_KEY_M }, /* 0x6D m */ \
+ {0, HID_KEY_N }, /* 0x6E n */ \
+ {0, HID_KEY_O }, /* 0x6F o */ \
+ {0, HID_KEY_P }, /* 0x70 p */ \
+ {0, HID_KEY_Q }, /* 0x71 q */ \
+ {0, HID_KEY_R }, /* 0x72 r */ \
+ {0, HID_KEY_S }, /* 0x73 s */ \
+ {0, HID_KEY_T }, /* 0x75 t */ \
+ {0, HID_KEY_U }, /* 0x75 u */ \
+ {0, HID_KEY_V }, /* 0x76 v */ \
+ {0, HID_KEY_W }, /* 0x77 w */ \
+ {0, HID_KEY_X }, /* 0x78 x */ \
+ {0, HID_KEY_Y }, /* 0x79 y */ \
+ {0, HID_KEY_Z }, /* 0x7A z */ \
+ {1, HID_KEY_BRACKET_LEFT }, /* 0x7B { */ \
+ {1, HID_KEY_BACKSLASH }, /* 0x7C | */ \
+ {1, HID_KEY_BRACKET_RIGHT }, /* 0x7D } */ \
+ {1, HID_KEY_GRAVE }, /* 0x7E ~ */ \
+ {0, HID_KEY_DELETE } /* 0x7F Delete */ \
+
+/*--------------------------------------------------------------------
+ * KEYCODE to Ascii Conversion
+ * Expand to array of [128][2] (ascii without shift, ascii with shift)
+ *
+ * Usage: example to convert ascii from keycode (key) and shift modifier (shift).
+ * Here we assume key < 128 ( printable )
+ *
+ * uint8_t const conv_table[128][2] = { HID_KEYCODE_TO_ASCII };
+ * char ch = shift ? conv_table[chr][1] : conv_table[chr][0];
+ *
+ *--------------------------------------------------------------------*/
+#define HID_KEYCODE_TO_ASCII \
+ {0 , 0 }, /* 0x00 */ \
+ {0 , 0 }, /* 0x01 */ \
+ {0 , 0 }, /* 0x02 */ \
+ {0 , 0 }, /* 0x03 */ \
+ {'a' , 'A' }, /* 0x04 */ \
+ {'b' , 'B' }, /* 0x05 */ \
+ {'c' , 'C' }, /* 0x06 */ \
+ {'d' , 'D' }, /* 0x07 */ \
+ {'e' , 'E' }, /* 0x08 */ \
+ {'f' , 'F' }, /* 0x09 */ \
+ {'g' , 'G' }, /* 0x0a */ \
+ {'h' , 'H' }, /* 0x0b */ \
+ {'i' , 'I' }, /* 0x0c */ \
+ {'j' , 'J' }, /* 0x0d */ \
+ {'k' , 'K' }, /* 0x0e */ \
+ {'l' , 'L' }, /* 0x0f */ \
+ {'m' , 'M' }, /* 0x10 */ \
+ {'n' , 'N' }, /* 0x11 */ \
+ {'o' , 'O' }, /* 0x12 */ \
+ {'p' , 'P' }, /* 0x13 */ \
+ {'q' , 'Q' }, /* 0x14 */ \
+ {'r' , 'R' }, /* 0x15 */ \
+ {'s' , 'S' }, /* 0x16 */ \
+ {'t' , 'T' }, /* 0x17 */ \
+ {'u' , 'U' }, /* 0x18 */ \
+ {'v' , 'V' }, /* 0x19 */ \
+ {'w' , 'W' }, /* 0x1a */ \
+ {'x' , 'X' }, /* 0x1b */ \
+ {'y' , 'Y' }, /* 0x1c */ \
+ {'z' , 'Z' }, /* 0x1d */ \
+ {'1' , '!' }, /* 0x1e */ \
+ {'2' , '@' }, /* 0x1f */ \
+ {'3' , '#' }, /* 0x20 */ \
+ {'4' , '$' }, /* 0x21 */ \
+ {'5' , '%' }, /* 0x22 */ \
+ {'6' , '^' }, /* 0x23 */ \
+ {'7' , '&' }, /* 0x24 */ \
+ {'8' , '*' }, /* 0x25 */ \
+ {'9' , '(' }, /* 0x26 */ \
+ {'0' , ')' }, /* 0x27 */ \
+ {'\r' , '\r' }, /* 0x28 */ \
+ {'\x1b', '\x1b' }, /* 0x29 */ \
+ {'\b' , '\b' }, /* 0x2a */ \
+ {'\t' , '\t' }, /* 0x2b */ \
+ {' ' , ' ' }, /* 0x2c */ \
+ {'-' , '_' }, /* 0x2d */ \
+ {'=' , '+' }, /* 0x2e */ \
+ {'[' , '{' }, /* 0x2f */ \
+ {']' , '}' }, /* 0x30 */ \
+ {'\\' , '|' }, /* 0x31 */ \
+ {'#' , '~' }, /* 0x32 */ \
+ {';' , ':' }, /* 0x33 */ \
+ {'\'' , '\"' }, /* 0x34 */ \
+ {'`' , '~' }, /* 0x35 */ \
+ {',' , '<' }, /* 0x36 */ \
+ {'.' , '>' }, /* 0x37 */ \
+ {'/' , '?' }, /* 0x38 */ \
+ \
+ {0 , 0 }, /* 0x39 */ \
+ {0 , 0 }, /* 0x3a */ \
+ {0 , 0 }, /* 0x3b */ \
+ {0 , 0 }, /* 0x3c */ \
+ {0 , 0 }, /* 0x3d */ \
+ {0 , 0 }, /* 0x3e */ \
+ {0 , 0 }, /* 0x3f */ \
+ {0 , 0 }, /* 0x40 */ \
+ {0 , 0 }, /* 0x41 */ \
+ {0 , 0 }, /* 0x42 */ \
+ {0 , 0 }, /* 0x43 */ \
+ {0 , 0 }, /* 0x44 */ \
+ {0 , 0 }, /* 0x45 */ \
+ {0 , 0 }, /* 0x46 */ \
+ {0 , 0 }, /* 0x47 */ \
+ {0 , 0 }, /* 0x48 */ \
+ {0 , 0 }, /* 0x49 */ \
+ {0 , 0 }, /* 0x4a */ \
+ {0 , 0 }, /* 0x4b */ \
+ {0 , 0 }, /* 0x4c */ \
+ {0 , 0 }, /* 0x4d */ \
+ {0 , 0 }, /* 0x4e */ \
+ {0 , 0 }, /* 0x4f */ \
+ {0 , 0 }, /* 0x50 */ \
+ {0 , 0 }, /* 0x51 */ \
+ {0 , 0 }, /* 0x52 */ \
+ {0 , 0 }, /* 0x53 */ \
+ \
+ {'/' , '/' }, /* 0x54 */ \
+ {'*' , '*' }, /* 0x55 */ \
+ {'-' , '-' }, /* 0x56 */ \
+ {'+' , '+' }, /* 0x57 */ \
+ {'\r' , '\r' }, /* 0x58 */ \
+ {'1' , 0 }, /* 0x59 */ \
+ {'2' , 0 }, /* 0x5a */ \
+ {'3' , 0 }, /* 0x5b */ \
+ {'4' , 0 }, /* 0x5c */ \
+ {'5' , '5' }, /* 0x5d */ \
+ {'6' , 0 }, /* 0x5e */ \
+ {'7' , 0 }, /* 0x5f */ \
+ {'8' , 0 }, /* 0x60 */ \
+ {'9' , 0 }, /* 0x61 */ \
+ {'0' , 0 }, /* 0x62 */ \
+ {'.' , 0 }, /* 0x63 */ \
+ {0 , 0 }, /* 0x64 */ \
+ {0 , 0 }, /* 0x65 */ \
+ {0 , 0 }, /* 0x66 */ \
+ {'=' , '=' }, /* 0x67 */ \
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_HID_H__ */
+
+/// @}
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.c
new file mode 100644
index 000000000..2d46d760f
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.c
@@ -0,0 +1,419 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if (CFG_TUD_ENABLED && CFG_TUD_HID)
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "device/usbd.h"
+#include "device/usbd_pvt.h"
+
+#include "hid_device.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+typedef struct
+{
+ uint8_t itf_num;
+ uint8_t ep_in;
+ uint8_t ep_out; // optional Out endpoint
+ uint8_t itf_protocol; // Boot mouse or keyboard
+
+ uint8_t protocol_mode; // Boot (0) or Report protocol (1)
+ uint8_t idle_rate; // up to application to handle idle rate
+ uint16_t report_desc_len;
+
+ CFG_TUSB_MEM_ALIGN uint8_t epin_buf[CFG_TUD_HID_EP_BUFSIZE];
+ CFG_TUSB_MEM_ALIGN uint8_t epout_buf[CFG_TUD_HID_EP_BUFSIZE];
+
+ // TODO save hid descriptor since host can specifically request this after enumeration
+ // Note: HID descriptor may be not available from application after enumeration
+ tusb_hid_descriptor_hid_t const * hid_descriptor;
+} hidd_interface_t;
+
+CFG_TUSB_MEM_SECTION static hidd_interface_t _hidd_itf[CFG_TUD_HID];
+
+/*------------- Helpers -------------*/
+static inline uint8_t get_index_by_itfnum(uint8_t itf_num)
+{
+ for (uint8_t i=0; i < CFG_TUD_HID; i++ )
+ {
+ if ( itf_num == _hidd_itf[i].itf_num ) return i;
+ }
+
+ return 0xFF;
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION API
+//--------------------------------------------------------------------+
+bool tud_hid_n_ready(uint8_t instance)
+{
+ uint8_t const rhport = 0;
+ uint8_t const ep_in = _hidd_itf[instance].ep_in;
+ return tud_ready() && (ep_in != 0) && !usbd_edpt_busy(rhport, ep_in);
+}
+
+bool tud_hid_n_report(uint8_t instance, uint8_t report_id, void const* report, uint16_t len)
+{
+ uint8_t const rhport = 0;
+ hidd_interface_t * p_hid = &_hidd_itf[instance];
+
+ // claim endpoint
+ TU_VERIFY( usbd_edpt_claim(rhport, p_hid->ep_in) );
+
+ // prepare data
+ if (report_id)
+ {
+ len = tu_min16(len, CFG_TUD_HID_EP_BUFSIZE-1);
+
+ p_hid->epin_buf[0] = report_id;
+ memcpy(p_hid->epin_buf+1, report, len);
+ len++;
+ }else
+ {
+ // If report id = 0, skip ID field
+ len = tu_min16(len, CFG_TUD_HID_EP_BUFSIZE);
+ memcpy(p_hid->epin_buf, report, len);
+ }
+
+ return usbd_edpt_xfer(rhport, p_hid->ep_in, p_hid->epin_buf, len);
+}
+
+uint8_t tud_hid_n_interface_protocol(uint8_t instance)
+{
+ return _hidd_itf[instance].itf_protocol;
+}
+
+uint8_t tud_hid_n_get_protocol(uint8_t instance)
+{
+ return _hidd_itf[instance].protocol_mode;
+}
+
+bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, uint8_t keycode[6])
+{
+ hid_keyboard_report_t report;
+
+ report.modifier = modifier;
+ report.reserved = 0;
+
+ if ( keycode )
+ {
+ memcpy(report.keycode, keycode, 6);
+ }else
+ {
+ tu_memclr(report.keycode, 6);
+ }
+
+ return tud_hid_n_report(instance, report_id, &report, sizeof(report));
+}
+
+bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id,
+ uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal)
+{
+ hid_mouse_report_t report =
+ {
+ .buttons = buttons,
+ .x = x,
+ .y = y,
+ .wheel = vertical,
+ .pan = horizontal
+ };
+
+ return tud_hid_n_report(instance, report_id, &report, sizeof(report));
+}
+
+bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id,
+ int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons)
+{
+ hid_gamepad_report_t report =
+ {
+ .x = x,
+ .y = y,
+ .z = z,
+ .rz = rz,
+ .rx = rx,
+ .ry = ry,
+ .hat = hat,
+ .buttons = buttons,
+ };
+
+ return tud_hid_n_report(instance, report_id, &report, sizeof(report));
+}
+
+//--------------------------------------------------------------------+
+// USBD-CLASS API
+//--------------------------------------------------------------------+
+void hidd_init(void)
+{
+ hidd_reset(0);
+}
+
+void hidd_reset(uint8_t rhport)
+{
+ (void) rhport;
+ tu_memclr(_hidd_itf, sizeof(_hidd_itf));
+}
+
+uint16_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
+{
+ TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0);
+
+ // len = interface + hid + n*endpoints
+ uint16_t const drv_len = (uint16_t) (sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) +
+ desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));
+ TU_ASSERT(max_len >= drv_len, 0);
+
+ // Find available interface
+ hidd_interface_t * p_hid = NULL;
+ uint8_t hid_id;
+ for(hid_id=0; hid_idhid_descriptor = (tusb_hid_descriptor_hid_t const *) p_desc;
+
+ //------------- Endpoint Descriptor -------------//
+ p_desc = tu_desc_next(p_desc);
+ TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_INTERRUPT, &p_hid->ep_out, &p_hid->ep_in), 0);
+
+ if ( desc_itf->bInterfaceSubClass == HID_SUBCLASS_BOOT ) p_hid->itf_protocol = desc_itf->bInterfaceProtocol;
+
+ p_hid->protocol_mode = HID_PROTOCOL_REPORT; // Per Specs: default is report mode
+ p_hid->itf_num = desc_itf->bInterfaceNumber;
+
+ // Use offsetof to avoid pointer to the odd/misaligned address
+ p_hid->report_desc_len = tu_unaligned_read16((uint8_t const*) p_hid->hid_descriptor + offsetof(tusb_hid_descriptor_hid_t, wReportLength));
+
+ // Prepare for output endpoint
+ if (p_hid->ep_out)
+ {
+ if ( !usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)) )
+ {
+ TU_LOG_FAILED();
+ TU_BREAKPOINT();
+ }
+ }
+
+ return drv_len;
+}
+
+// Invoked when a control transfer occurred on an interface of this class
+// Driver response accordingly to the request and the transfer stage (setup/data/ack)
+// return false to stall control endpoint (e.g unsupported request)
+bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
+{
+ TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
+
+ uint8_t const hid_itf = get_index_by_itfnum((uint8_t) request->wIndex);
+ TU_VERIFY(hid_itf < CFG_TUD_HID);
+
+ hidd_interface_t* p_hid = &_hidd_itf[hid_itf];
+
+ if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
+ {
+ //------------- STD Request -------------//
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ uint8_t const desc_type = tu_u16_high(request->wValue);
+ //uint8_t const desc_index = tu_u16_low (request->wValue);
+
+ if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID)
+ {
+ TU_VERIFY(p_hid->hid_descriptor);
+ TU_VERIFY(tud_control_xfer(rhport, request, (void*)(uintptr_t) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength));
+ }
+ else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
+ {
+ uint8_t const * desc_report = tud_hid_descriptor_report_cb(hid_itf);
+ tud_control_xfer(rhport, request, (void*)(uintptr_t) desc_report, p_hid->report_desc_len);
+ }
+ else
+ {
+ return false; // stall unsupported request
+ }
+ }
+ }
+ else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS)
+ {
+ //------------- Class Specific Request -------------//
+ switch( request->bRequest )
+ {
+ case HID_REQ_CONTROL_GET_REPORT:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ uint8_t const report_type = tu_u16_high(request->wValue);
+ uint8_t const report_id = tu_u16_low(request->wValue);
+
+ uint8_t* report_buf = p_hid->epin_buf;
+ uint16_t req_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE);
+
+ uint16_t xferlen = 0;
+
+ // If host request a specific Report ID, add ID to as 1 byte of response
+ if ( (report_id != HID_REPORT_TYPE_INVALID) && (req_len > 1) )
+ {
+ *report_buf++ = report_id;
+ req_len--;
+
+ xferlen++;
+ }
+
+ xferlen += tud_hid_get_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, report_buf, req_len);
+ TU_ASSERT( xferlen > 0 );
+
+ tud_control_xfer(rhport, request, p_hid->epin_buf, xferlen);
+ }
+ break;
+
+ case HID_REQ_CONTROL_SET_REPORT:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ TU_VERIFY(request->wLength <= sizeof(p_hid->epout_buf));
+ tud_control_xfer(rhport, request, p_hid->epout_buf, request->wLength);
+ }
+ else if ( stage == CONTROL_STAGE_ACK )
+ {
+ uint8_t const report_type = tu_u16_high(request->wValue);
+ uint8_t const report_id = tu_u16_low(request->wValue);
+
+ uint8_t const* report_buf = p_hid->epout_buf;
+ uint16_t report_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE);
+
+ // If host request a specific Report ID, extract report ID in buffer before invoking callback
+ if ( (report_id != HID_REPORT_TYPE_INVALID) && (report_len > 1) && (report_id == report_buf[0]) )
+ {
+ report_buf++;
+ report_len--;
+ }
+
+ tud_hid_set_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, report_buf, report_len);
+ }
+ break;
+
+ case HID_REQ_CONTROL_SET_IDLE:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ p_hid->idle_rate = tu_u16_high(request->wValue);
+ if ( tud_hid_set_idle_cb )
+ {
+ // stall request if callback return false
+ TU_VERIFY( tud_hid_set_idle_cb( hid_itf, p_hid->idle_rate) );
+ }
+
+ tud_control_status(rhport, request);
+ }
+ break;
+
+ case HID_REQ_CONTROL_GET_IDLE:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ // TODO idle rate of report
+ tud_control_xfer(rhport, request, &p_hid->idle_rate, 1);
+ }
+ break;
+
+ case HID_REQ_CONTROL_GET_PROTOCOL:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ tud_control_xfer(rhport, request, &p_hid->protocol_mode, 1);
+ }
+ break;
+
+ case HID_REQ_CONTROL_SET_PROTOCOL:
+ if ( stage == CONTROL_STAGE_SETUP )
+ {
+ tud_control_status(rhport, request);
+ }
+ else if ( stage == CONTROL_STAGE_ACK )
+ {
+ p_hid->protocol_mode = (uint8_t) request->wValue;
+ if (tud_hid_set_protocol_cb)
+ {
+ tud_hid_set_protocol_cb(hid_itf, p_hid->protocol_mode);
+ }
+ }
+ break;
+
+ default: return false; // stall unsupported request
+ }
+ }else
+ {
+ return false; // stall unsupported request
+ }
+
+ return true;
+}
+
+bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
+{
+ (void) result;
+
+ uint8_t instance = 0;
+ hidd_interface_t * p_hid = _hidd_itf;
+
+ // Identify which interface to use
+ for (instance = 0; instance < CFG_TUD_HID; instance++)
+ {
+ p_hid = &_hidd_itf[instance];
+ if ( (ep_addr == p_hid->ep_out) || (ep_addr == p_hid->ep_in) ) break;
+ }
+ TU_ASSERT(instance < CFG_TUD_HID);
+
+ // Sent report successfully
+ if (ep_addr == p_hid->ep_in)
+ {
+ if (tud_hid_report_complete_cb)
+ {
+ tud_hid_report_complete_cb(instance, p_hid->epin_buf, (uint16_t) xferred_bytes);
+ }
+ }
+ // Received report
+ else if (ep_addr == p_hid->ep_out)
+ {
+ tud_hid_set_report_cb(instance, 0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, (uint16_t) xferred_bytes);
+ TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)));
+ }
+
+ return true;
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.h
new file mode 100644
index 000000000..17b24def1
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_device.h
@@ -0,0 +1,418 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_HID_DEVICE_H_
+#define _TUSB_HID_DEVICE_H_
+
+#include "hid.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Class Driver Default Configure & Validation
+//--------------------------------------------------------------------+
+
+#if !defined(CFG_TUD_HID_EP_BUFSIZE) & defined(CFG_TUD_HID_BUFSIZE)
+ // TODO warn user to use new name later on
+ // #warning CFG_TUD_HID_BUFSIZE is renamed to CFG_TUD_HID_EP_BUFSIZE, please update to use the new name
+ #define CFG_TUD_HID_EP_BUFSIZE CFG_TUD_HID_BUFSIZE
+#endif
+
+#ifndef CFG_TUD_HID_EP_BUFSIZE
+ #define CFG_TUD_HID_EP_BUFSIZE 64
+#endif
+
+//--------------------------------------------------------------------+
+// Application API (Multiple Instances)
+// CFG_TUD_HID > 1
+//--------------------------------------------------------------------+
+
+// Check if the interface is ready to use
+bool tud_hid_n_ready(uint8_t instance);
+
+// Get interface supported protocol (bInterfaceProtocol) check out hid_interface_protocol_enum_t for possible values
+uint8_t tud_hid_n_interface_protocol(uint8_t instance);
+
+// Get current active protocol: HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)
+uint8_t tud_hid_n_get_protocol(uint8_t instance);
+
+// Send report to host
+bool tud_hid_n_report(uint8_t instance, uint8_t report_id, void const* report, uint16_t len);
+
+// KEYBOARD: convenient helper to send keyboard report if application
+// use template layout report as defined by hid_keyboard_report_t
+bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, uint8_t keycode[6]);
+
+// MOUSE: convenient helper to send mouse report if application
+// use template layout report as defined by hid_mouse_report_t
+bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal);
+
+// Gamepad: convenient helper to send gamepad report if application
+// use template layout report TUD_HID_REPORT_DESC_GAMEPAD
+bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons);
+
+//--------------------------------------------------------------------+
+// Application API (Single Port)
+//--------------------------------------------------------------------+
+static inline bool tud_hid_ready(void);
+static inline uint8_t tud_hid_interface_protocol(void);
+static inline uint8_t tud_hid_get_protocol(void);
+static inline bool tud_hid_report(uint8_t report_id, void const* report, uint16_t len);
+static inline bool tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t keycode[6]);
+static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal);
+static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons);
+
+//--------------------------------------------------------------------+
+// Callbacks (Weak is optional)
+//--------------------------------------------------------------------+
+
+// Invoked when received GET HID REPORT DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
+uint8_t const * tud_hid_descriptor_report_cb(uint8_t instance);
+
+// Invoked when received GET_REPORT control request
+// Application must fill buffer report's content and return its length.
+// Return zero will cause the stack to STALL request
+uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
+
+// Invoked when received SET_REPORT control request or
+// received data on OUT endpoint ( Report ID = 0, Type = 0 )
+void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
+
+// Invoked when received SET_PROTOCOL request
+// protocol is either HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)
+TU_ATTR_WEAK void tud_hid_set_protocol_cb(uint8_t instance, uint8_t protocol);
+
+// Invoked when received SET_IDLE request. return false will stall the request
+// - Idle Rate = 0 : only send report if there is changes, i.e skip duplication
+// - Idle Rate > 0 : skip duplication, but send at least 1 report every idle rate (in unit of 4 ms).
+TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate);
+
+// Invoked when sent REPORT successfully to host
+// Application can use this to send the next report
+// Note: For composite reports, report[0] is report ID
+TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len);
+
+
+//--------------------------------------------------------------------+
+// Inline Functions
+//--------------------------------------------------------------------+
+static inline bool tud_hid_ready(void)
+{
+ return tud_hid_n_ready(0);
+}
+
+static inline uint8_t tud_hid_interface_protocol(void)
+{
+ return tud_hid_n_interface_protocol(0);
+}
+
+static inline uint8_t tud_hid_get_protocol(void)
+{
+ return tud_hid_n_get_protocol(0);
+}
+
+static inline bool tud_hid_report(uint8_t report_id, void const* report, uint16_t len)
+{
+ return tud_hid_n_report(0, report_id, report, len);
+}
+
+static inline bool tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t keycode[6])
+{
+ return tud_hid_n_keyboard_report(0, report_id, modifier, keycode);
+}
+
+static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal)
+{
+ return tud_hid_n_mouse_report(0, report_id, buttons, x, y, vertical, horizontal);
+}
+
+static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons)
+{
+ return tud_hid_n_gamepad_report(0, report_id, x, y, z, rz, rx, ry, hat, buttons);
+}
+
+/* --------------------------------------------------------------------+
+ * HID Report Descriptor Template
+ *
+ * Convenient for declaring popular HID device (keyboard, mouse, consumer,
+ * gamepad etc...). Templates take "HID_REPORT_ID(n)" as input, leave
+ * empty if multiple reports is not used
+ *
+ * - Only 1 report: no parameter
+ * uint8_t const report_desc[] = { TUD_HID_REPORT_DESC_KEYBOARD() };
+ *
+ * - Multiple Reports: "HID_REPORT_ID(ID)" must be passed to template
+ * uint8_t const report_desc[] =
+ * {
+ * TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ) ,
+ * TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(2) )
+ * };
+ *--------------------------------------------------------------------*/
+
+// Keyboard Report Descriptor Template
+#define TUD_HID_REPORT_DESC_KEYBOARD(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_KEYBOARD ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ /* 8 bits Modifier Keys (Shift, Control, Alt) */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ) ,\
+ HID_USAGE_MIN ( 224 ) ,\
+ HID_USAGE_MAX ( 231 ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX ( 1 ) ,\
+ HID_REPORT_COUNT ( 8 ) ,\
+ HID_REPORT_SIZE ( 1 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* 8 bit reserved */ \
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_CONSTANT ) ,\
+ /* Output 5-bit LED Indicator Kana | Compose | ScrollLock | CapsLock | NumLock */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_LED ) ,\
+ HID_USAGE_MIN ( 1 ) ,\
+ HID_USAGE_MAX ( 5 ) ,\
+ HID_REPORT_COUNT ( 5 ) ,\
+ HID_REPORT_SIZE ( 1 ) ,\
+ HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* led padding */ \
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 3 ) ,\
+ HID_OUTPUT ( HID_CONSTANT ) ,\
+ /* 6-byte Keycodes */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ) ,\
+ HID_USAGE_MIN ( 0 ) ,\
+ HID_USAGE_MAX_N ( 255, 2 ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX_N( 255, 2 ) ,\
+ HID_REPORT_COUNT ( 6 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
+ HID_COLLECTION_END \
+
+// Mouse Report Descriptor Template
+#define TUD_HID_REPORT_DESC_MOUSE(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_MOUSE ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ HID_USAGE ( HID_USAGE_DESKTOP_POINTER ) ,\
+ HID_COLLECTION ( HID_COLLECTION_PHYSICAL ) ,\
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_BUTTON ) ,\
+ HID_USAGE_MIN ( 1 ) ,\
+ HID_USAGE_MAX ( 5 ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX ( 1 ) ,\
+ /* Left, Right, Middle, Backward, Forward buttons */ \
+ HID_REPORT_COUNT( 5 ) ,\
+ HID_REPORT_SIZE ( 1 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* 3 bit padding */ \
+ HID_REPORT_COUNT( 1 ) ,\
+ HID_REPORT_SIZE ( 3 ) ,\
+ HID_INPUT ( HID_CONSTANT ) ,\
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ /* X, Y position [-127, 127] */ \
+ HID_USAGE ( HID_USAGE_DESKTOP_X ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_Y ) ,\
+ HID_LOGICAL_MIN ( 0x81 ) ,\
+ HID_LOGICAL_MAX ( 0x7f ) ,\
+ HID_REPORT_COUNT( 2 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\
+ /* Verital wheel scroll [-127, 127] */ \
+ HID_USAGE ( HID_USAGE_DESKTOP_WHEEL ) ,\
+ HID_LOGICAL_MIN ( 0x81 ) ,\
+ HID_LOGICAL_MAX ( 0x7f ) ,\
+ HID_REPORT_COUNT( 1 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER ), \
+ /* Horizontal wheel scroll [-127, 127] */ \
+ HID_USAGE_N ( HID_USAGE_CONSUMER_AC_PAN, 2 ), \
+ HID_LOGICAL_MIN ( 0x81 ), \
+ HID_LOGICAL_MAX ( 0x7f ), \
+ HID_REPORT_COUNT( 1 ), \
+ HID_REPORT_SIZE ( 8 ), \
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), \
+ HID_COLLECTION_END , \
+ HID_COLLECTION_END \
+
+// Consumer Control Report Descriptor Template
+#define TUD_HID_REPORT_DESC_CONSUMER(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER ) ,\
+ HID_USAGE ( HID_USAGE_CONSUMER_CONTROL ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ HID_LOGICAL_MIN ( 0x00 ) ,\
+ HID_LOGICAL_MAX_N( 0x03FF, 2 ) ,\
+ HID_USAGE_MIN ( 0x00 ) ,\
+ HID_USAGE_MAX_N ( 0x03FF, 2 ) ,\
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 16 ) ,\
+ HID_INPUT ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
+ HID_COLLECTION_END \
+
+/* System Control Report Descriptor Template
+ * 0x00 - do nothing
+ * 0x01 - Power Off
+ * 0x02 - Standby
+ * 0x03 - Wake Host
+ */
+#define TUD_HID_REPORT_DESC_SYSTEM_CONTROL(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_SYSTEM_CONTROL ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ /* 2 bit system power control */ \
+ HID_LOGICAL_MIN ( 1 ) ,\
+ HID_LOGICAL_MAX ( 3 ) ,\
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 2 ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_SYSTEM_POWER_DOWN ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_SYSTEM_SLEEP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_SYSTEM_WAKE_UP ) ,\
+ HID_INPUT ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\
+ /* 6 bit padding */ \
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 6 ) ,\
+ HID_INPUT ( HID_CONSTANT ) ,\
+ HID_COLLECTION_END \
+
+// Gamepad Report Descriptor Template
+// with 32 buttons, 2 joysticks and 1 hat/dpad with following layout
+// | X | Y | Z | Rz | Rx | Ry (1 byte each) | hat/DPAD (1 byte) | Button Map (4 bytes) |
+#define TUD_HID_REPORT_DESC_GAMEPAD(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_GAMEPAD ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ /* 8 bit X, Y, Z, Rz, Rx, Ry (min -127, max 127 ) */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_X ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_Y ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_Z ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_RZ ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_RX ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_RY ) ,\
+ HID_LOGICAL_MIN ( 0x81 ) ,\
+ HID_LOGICAL_MAX ( 0x7f ) ,\
+ HID_REPORT_COUNT ( 6 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* 8 bit DPad/Hat Button Map */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
+ HID_USAGE ( HID_USAGE_DESKTOP_HAT_SWITCH ) ,\
+ HID_LOGICAL_MIN ( 1 ) ,\
+ HID_LOGICAL_MAX ( 8 ) ,\
+ HID_PHYSICAL_MIN ( 0 ) ,\
+ HID_PHYSICAL_MAX_N ( 315, 2 ) ,\
+ HID_REPORT_COUNT ( 1 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* 32 bit Button Map */ \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_BUTTON ) ,\
+ HID_USAGE_MIN ( 1 ) ,\
+ HID_USAGE_MAX ( 32 ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX ( 1 ) ,\
+ HID_REPORT_COUNT ( 32 ) ,\
+ HID_REPORT_SIZE ( 1 ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ HID_COLLECTION_END \
+
+// FIDO U2F Authenticator Descriptor Template
+// - 1st parameter is report size, which is 64 bytes maximum in U2F
+// - 2nd parameter is HID_REPORT_ID(n) (optional)
+#define TUD_HID_REPORT_DESC_FIDO_U2F(report_size, ...) \
+ HID_USAGE_PAGE_N ( HID_USAGE_PAGE_FIDO, 2 ) ,\
+ HID_USAGE ( HID_USAGE_FIDO_U2FHID ) ,\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
+ /* Report ID if any */ \
+ __VA_ARGS__ \
+ /* Usage Data In */ \
+ HID_USAGE ( HID_USAGE_FIDO_DATA_IN ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX_N ( 0xff, 2 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_REPORT_COUNT ( report_size ) ,\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ /* Usage Data Out */ \
+ HID_USAGE ( HID_USAGE_FIDO_DATA_OUT ) ,\
+ HID_LOGICAL_MIN ( 0 ) ,\
+ HID_LOGICAL_MAX_N ( 0xff, 2 ) ,\
+ HID_REPORT_SIZE ( 8 ) ,\
+ HID_REPORT_COUNT ( report_size ) ,\
+ HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
+ HID_COLLECTION_END \
+
+// HID Generic Input & Output
+// - 1st parameter is report size (mandatory)
+// - 2nd parameter is report id HID_REPORT_ID(n) (optional)
+#define TUD_HID_REPORT_DESC_GENERIC_INOUT(report_size, ...) \
+ HID_USAGE_PAGE_N ( HID_USAGE_PAGE_VENDOR, 2 ),\
+ HID_USAGE ( 0x01 ),\
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ),\
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ /* Input */ \
+ HID_USAGE ( 0x02 ),\
+ HID_LOGICAL_MIN ( 0x00 ),\
+ HID_LOGICAL_MAX_N ( 0xff, 2 ),\
+ HID_REPORT_SIZE ( 8 ),\
+ HID_REPORT_COUNT( report_size ),\
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
+ /* Output */ \
+ HID_USAGE ( 0x03 ),\
+ HID_LOGICAL_MIN ( 0x00 ),\
+ HID_LOGICAL_MAX_N ( 0xff, 2 ),\
+ HID_REPORT_SIZE ( 8 ),\
+ HID_REPORT_COUNT( report_size ),\
+ HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\
+ HID_COLLECTION_END \
+
+//--------------------------------------------------------------------+
+// Internal Class Driver API
+//--------------------------------------------------------------------+
+void hidd_init (void);
+void hidd_reset (uint8_t rhport);
+uint16_t hidd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
+bool hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
+bool hidd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_HID_DEVICE_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.c
new file mode 100644
index 000000000..42b5e2f4e
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.c
@@ -0,0 +1,677 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if (CFG_TUH_ENABLED && CFG_TUH_HID)
+
+#include "host/usbh.h"
+#include "host/usbh_classdriver.h"
+
+#include "hid_host.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+
+typedef struct
+{
+ uint8_t itf_num;
+ uint8_t ep_in;
+ uint8_t ep_out;
+
+ uint8_t itf_protocol; // None, Keyboard, Mouse
+ uint8_t protocol_mode; // Boot (0) or Report protocol (1)
+
+ uint8_t report_desc_type;
+ uint16_t report_desc_len;
+
+ uint16_t epin_size;
+ uint16_t epout_size;
+
+ uint8_t epin_buf[CFG_TUH_HID_EPIN_BUFSIZE];
+ uint8_t epout_buf[CFG_TUH_HID_EPOUT_BUFSIZE];
+} hidh_interface_t;
+
+typedef struct
+{
+ uint8_t inst_count;
+ hidh_interface_t instances[CFG_TUH_HID];
+} hidh_device_t;
+
+CFG_TUSB_MEM_SECTION
+static hidh_device_t _hidh_dev[CFG_TUH_DEVICE_MAX];
+
+//------------- Internal prototypes -------------//
+
+// Get HID device & interface
+TU_ATTR_ALWAYS_INLINE static inline hidh_device_t* get_dev(uint8_t dev_addr);
+TU_ATTR_ALWAYS_INLINE static inline hidh_interface_t* get_instance(uint8_t dev_addr, uint8_t instance);
+static uint8_t get_instance_id_by_itfnum(uint8_t dev_addr, uint8_t itf);
+static uint8_t get_instance_id_by_epaddr(uint8_t dev_addr, uint8_t ep_addr);
+
+//--------------------------------------------------------------------+
+// Interface API
+//--------------------------------------------------------------------+
+
+uint8_t tuh_hid_instance_count(uint8_t dev_addr)
+{
+ return get_dev(dev_addr)->inst_count;
+}
+
+bool tuh_hid_mounted(uint8_t dev_addr, uint8_t instance)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+ return (hid_itf->ep_in != 0) || (hid_itf->ep_out != 0);
+}
+
+uint8_t tuh_hid_interface_protocol(uint8_t dev_addr, uint8_t instance)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+ return hid_itf->itf_protocol;
+}
+
+//--------------------------------------------------------------------+
+// Control Endpoint API
+//--------------------------------------------------------------------+
+
+uint8_t tuh_hid_get_protocol(uint8_t dev_addr, uint8_t instance)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+ return hid_itf->protocol_mode;
+}
+
+static void set_protocol_complete(tuh_xfer_t* xfer)
+{
+ uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ uint8_t const daddr = xfer->daddr;
+ uint8_t const instance = get_instance_id_by_itfnum(daddr, itf_num);
+ hidh_interface_t* hid_itf = get_instance(daddr, instance);
+
+ if (XFER_RESULT_SUCCESS == xfer->result)
+ {
+ hid_itf->protocol_mode = (uint8_t) tu_le16toh(xfer->setup->wValue);
+ }
+
+ if (tuh_hid_set_protocol_complete_cb)
+ {
+ tuh_hid_set_protocol_complete_cb(daddr, instance, hid_itf->protocol_mode);
+ }
+}
+
+
+static bool _hidh_set_protocol(uint8_t dev_addr, uint8_t itf_num, uint8_t protocol, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
+{
+ TU_LOG2("HID Set Protocol = %d\r\n", protocol);
+
+ tusb_control_request_t const request =
+ {
+ .bmRequestType_bit =
+ {
+ .recipient = TUSB_REQ_RCPT_INTERFACE,
+ .type = TUSB_REQ_TYPE_CLASS,
+ .direction = TUSB_DIR_OUT
+ },
+ .bRequest = HID_REQ_CONTROL_SET_PROTOCOL,
+ .wValue = protocol,
+ .wIndex = itf_num,
+ .wLength = 0
+ };
+
+ tuh_xfer_t xfer =
+ {
+ .daddr = dev_addr,
+ .ep_addr = 0,
+ .setup = &request,
+ .buffer = NULL,
+ .complete_cb = complete_cb,
+ .user_data = user_data
+ };
+
+ TU_ASSERT( tuh_control_xfer(&xfer) );
+ return true;
+}
+
+bool tuh_hid_set_protocol(uint8_t dev_addr, uint8_t instance, uint8_t protocol)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+ TU_VERIFY(hid_itf->itf_protocol != HID_ITF_PROTOCOL_NONE);
+
+ return _hidh_set_protocol(dev_addr, hid_itf->itf_num, protocol, set_protocol_complete, 0);
+}
+
+static void set_report_complete(tuh_xfer_t* xfer)
+{
+ TU_LOG2("HID Set Report complete\r\n");
+
+ if (tuh_hid_set_report_complete_cb)
+ {
+ uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ uint8_t const instance = get_instance_id_by_itfnum(xfer->daddr, itf_num);
+
+ uint8_t const report_type = tu_u16_high(xfer->setup->wValue);
+ uint8_t const report_id = tu_u16_low(xfer->setup->wValue);
+
+ tuh_hid_set_report_complete_cb(xfer->daddr, instance, report_id, report_type,
+ (xfer->result == XFER_RESULT_SUCCESS) ? xfer->setup->wLength : 0);
+ }
+}
+
+bool tuh_hid_set_report(uint8_t dev_addr, uint8_t instance, uint8_t report_id, uint8_t report_type, void* report, uint16_t len)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+ TU_LOG2("HID Set Report: id = %u, type = %u, len = %u\r\n", report_id, report_type, len);
+
+ tusb_control_request_t const request =
+ {
+ .bmRequestType_bit =
+ {
+ .recipient = TUSB_REQ_RCPT_INTERFACE,
+ .type = TUSB_REQ_TYPE_CLASS,
+ .direction = TUSB_DIR_OUT
+ },
+ .bRequest = HID_REQ_CONTROL_SET_REPORT,
+ .wValue = tu_u16(report_type, report_id),
+ .wIndex = hid_itf->itf_num,
+ .wLength = len
+ };
+
+ tuh_xfer_t xfer =
+ {
+ .daddr = dev_addr,
+ .ep_addr = 0,
+ .setup = &request,
+ .buffer = report,
+ .complete_cb = set_report_complete,
+ .user_data = 0
+ };
+
+ TU_ASSERT( tuh_control_xfer(&xfer) );
+ return true;
+}
+
+static bool _hidh_set_idle(uint8_t dev_addr, uint8_t itf_num, uint16_t idle_rate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
+{
+ // SET IDLE request, device can stall if not support this request
+ TU_LOG2("HID Set Idle \r\n");
+ tusb_control_request_t const request =
+ {
+ .bmRequestType_bit =
+ {
+ .recipient = TUSB_REQ_RCPT_INTERFACE,
+ .type = TUSB_REQ_TYPE_CLASS,
+ .direction = TUSB_DIR_OUT
+ },
+ .bRequest = HID_REQ_CONTROL_SET_IDLE,
+ .wValue = idle_rate,
+ .wIndex = itf_num,
+ .wLength = 0
+ };
+
+ tuh_xfer_t xfer =
+ {
+ .daddr = dev_addr,
+ .ep_addr = 0,
+ .setup = &request,
+ .buffer = NULL,
+ .complete_cb = complete_cb,
+ .user_data = user_data
+ };
+
+ TU_ASSERT( tuh_control_xfer(&xfer) );
+
+ return true;
+}
+
+//--------------------------------------------------------------------+
+// Interrupt Endpoint API
+//--------------------------------------------------------------------+
+
+bool tuh_hid_receive_report(uint8_t dev_addr, uint8_t instance)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+
+ // claim endpoint
+ TU_VERIFY( usbh_edpt_claim(dev_addr, hid_itf->ep_in) );
+
+ if ( !usbh_edpt_xfer(dev_addr, hid_itf->ep_in, hid_itf->epin_buf, hid_itf->epin_size) )
+ {
+ usbh_edpt_release(dev_addr, hid_itf->ep_in);
+ return false;
+ }
+
+ return true;
+}
+
+//bool tuh_n_hid_n_ready(uint8_t dev_addr, uint8_t instance)
+//{
+// TU_VERIFY(tuh_n_hid_n_mounted(dev_addr, instance));
+//
+// hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+// return !usbh_edpt_busy(dev_addr, hid_itf->ep_in);
+//}
+
+//void tuh_hid_send_report(uint8_t dev_addr, uint8_t instance, uint8_t report_id, uint8_t const* report, uint16_t len);
+
+//--------------------------------------------------------------------+
+// USBH API
+//--------------------------------------------------------------------+
+void hidh_init(void)
+{
+ tu_memclr(_hidh_dev, sizeof(_hidh_dev));
+}
+
+bool hidh_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
+{
+ (void) result;
+
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+ uint8_t const instance = get_instance_id_by_epaddr(dev_addr, ep_addr);
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+
+ if ( dir == TUSB_DIR_IN )
+ {
+ TU_LOG2(" Get Report callback (%u, %u)\r\n", dev_addr, instance);
+ TU_LOG3_MEM(hid_itf->epin_buf, xferred_bytes, 2);
+ tuh_hid_report_received_cb(dev_addr, instance, hid_itf->epin_buf, (uint16_t) xferred_bytes);
+ }else
+ {
+ if (tuh_hid_report_sent_cb) tuh_hid_report_sent_cb(dev_addr, instance, hid_itf->epout_buf, (uint16_t) xferred_bytes);
+ }
+
+ return true;
+}
+
+void hidh_close(uint8_t dev_addr)
+{
+ TU_VERIFY(dev_addr <= CFG_TUH_DEVICE_MAX, );
+
+ hidh_device_t* hid_dev = get_dev(dev_addr);
+
+ if (tuh_hid_umount_cb)
+ {
+ for (uint8_t inst = 0; inst < hid_dev->inst_count; inst++ ) tuh_hid_umount_cb(dev_addr, inst);
+ }
+
+ tu_memclr(hid_dev, sizeof(hidh_device_t));
+}
+
+//--------------------------------------------------------------------+
+// Enumeration
+//--------------------------------------------------------------------+
+
+bool hidh_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
+{
+ (void) rhport;
+ (void) max_len;
+
+ TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass);
+
+ TU_LOG2("[%u] HID opening Interface %u\r\n", dev_addr, desc_itf->bInterfaceNumber);
+
+ // len = interface + hid + n*endpoints
+ uint16_t const drv_len = (uint16_t) (sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) +
+ desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));
+ TU_ASSERT(max_len >= drv_len);
+
+ uint8_t const *p_desc = (uint8_t const *) desc_itf;
+
+ //------------- HID descriptor -------------//
+ p_desc = tu_desc_next(p_desc);
+ tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc;
+ TU_ASSERT(HID_DESC_TYPE_HID == desc_hid->bDescriptorType);
+
+ // not enough interface, try to increase CFG_TUH_HID
+ // TODO multiple devices
+ hidh_device_t* hid_dev = get_dev(dev_addr);
+ TU_ASSERT(hid_dev->inst_count < CFG_TUH_HID, 0);
+
+ hidh_interface_t* hid_itf = get_instance(dev_addr, hid_dev->inst_count);
+
+ //------------- Endpoint Descriptors -------------//
+ p_desc = tu_desc_next(p_desc);
+ tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
+
+ for(int i = 0; i < desc_itf->bNumEndpoints; i++)
+ {
+ TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType);
+ TU_ASSERT( tuh_edpt_open(dev_addr, desc_ep) );
+
+ if(tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN)
+ {
+ hid_itf->ep_in = desc_ep->bEndpointAddress;
+ hid_itf->epin_size = tu_edpt_packet_size(desc_ep);
+ }
+ else
+ {
+ hid_itf->ep_out = desc_ep->bEndpointAddress;
+ hid_itf->epout_size = tu_edpt_packet_size(desc_ep);
+ }
+
+ p_desc = tu_desc_next(p_desc);
+ desc_ep = (tusb_desc_endpoint_t const *) p_desc;
+ }
+
+ hid_dev->inst_count++;
+
+ hid_itf->itf_num = desc_itf->bInterfaceNumber;
+
+ // Assume bNumDescriptors = 1
+ hid_itf->report_desc_type = desc_hid->bReportType;
+ hid_itf->report_desc_len = tu_unaligned_read16(&desc_hid->wReportLength);
+
+ // Per HID Specs: default is Report protocol, though we will force Boot protocol when set_config
+ hid_itf->protocol_mode = HID_PROTOCOL_BOOT;
+ if ( HID_SUBCLASS_BOOT == desc_itf->bInterfaceSubClass ) hid_itf->itf_protocol = desc_itf->bInterfaceProtocol;
+
+ return true;
+}
+
+//--------------------------------------------------------------------+
+// Set Configure
+//--------------------------------------------------------------------+
+
+enum {
+ CONFG_SET_IDLE,
+ CONFIG_SET_PROTOCOL,
+ CONFIG_GET_REPORT_DESC,
+ CONFIG_COMPLETE
+};
+
+static void config_driver_mount_complete(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len);
+static void process_set_config(tuh_xfer_t* xfer);
+
+bool hidh_set_config(uint8_t dev_addr, uint8_t itf_num)
+{
+ tusb_control_request_t request;
+ request.wIndex = tu_htole16((uint16_t) itf_num);
+
+ tuh_xfer_t xfer;
+ xfer.daddr = dev_addr;
+ xfer.result = XFER_RESULT_SUCCESS;
+ xfer.setup = &request;
+ xfer.user_data = CONFG_SET_IDLE;
+
+ // fake request to kick-off the set config process
+ process_set_config(&xfer);
+
+ return true;
+}
+
+static void process_set_config(tuh_xfer_t* xfer)
+{
+ // Stall is a valid response for SET_IDLE, therefore we could ignore its result
+ if ( xfer->setup->bRequest != HID_REQ_CONTROL_SET_IDLE )
+ {
+ TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+ }
+
+ uintptr_t const state = xfer->user_data;
+ uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ uint8_t const daddr = xfer->daddr;
+
+ uint8_t const instance = get_instance_id_by_itfnum(daddr, itf_num);
+ hidh_interface_t* hid_itf = get_instance(daddr, instance);
+
+ switch(state)
+ {
+ case CONFG_SET_IDLE:
+ {
+ // Idle rate = 0 mean only report when there is changes
+ const uint16_t idle_rate = 0;
+ const uintptr_t next_state = (hid_itf->itf_protocol != HID_ITF_PROTOCOL_NONE) ? CONFIG_SET_PROTOCOL : CONFIG_GET_REPORT_DESC;
+ _hidh_set_idle(daddr, itf_num, idle_rate, process_set_config, next_state);
+ }
+ break;
+
+ case CONFIG_SET_PROTOCOL:
+ _hidh_set_protocol(daddr, hid_itf->itf_num, HID_PROTOCOL_BOOT, process_set_config, CONFIG_GET_REPORT_DESC);
+ break;
+
+ case CONFIG_GET_REPORT_DESC:
+ // Get Report Descriptor if possible
+ // using usbh enumeration buffer since report descriptor can be very long
+ if( hid_itf->report_desc_len > CFG_TUH_ENUMERATION_BUFSIZE )
+ {
+ TU_LOG2("HID Skip Report Descriptor since it is too large %u bytes\r\n", hid_itf->report_desc_len);
+
+ // Driver is mounted without report descriptor
+ config_driver_mount_complete(daddr, instance, NULL, 0);
+ }else
+ {
+ tuh_descriptor_get_hid_report(daddr, itf_num, hid_itf->report_desc_type, 0, usbh_get_enum_buf(), hid_itf->report_desc_len, process_set_config, CONFIG_COMPLETE);
+ }
+ break;
+
+ case CONFIG_COMPLETE:
+ {
+ uint8_t const* desc_report = usbh_get_enum_buf();
+ uint16_t const desc_len = tu_le16toh(xfer->setup->wLength);
+
+ config_driver_mount_complete(daddr, instance, desc_report, desc_len);
+ }
+ break;
+
+ default: break;
+ }
+}
+
+static void config_driver_mount_complete(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len)
+{
+ hidh_interface_t* hid_itf = get_instance(dev_addr, instance);
+
+ // enumeration is complete
+ tuh_hid_mount_cb(dev_addr, instance, desc_report, desc_len);
+
+ // notify usbh that driver enumeration is complete
+ usbh_driver_set_config_complete(dev_addr, hid_itf->itf_num);
+}
+
+//--------------------------------------------------------------------+
+// Report Descriptor Parser
+//--------------------------------------------------------------------+
+
+uint8_t tuh_hid_parse_report_descriptor(tuh_hid_report_info_t* report_info_arr, uint8_t arr_count, uint8_t const* desc_report, uint16_t desc_len)
+{
+ // Report Item 6.2.2.2 USB HID 1.11
+ union TU_ATTR_PACKED
+ {
+ uint8_t byte;
+ struct TU_ATTR_PACKED
+ {
+ uint8_t size : 2;
+ uint8_t type : 2;
+ uint8_t tag : 4;
+ };
+ } header;
+
+ tu_memclr(report_info_arr, arr_count*sizeof(tuh_hid_report_info_t));
+
+ uint8_t report_num = 0;
+ tuh_hid_report_info_t* info = report_info_arr;
+
+ // current parsed report count & size from descriptor
+// uint8_t ri_report_count = 0;
+// uint8_t ri_report_size = 0;
+
+ uint8_t ri_collection_depth = 0;
+
+ while(desc_len && report_num < arr_count)
+ {
+ header.byte = *desc_report++;
+ desc_len--;
+
+ uint8_t const tag = header.tag;
+ uint8_t const type = header.type;
+ uint8_t const size = header.size;
+
+ uint8_t const data8 = desc_report[0];
+
+ TU_LOG(3, "tag = %d, type = %d, size = %d, data = ", tag, type, size);
+ for(uint32_t i=0; iusage_page, desc_report, size);
+ break;
+
+ case RI_GLOBAL_LOGICAL_MIN : break;
+ case RI_GLOBAL_LOGICAL_MAX : break;
+ case RI_GLOBAL_PHYSICAL_MIN : break;
+ case RI_GLOBAL_PHYSICAL_MAX : break;
+
+ case RI_GLOBAL_REPORT_ID:
+ info->report_id = data8;
+ break;
+
+ case RI_GLOBAL_REPORT_SIZE:
+// ri_report_size = data8;
+ break;
+
+ case RI_GLOBAL_REPORT_COUNT:
+// ri_report_count = data8;
+ break;
+
+ case RI_GLOBAL_UNIT_EXPONENT : break;
+ case RI_GLOBAL_UNIT : break;
+ case RI_GLOBAL_PUSH : break;
+ case RI_GLOBAL_POP : break;
+
+ default: break;
+ }
+ break;
+
+ case RI_TYPE_LOCAL:
+ switch(tag)
+ {
+ case RI_LOCAL_USAGE:
+ // only take in account the "usage" before starting REPORT ID
+ if ( ri_collection_depth == 0 ) info->usage = data8;
+ break;
+
+ case RI_LOCAL_USAGE_MIN : break;
+ case RI_LOCAL_USAGE_MAX : break;
+ case RI_LOCAL_DESIGNATOR_INDEX : break;
+ case RI_LOCAL_DESIGNATOR_MIN : break;
+ case RI_LOCAL_DESIGNATOR_MAX : break;
+ case RI_LOCAL_STRING_INDEX : break;
+ case RI_LOCAL_STRING_MIN : break;
+ case RI_LOCAL_STRING_MAX : break;
+ case RI_LOCAL_DELIMITER : break;
+ default: break;
+ }
+ break;
+
+ // error
+ default: break;
+ }
+
+ desc_report += size;
+ desc_len -= size;
+ }
+
+ for ( uint8_t i = 0; i < report_num; i++ )
+ {
+ info = report_info_arr+i;
+ TU_LOG2("%u: id = %u, usage_page = %u, usage = %u\r\n", i, info->report_id, info->usage_page, info->usage);
+ }
+
+ return report_num;
+}
+
+//--------------------------------------------------------------------+
+// Helper
+//--------------------------------------------------------------------+
+
+// Get Device by address
+TU_ATTR_ALWAYS_INLINE static inline hidh_device_t* get_dev(uint8_t dev_addr)
+{
+ return &_hidh_dev[dev_addr-1];
+}
+
+// Get Interface by instance number
+TU_ATTR_ALWAYS_INLINE static inline hidh_interface_t* get_instance(uint8_t dev_addr, uint8_t instance)
+{
+ return &_hidh_dev[dev_addr-1].instances[instance];
+}
+
+// Get instance ID by interface number
+static uint8_t get_instance_id_by_itfnum(uint8_t dev_addr, uint8_t itf)
+{
+ for ( uint8_t inst = 0; inst < CFG_TUH_HID; inst++ )
+ {
+ hidh_interface_t *hid = get_instance(dev_addr, inst);
+
+ if ( (hid->itf_num == itf) && (hid->ep_in || hid->ep_out) ) return inst;
+ }
+
+ return 0xff;
+}
+
+// Get instance ID by endpoint address
+static uint8_t get_instance_id_by_epaddr(uint8_t dev_addr, uint8_t ep_addr)
+{
+ for ( uint8_t inst = 0; inst < CFG_TUH_HID; inst++ )
+ {
+ hidh_interface_t *hid = get_instance(dev_addr, inst);
+
+ if ( (ep_addr == hid->ep_in) || ( ep_addr == hid->ep_out) ) return inst;
+ }
+
+ return 0xff;
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.h
new file mode 100644
index 000000000..ffc601d77
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/hid/hid_host.h
@@ -0,0 +1,152 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_HID_HOST_H_
+#define _TUSB_HID_HOST_H_
+
+#include "hid.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Class Driver Configuration
+//--------------------------------------------------------------------+
+
+// TODO Highspeed interrupt can be up to 512 bytes
+#ifndef CFG_TUH_HID_EPIN_BUFSIZE
+#define CFG_TUH_HID_EPIN_BUFSIZE 64
+#endif
+
+#ifndef CFG_TUH_HID_EPOUT_BUFSIZE
+#define CFG_TUH_HID_EPOUT_BUFSIZE 64
+#endif
+
+
+typedef struct
+{
+ uint8_t report_id;
+ uint8_t usage;
+ uint16_t usage_page;
+
+ // TODO still use the endpoint size for now
+// uint8_t in_len; // length of IN report
+// uint8_t out_len; // length of OUT report
+} tuh_hid_report_info_t;
+
+//--------------------------------------------------------------------+
+// Interface API
+//--------------------------------------------------------------------+
+
+// Get the number of HID instances
+uint8_t tuh_hid_instance_count(uint8_t dev_addr);
+
+// Check if HID instance is mounted
+bool tuh_hid_mounted(uint8_t dev_addr, uint8_t instance);
+
+// Get interface supported protocol (bInterfaceProtocol) check out hid_interface_protocol_enum_t for possible values
+uint8_t tuh_hid_interface_protocol(uint8_t dev_addr, uint8_t instance);
+
+// Parse report descriptor into array of report_info struct and return number of reports.
+// For complicated report, application should write its own parser.
+uint8_t tuh_hid_parse_report_descriptor(tuh_hid_report_info_t* reports_info_arr, uint8_t arr_count, uint8_t const* desc_report, uint16_t desc_len) TU_ATTR_UNUSED;
+
+//--------------------------------------------------------------------+
+// Control Endpoint API
+//--------------------------------------------------------------------+
+
+// Get current protocol: HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)
+// Note: Device will be initialized in Boot protocol for simplicity.
+// Application can use set_protocol() to switch back to Report protocol.
+uint8_t tuh_hid_get_protocol(uint8_t dev_addr, uint8_t instance);
+
+// Set protocol to HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)
+// This function is only supported by Boot interface (tuh_n_hid_interface_protocol() != NONE)
+bool tuh_hid_set_protocol(uint8_t dev_addr, uint8_t instance, uint8_t protocol);
+
+// Set Report using control endpoint
+// report_type is either Input, Output or Feature, (value from hid_report_type_t)
+bool tuh_hid_set_report(uint8_t dev_addr, uint8_t instance, uint8_t report_id, uint8_t report_type, void* report, uint16_t len);
+
+//--------------------------------------------------------------------+
+// Interrupt Endpoint API
+//--------------------------------------------------------------------+
+
+// Check if the interface is ready to use
+//bool tuh_n_hid_n_ready(uint8_t dev_addr, uint8_t instance);
+
+// Try to receive next report on Interrupt Endpoint. Immediately return
+// - true If succeeded, tuh_hid_report_received_cb() callback will be invoked when report is available
+// - false if failed to queue the transfer e.g endpoint is busy
+bool tuh_hid_receive_report(uint8_t dev_addr, uint8_t instance);
+
+// Send report using interrupt endpoint
+// If report_id > 0 (composite), it will be sent as 1st byte, then report contents. Otherwise only report content is sent.
+//void tuh_hid_send_report(uint8_t dev_addr, uint8_t instance, uint8_t report_id, uint8_t const* report, uint16_t len);
+
+//--------------------------------------------------------------------+
+// Callbacks (Weak is optional)
+//--------------------------------------------------------------------+
+
+// Invoked when device with hid interface is mounted
+// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()
+// can be used to parse common/simple enough descriptor.
+// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped
+// therefore report_desc = NULL, desc_len = 0
+void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report_desc, uint16_t desc_len);
+
+// Invoked when device with hid interface is un-mounted
+TU_ATTR_WEAK void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance);
+
+// Invoked when received report from device via interrupt endpoint
+// Note: if there is report ID (composite), it is 1st byte of report
+void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
+
+// Invoked when sent report to device successfully via interrupt endpoint
+TU_ATTR_WEAK void tuh_hid_report_sent_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
+
+// Invoked when Sent Report to device via either control endpoint
+// len = 0 indicate there is error in the transfer e.g stalled response
+TU_ATTR_WEAK void tuh_hid_set_report_complete_cb(uint8_t dev_addr, uint8_t instance, uint8_t report_id, uint8_t report_type, uint16_t len);
+
+// Invoked when Set Protocol request is complete
+TU_ATTR_WEAK void tuh_hid_set_protocol_complete_cb(uint8_t dev_addr, uint8_t instance, uint8_t protocol);
+
+//--------------------------------------------------------------------+
+// Internal Class Driver API
+//--------------------------------------------------------------------+
+void hidh_init (void);
+bool hidh_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);
+bool hidh_set_config (uint8_t dev_addr, uint8_t itf_num);
+bool hidh_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
+void hidh_close (uint8_t dev_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TUSB_HID_HOST_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.c
new file mode 100644
index 000000000..3b81a108f
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.c
@@ -0,0 +1,272 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if (CFG_TUD_ENABLED && CFG_TUD_VENDOR)
+
+#include "device/usbd.h"
+#include "device/usbd_pvt.h"
+
+#include "vendor_device.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+typedef struct
+{
+ uint8_t itf_num;
+ uint8_t ep_in;
+ uint8_t ep_out;
+
+ /*------------- From this point, data is not cleared by bus reset -------------*/
+ tu_fifo_t rx_ff;
+ tu_fifo_t tx_ff;
+
+ uint8_t rx_ff_buf[CFG_TUD_VENDOR_RX_BUFSIZE];
+ uint8_t tx_ff_buf[CFG_TUD_VENDOR_TX_BUFSIZE];
+
+#if CFG_FIFO_MUTEX
+ osal_mutex_def_t rx_ff_mutex;
+ osal_mutex_def_t tx_ff_mutex;
+#endif
+
+ // Endpoint Transfer buffer
+ CFG_TUSB_MEM_ALIGN uint8_t epout_buf[CFG_TUD_VENDOR_EPSIZE];
+ CFG_TUSB_MEM_ALIGN uint8_t epin_buf[CFG_TUD_VENDOR_EPSIZE];
+} vendord_interface_t;
+
+CFG_TUSB_MEM_SECTION static vendord_interface_t _vendord_itf[CFG_TUD_VENDOR];
+
+#define ITF_MEM_RESET_SIZE offsetof(vendord_interface_t, rx_ff)
+
+
+bool tud_vendor_n_mounted (uint8_t itf)
+{
+ return _vendord_itf[itf].ep_in && _vendord_itf[itf].ep_out;
+}
+
+uint32_t tud_vendor_n_available (uint8_t itf)
+{
+ return tu_fifo_count(&_vendord_itf[itf].rx_ff);
+}
+
+bool tud_vendor_n_peek(uint8_t itf, uint8_t* u8)
+{
+ return tu_fifo_peek(&_vendord_itf[itf].rx_ff, u8);
+}
+
+//--------------------------------------------------------------------+
+// Read API
+//--------------------------------------------------------------------+
+static void _prep_out_transaction (vendord_interface_t* p_itf)
+{
+ uint8_t const rhport = 0;
+
+ // skip if previous transfer not complete
+ if ( usbd_edpt_busy(rhport, p_itf->ep_out) ) return;
+
+ // Prepare for incoming data but only allow what we can store in the ring buffer.
+ uint16_t max_read = tu_fifo_remaining(&p_itf->rx_ff);
+ if ( max_read >= CFG_TUD_VENDOR_EPSIZE )
+ {
+ usbd_edpt_xfer(rhport, p_itf->ep_out, p_itf->epout_buf, CFG_TUD_VENDOR_EPSIZE);
+ }
+}
+
+uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize)
+{
+ vendord_interface_t* p_itf = &_vendord_itf[itf];
+ uint32_t num_read = tu_fifo_read_n(&p_itf->rx_ff, buffer, (uint16_t) bufsize);
+ _prep_out_transaction(p_itf);
+ return num_read;
+}
+
+void tud_vendor_n_read_flush (uint8_t itf)
+{
+ vendord_interface_t* p_itf = &_vendord_itf[itf];
+ tu_fifo_clear(&p_itf->rx_ff);
+ _prep_out_transaction(p_itf);
+}
+
+//--------------------------------------------------------------------+
+// Write API
+//--------------------------------------------------------------------+
+static uint16_t maybe_transmit(vendord_interface_t* p_itf)
+{
+ uint8_t const rhport = 0;
+
+ // skip if previous transfer not complete
+ TU_VERIFY( !usbd_edpt_busy(rhport, p_itf->ep_in) );
+
+ uint16_t count = tu_fifo_read_n(&p_itf->tx_ff, p_itf->epin_buf, CFG_TUD_VENDOR_EPSIZE);
+ if (count > 0)
+ {
+ TU_ASSERT( usbd_edpt_xfer(rhport, p_itf->ep_in, p_itf->epin_buf, count) );
+ }
+ return count;
+}
+
+uint32_t tud_vendor_n_write (uint8_t itf, void const* buffer, uint32_t bufsize)
+{
+ vendord_interface_t* p_itf = &_vendord_itf[itf];
+ uint16_t ret = tu_fifo_write_n(&p_itf->tx_ff, buffer, (uint16_t) bufsize);
+ if (tu_fifo_count(&p_itf->tx_ff) >= CFG_TUD_VENDOR_EPSIZE) {
+ maybe_transmit(p_itf);
+ }
+ return ret;
+}
+
+uint32_t tud_vendor_n_flush (uint8_t itf)
+{
+ vendord_interface_t* p_itf = &_vendord_itf[itf];
+ uint32_t ret = maybe_transmit(p_itf);
+
+ return ret;
+}
+
+uint32_t tud_vendor_n_write_available (uint8_t itf)
+{
+ return tu_fifo_remaining(&_vendord_itf[itf].tx_ff);
+}
+
+//--------------------------------------------------------------------+
+// USBD Driver API
+//--------------------------------------------------------------------+
+void vendord_init(void)
+{
+ tu_memclr(_vendord_itf, sizeof(_vendord_itf));
+
+ for(uint8_t i=0; irx_ff, p_itf->rx_ff_buf, CFG_TUD_VENDOR_RX_BUFSIZE, 1, false);
+ tu_fifo_config(&p_itf->tx_ff, p_itf->tx_ff_buf, CFG_TUD_VENDOR_TX_BUFSIZE, 1, false);
+
+#if CFG_FIFO_MUTEX
+ tu_fifo_config_mutex(&p_itf->rx_ff, NULL, osal_mutex_create(&p_itf->rx_ff_mutex));
+ tu_fifo_config_mutex(&p_itf->tx_ff, osal_mutex_create(&p_itf->tx_ff_mutex), NULL);
+#endif
+ }
+}
+
+void vendord_reset(uint8_t rhport)
+{
+ (void) rhport;
+
+ for(uint8_t i=0; irx_ff);
+ tu_fifo_clear(&p_itf->tx_ff);
+ }
+}
+
+uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
+{
+ TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == desc_itf->bInterfaceClass, 0);
+
+ uint8_t const * p_desc = tu_desc_next(desc_itf);
+ uint8_t const * desc_end = p_desc + max_len;
+
+ // Find available interface
+ vendord_interface_t* p_vendor = NULL;
+ for(uint8_t i=0; iitf_num = desc_itf->bInterfaceNumber;
+ if (desc_itf->bNumEndpoints)
+ {
+ // skip non-endpoint descriptors
+ while ( (TUSB_DESC_ENDPOINT != tu_desc_type(p_desc)) && (p_desc < desc_end) )
+ {
+ p_desc = tu_desc_next(p_desc);
+ }
+
+ // Open endpoint pair with usbd helper
+ TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_BULK, &p_vendor->ep_out, &p_vendor->ep_in), 0);
+
+ p_desc += desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
+
+ // Prepare for incoming data
+ if ( p_vendor->ep_out )
+ {
+ TU_ASSERT(usbd_edpt_xfer(rhport, p_vendor->ep_out, p_vendor->epout_buf, sizeof(p_vendor->epout_buf)), 0);
+ }
+
+ if ( p_vendor->ep_in ) maybe_transmit(p_vendor);
+ }
+
+ return (uint16_t) ((uintptr_t) p_desc - (uintptr_t) desc_itf);
+}
+
+bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
+{
+ (void) rhport;
+ (void) result;
+
+ uint8_t itf = 0;
+ vendord_interface_t* p_itf = _vendord_itf;
+
+ for ( ; ; itf++, p_itf++)
+ {
+ if (itf >= TU_ARRAY_SIZE(_vendord_itf)) return false;
+
+ if ( ( ep_addr == p_itf->ep_out ) || ( ep_addr == p_itf->ep_in ) ) break;
+ }
+
+ if ( ep_addr == p_itf->ep_out )
+ {
+ // Receive new data
+ tu_fifo_write_n(&p_itf->rx_ff, p_itf->epout_buf, (uint16_t) xferred_bytes);
+
+ // Invoked callback if any
+ if (tud_vendor_rx_cb) tud_vendor_rx_cb(itf);
+
+ _prep_out_transaction(p_itf);
+ }
+ else if ( ep_addr == p_itf->ep_in )
+ {
+ if (tud_vendor_tx_cb) tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes);
+ // Send complete, try to send more if possible
+ maybe_transmit(p_itf);
+ }
+
+ return true;
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.h
new file mode 100644
index 000000000..4a873e5fc
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_device.h
@@ -0,0 +1,145 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_VENDOR_DEVICE_H_
+#define _TUSB_VENDOR_DEVICE_H_
+
+#include "common/tusb_common.h"
+
+#ifndef CFG_TUD_VENDOR_EPSIZE
+#define CFG_TUD_VENDOR_EPSIZE 64
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Application API (Multiple Interfaces)
+//--------------------------------------------------------------------+
+bool tud_vendor_n_mounted (uint8_t itf);
+
+uint32_t tud_vendor_n_available (uint8_t itf);
+uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize);
+bool tud_vendor_n_peek (uint8_t itf, uint8_t* ui8);
+void tud_vendor_n_read_flush (uint8_t itf);
+
+uint32_t tud_vendor_n_write (uint8_t itf, void const* buffer, uint32_t bufsize);
+uint32_t tud_vendor_n_write_available (uint8_t itf);
+
+static inline
+uint32_t tud_vendor_n_write_str (uint8_t itf, char const* str);
+uint32_t tud_vendor_n_flush (uint8_t itf);
+
+//--------------------------------------------------------------------+
+// Application API (Single Port)
+//--------------------------------------------------------------------+
+static inline bool tud_vendor_mounted (void);
+static inline uint32_t tud_vendor_available (void);
+static inline uint32_t tud_vendor_read (void* buffer, uint32_t bufsize);
+static inline bool tud_vendor_peek (uint8_t* ui8);
+static inline void tud_vendor_read_flush (void);
+static inline uint32_t tud_vendor_write (void const* buffer, uint32_t bufsize);
+static inline uint32_t tud_vendor_write_str (char const* str);
+static inline uint32_t tud_vendor_write_available (void);
+static inline uint32_t tud_vendor_flush (void);
+
+//--------------------------------------------------------------------+
+// Application Callback API (weak is optional)
+//--------------------------------------------------------------------+
+
+// Invoked when received new data
+TU_ATTR_WEAK void tud_vendor_rx_cb(uint8_t itf);
+// Invoked when last rx transfer finished
+TU_ATTR_WEAK void tud_vendor_tx_cb(uint8_t itf, uint32_t sent_bytes);
+
+//--------------------------------------------------------------------+
+// Inline Functions
+//--------------------------------------------------------------------+
+
+static inline uint32_t tud_vendor_n_write_str (uint8_t itf, char const* str)
+{
+ return tud_vendor_n_write(itf, str, strlen(str));
+}
+
+static inline bool tud_vendor_mounted (void)
+{
+ return tud_vendor_n_mounted(0);
+}
+
+static inline uint32_t tud_vendor_available (void)
+{
+ return tud_vendor_n_available(0);
+}
+
+static inline uint32_t tud_vendor_read (void* buffer, uint32_t bufsize)
+{
+ return tud_vendor_n_read(0, buffer, bufsize);
+}
+
+static inline bool tud_vendor_peek (uint8_t* ui8)
+{
+ return tud_vendor_n_peek(0, ui8);
+}
+
+static inline void tud_vendor_read_flush(void)
+{
+ tud_vendor_n_read_flush(0);
+}
+
+static inline uint32_t tud_vendor_write (void const* buffer, uint32_t bufsize)
+{
+ return tud_vendor_n_write(0, buffer, bufsize);
+}
+
+static inline uint32_t tud_vendor_write_str (char const* str)
+{
+ return tud_vendor_n_write_str(0, str);
+}
+
+static inline uint32_t tud_vendor_write_available (void)
+{
+ return tud_vendor_n_write_available(0);
+}
+
+static inline uint32_t tud_vendor_flush (void)
+{
+ return tud_vendor_n_flush(0);
+}
+
+//--------------------------------------------------------------------+
+// Internal Class Driver API
+//--------------------------------------------------------------------+
+void vendord_init(void);
+void vendord_reset(uint8_t rhport);
+uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
+bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_VENDOR_DEVICE_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.c
new file mode 100644
index 000000000..dbea1228d
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.c
@@ -0,0 +1,146 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if (CFG_TUH_ENABLED && CFG_TUH_VENDOR)
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "host/usbh.h"
+#include "vendor_host.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+custom_interface_info_t custom_interface[CFG_TUH_DEVICE_MAX];
+
+static tusb_error_t cush_validate_paras(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length)
+{
+ if ( !tusbh_custom_is_mounted(dev_addr, vendor_id, product_id) )
+ {
+ return TUSB_ERROR_DEVICE_NOT_READY;
+ }
+
+ TU_ASSERT( p_buffer != NULL && length != 0, TUSB_ERROR_INVALID_PARA);
+
+ return TUSB_ERROR_NONE;
+}
+//--------------------------------------------------------------------+
+// APPLICATION API (need to check parameters)
+//--------------------------------------------------------------------+
+tusb_error_t tusbh_custom_read(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length)
+{
+ TU_ASSERT_ERR( cush_validate_paras(dev_addr, vendor_id, product_id, p_buffer, length) );
+
+ if ( !hcd_pipe_is_idle(custom_interface[dev_addr-1].pipe_in) )
+ {
+ return TUSB_ERROR_INTERFACE_IS_BUSY;
+ }
+
+ (void) usbh_edpt_xfer( custom_interface[dev_addr-1].pipe_in, p_buffer, length);
+
+ return TUSB_ERROR_NONE;
+}
+
+tusb_error_t tusbh_custom_write(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void const * p_data, uint16_t length)
+{
+ TU_ASSERT_ERR( cush_validate_paras(dev_addr, vendor_id, product_id, p_data, length) );
+
+ if ( !hcd_pipe_is_idle(custom_interface[dev_addr-1].pipe_out) )
+ {
+ return TUSB_ERROR_INTERFACE_IS_BUSY;
+ }
+
+ (void) usbh_edpt_xfer( custom_interface[dev_addr-1].pipe_out, p_data, length);
+
+ return TUSB_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// USBH-CLASS API
+//--------------------------------------------------------------------+
+void cush_init(void)
+{
+ tu_memclr(&custom_interface, sizeof(custom_interface_info_t) * CFG_TUH_DEVICE_MAX);
+}
+
+tusb_error_t cush_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length)
+{
+ // FIXME quick hack to test lpc1k custom class with 2 bulk endpoints
+ uint8_t const *p_desc = (uint8_t const *) p_interface_desc;
+ p_desc = tu_desc_next(p_desc);
+
+ //------------- Bulk Endpoints Descriptor -------------//
+ for(uint32_t i=0; i<2; i++)
+ {
+ tusb_desc_endpoint_t const *p_endpoint = (tusb_desc_endpoint_t const *) p_desc;
+ TU_ASSERT(TUSB_DESC_ENDPOINT == p_endpoint->bDescriptorType, TUSB_ERROR_INVALID_PARA);
+
+ pipe_handle_t * p_pipe_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_IN_MASK ) ?
+ &custom_interface[dev_addr-1].pipe_in : &custom_interface[dev_addr-1].pipe_out;
+ *p_pipe_hdl = usbh_edpt_open(dev_addr, p_endpoint, TUSB_CLASS_VENDOR_SPECIFIC);
+ TU_ASSERT ( pipehandle_is_valid(*p_pipe_hdl), TUSB_ERROR_HCD_OPEN_PIPE_FAILED );
+
+ p_desc = tu_desc_next(p_desc);
+ }
+
+ (*p_length) = sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t);
+ return TUSB_ERROR_NONE;
+}
+
+void cush_isr(pipe_handle_t pipe_hdl, xfer_result_t event)
+{
+
+}
+
+void cush_close(uint8_t dev_addr)
+{
+ tusb_error_t err1, err2;
+ custom_interface_info_t * p_interface = &custom_interface[dev_addr-1];
+
+ // TODO re-consider to check pipe valid before calling pipe_close
+ if( pipehandle_is_valid( p_interface->pipe_in ) )
+ {
+ err1 = hcd_pipe_close( p_interface->pipe_in );
+ }
+
+ if ( pipehandle_is_valid( p_interface->pipe_out ) )
+ {
+ err2 = hcd_pipe_close( p_interface->pipe_out );
+ }
+
+ tu_memclr(p_interface, sizeof(custom_interface_info_t));
+
+ TU_ASSERT(err1 == TUSB_ERROR_NONE && err2 == TUSB_ERROR_NONE, (void) 0 );
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.h
new file mode 100644
index 000000000..65223fbca
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/class/vendor/vendor_host.h
@@ -0,0 +1,67 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_VENDOR_HOST_H_
+#define _TUSB_VENDOR_HOST_H_
+
+#include "common/tusb_common.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+typedef struct {
+ pipe_handle_t pipe_in;
+ pipe_handle_t pipe_out;
+}custom_interface_info_t;
+
+//--------------------------------------------------------------------+
+// USBH-CLASS DRIVER API
+//--------------------------------------------------------------------+
+static inline bool tusbh_custom_is_mounted(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id)
+{
+ (void) vendor_id; // TODO check this later
+ (void) product_id;
+// return (tusbh_device_get_mounted_class_flag(dev_addr) & TU_BIT(TUSB_CLASS_MAPPED_INDEX_END-1) ) != 0;
+ return false;
+}
+
+bool tusbh_custom_read(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length);
+bool tusbh_custom_write(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void const * p_data, uint16_t length);
+
+//--------------------------------------------------------------------+
+// Internal Class Driver API
+//--------------------------------------------------------------------+
+void cush_init(void);
+bool cush_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length);
+void cush_isr(pipe_handle_t pipe_hdl, xfer_result_t event);
+void cush_close(uint8_t dev_addr);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_VENDOR_HOST_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_common.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_common.h
new file mode 100644
index 000000000..b1ee40a1a
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_common.h
@@ -0,0 +1,266 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_COMMON_H_
+#define _TUSB_COMMON_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Macros Helper
+//--------------------------------------------------------------------+
+#define TU_ARRAY_SIZE(_arr) ( sizeof(_arr) / sizeof(_arr[0]) )
+#define TU_MIN(_x, _y) ( ( (_x) < (_y) ) ? (_x) : (_y) )
+#define TU_MAX(_x, _y) ( ( (_x) > (_y) ) ? (_x) : (_y) )
+
+#define TU_U16(_high, _low) ((uint16_t) (((_high) << 8) | (_low)))
+#define TU_U16_HIGH(_u16) ((uint8_t) (((_u16) >> 8) & 0x00ff))
+#define TU_U16_LOW(_u16) ((uint8_t) ((_u16) & 0x00ff))
+#define U16_TO_U8S_BE(_u16) TU_U16_HIGH(_u16), TU_U16_LOW(_u16)
+#define U16_TO_U8S_LE(_u16) TU_U16_LOW(_u16), TU_U16_HIGH(_u16)
+
+#define TU_U32_BYTE3(_u32) ((uint8_t) ((((uint32_t) _u32) >> 24) & 0x000000ff)) // MSB
+#define TU_U32_BYTE2(_u32) ((uint8_t) ((((uint32_t) _u32) >> 16) & 0x000000ff))
+#define TU_U32_BYTE1(_u32) ((uint8_t) ((((uint32_t) _u32) >> 8) & 0x000000ff))
+#define TU_U32_BYTE0(_u32) ((uint8_t) (((uint32_t) _u32) & 0x000000ff)) // LSB
+
+#define U32_TO_U8S_BE(_u32) TU_U32_BYTE3(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE0(_u32)
+#define U32_TO_U8S_LE(_u32) TU_U32_BYTE0(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE3(_u32)
+
+#define TU_BIT(n) (1UL << (n))
+#define TU_GENMASK(h, l) ( (UINT32_MAX << (l)) & (UINT32_MAX >> (31 - (h))) )
+
+//--------------------------------------------------------------------+
+// Includes
+//--------------------------------------------------------------------+
+
+// Standard Headers
+#include
+#include
+#include
+#include
+#include
+
+// Tinyusb Common Headers
+#include "tusb_option.h"
+#include "tusb_compiler.h"
+#include "tusb_verify.h"
+#include "tusb_types.h"
+#include "tusb_debug.h"
+
+#include "tusb_timeout.h" // TODO remove
+
+//--------------------------------------------------------------------+
+// Internal Inline Functions
+//--------------------------------------------------------------------+
+
+//------------- Mem -------------//
+#define tu_memclr(buffer, size) memset((buffer), 0, (size))
+#define tu_varclr(_var) tu_memclr(_var, sizeof(*(_var)))
+
+//------------- Bytes -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_u32(uint8_t b3, uint8_t b2, uint8_t b1, uint8_t b0)
+{
+ return ( ((uint32_t) b3) << 24) | ( ((uint32_t) b2) << 16) | ( ((uint32_t) b1) << 8) | b0;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u16(uint8_t high, uint8_t low)
+{
+ return (uint16_t) ((((uint16_t) high) << 8) | low);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte3(uint32_t ui32) { return TU_U32_BYTE3(ui32); }
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte2(uint32_t ui32) { return TU_U32_BYTE2(ui32); }
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte1(uint32_t ui32) { return TU_U32_BYTE1(ui32); }
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte0(uint32_t ui32) { return TU_U32_BYTE0(ui32); }
+
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u32_high16(uint32_t ui32) { return (uint16_t) (ui32 >> 16); }
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u32_low16 (uint32_t ui32) { return (uint16_t) (ui32 & 0x0000ffffu); }
+
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u16_high(uint16_t ui16) { return TU_U16_HIGH(ui16); }
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u16_low (uint16_t ui16) { return TU_U16_LOW(ui16); }
+
+//------------- Bits -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_bit_set (uint32_t value, uint8_t pos) { return value | TU_BIT(pos); }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_bit_clear(uint32_t value, uint8_t pos) { return value & (~TU_BIT(pos)); }
+TU_ATTR_ALWAYS_INLINE static inline bool tu_bit_test (uint32_t value, uint8_t pos) { return (value & TU_BIT(pos)) ? true : false; }
+
+//------------- Min -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_min8 (uint8_t x, uint8_t y ) { return (x < y) ? x : y; }
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_min16 (uint16_t x, uint16_t y) { return (x < y) ? x : y; }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_min32 (uint32_t x, uint32_t y) { return (x < y) ? x : y; }
+
+//------------- Max -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_max8 (uint8_t x, uint8_t y ) { return (x > y) ? x : y; }
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_max16 (uint16_t x, uint16_t y) { return (x > y) ? x : y; }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_max32 (uint32_t x, uint32_t y) { return (x > y) ? x : y; }
+
+//------------- Align -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align(uint32_t value, uint32_t alignment)
+{
+ return value & ((uint32_t) ~(alignment-1));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align16 (uint32_t value) { return (value & 0xFFFFFFF0UL); }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align32 (uint32_t value) { return (value & 0xFFFFFFE0UL); }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align4k (uint32_t value) { return (value & 0xFFFFF000UL); }
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_offset4k(uint32_t value) { return (value & 0xFFFUL); }
+
+//------------- Mathematics -------------//
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_div_ceil(uint32_t v, uint32_t d) { return (v + d -1)/d; }
+
+// log2 of a value is its MSB's position
+// TODO use clz TODO remove
+static inline uint8_t tu_log2(uint32_t value)
+{
+ uint8_t result = 0;
+ while (value >>= 1) { result++; }
+ return result;
+}
+
+//static inline uint8_t tu_log2(uint32_t value)
+//{
+// return sizeof(uint32_t) * CHAR_BIT - __builtin_clz(x) - 1;
+//}
+
+static inline bool tu_is_power_of_two(uint32_t value)
+{
+ return (value != 0) && ((value & (value - 1)) == 0);
+}
+
+//------------- Unaligned Access -------------//
+#if TUP_ARCH_STRICT_ALIGN
+
+// Rely on compiler to generate correct code for unaligned access
+typedef struct { uint16_t val; } TU_ATTR_PACKED tu_unaligned_uint16_t;
+typedef struct { uint32_t val; } TU_ATTR_PACKED tu_unaligned_uint32_t;
+
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32(const void* mem)
+{
+ tu_unaligned_uint32_t const* ua32 = (tu_unaligned_uint32_t const*) mem;
+ return ua32->val;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32(void* mem, uint32_t value)
+{
+ tu_unaligned_uint32_t* ua32 = (tu_unaligned_uint32_t*) mem;
+ ua32->val = value;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16(const void* mem)
+{
+ tu_unaligned_uint16_t const* ua16 = (tu_unaligned_uint16_t const*) mem;
+ return ua16->val;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16(void* mem, uint16_t value)
+{
+ tu_unaligned_uint16_t* ua16 = (tu_unaligned_uint16_t*) mem;
+ ua16->val = value;
+}
+
+#elif TUP_MCU_STRICT_ALIGN
+
+// MCU such as LPC_IP3511 Highspeed cannot access unaligned memory on USB_RAM although it is ARM M4.
+// We have to manually pick up bytes since tu_unaligned_uint32_t will still generate unaligned code
+// NOTE: volatile cast to memory to prevent compiler to optimize and generate unaligned code
+// TODO Big Endian may need minor changes
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32(const void* mem)
+{
+ volatile uint8_t const* buf8 = (uint8_t const*) mem;
+ return tu_u32(buf8[3], buf8[2], buf8[1], buf8[0]);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32(void* mem, uint32_t value)
+{
+ volatile uint8_t* buf8 = (uint8_t*) mem;
+ buf8[0] = tu_u32_byte0(value);
+ buf8[1] = tu_u32_byte1(value);
+ buf8[2] = tu_u32_byte2(value);
+ buf8[3] = tu_u32_byte3(value);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16(const void* mem)
+{
+ volatile uint8_t const* buf8 = (uint8_t const*) mem;
+ return tu_u16(buf8[1], buf8[0]);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16(void* mem, uint16_t value)
+{
+ volatile uint8_t* buf8 = (uint8_t*) mem;
+ buf8[0] = tu_u16_low(value);
+ buf8[1] = tu_u16_high(value);
+}
+
+
+#else
+
+// MCU that could access unaligned memory natively
+TU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32 (const void* mem) { return *((uint32_t const *) mem); }
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16 (const void* mem) { return *((uint16_t const *) mem); }
+
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32 (void* mem, uint32_t value ) { *((uint32_t*) mem) = value; }
+TU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16 (void* mem, uint16_t value ) { *((uint16_t*) mem) = value; }
+
+#endif
+
+// To be removed
+//------------- Binary constant -------------//
+#if defined(__GNUC__) && !defined(__CC_ARM)
+
+#define TU_BIN8(x) ((uint8_t) (0b##x))
+#define TU_BIN16(b1, b2) ((uint16_t) (0b##b1##b2))
+#define TU_BIN32(b1, b2, b3, b4) ((uint32_t) (0b##b1##b2##b3##b4))
+
+#else
+
+// internal macro of B8, B16, B32
+#define _B8__(x) (((x&0x0000000FUL)?1:0) \
+ +((x&0x000000F0UL)?2:0) \
+ +((x&0x00000F00UL)?4:0) \
+ +((x&0x0000F000UL)?8:0) \
+ +((x&0x000F0000UL)?16:0) \
+ +((x&0x00F00000UL)?32:0) \
+ +((x&0x0F000000UL)?64:0) \
+ +((x&0xF0000000UL)?128:0))
+
+#define TU_BIN8(d) ((uint8_t) _B8__(0x##d##UL))
+#define TU_BIN16(dmsb,dlsb) (((uint16_t)TU_BIN8(dmsb)<<8) + TU_BIN8(dlsb))
+#define TU_BIN32(dmsb,db2,db3,dlsb) \
+ (((uint32_t)TU_BIN8(dmsb)<<24) \
+ + ((uint32_t)TU_BIN8(db2)<<16) \
+ + ((uint32_t)TU_BIN8(db3)<<8) \
+ + TU_BIN8(dlsb))
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_COMMON_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_compiler.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_compiler.h
new file mode 100644
index 000000000..a0a49d7ec
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_compiler.h
@@ -0,0 +1,274 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_Compiler Compiler
+ * \brief Group_Compiler brief
+ * @{ */
+
+#ifndef _TUSB_COMPILER_H_
+#define _TUSB_COMPILER_H_
+
+#define TU_TOKEN(x) x
+#define TU_STRING(x) #x ///< stringify without expand
+#define TU_XSTRING(x) TU_STRING(x) ///< expand then stringify
+
+#define TU_STRCAT(a, b) a##b ///< concat without expand
+#define TU_STRCAT3(a, b, c) a##b##c ///< concat without expand
+
+#define TU_XSTRCAT(a, b) TU_STRCAT(a, b) ///< expand then concat
+#define TU_XSTRCAT3(a, b, c) TU_STRCAT3(a, b, c) ///< expand then concat 3 tokens
+
+#define TU_INCLUDE_PATH(_dir,_file) TU_XSTRING( TU_TOKEN(_dir)TU_TOKEN(_file) )
+
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+ #define _TU_COUNTER_ __COUNTER__
+#else
+ #define _TU_COUNTER_ __LINE__
+#endif
+
+// Compile-time Assert
+#if defined (__cplusplus) && __cplusplus >= 201103L
+ #define TU_VERIFY_STATIC static_assert
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+ #define TU_VERIFY_STATIC _Static_assert
+#elif defined(__CCRX__)
+ #define TU_VERIFY_STATIC(const_expr, _mess) typedef char TU_XSTRCAT(Line, __LINE__)[(const_expr) ? 1 : 0];
+#else
+ #define TU_VERIFY_STATIC(const_expr, _mess) enum { TU_XSTRCAT(_verify_static_, _TU_COUNTER_) = 1/(!!(const_expr)) }
+#endif
+
+// for declaration of reserved field, make use of _TU_COUNTER_
+#define TU_RESERVED TU_XSTRCAT(reserved, _TU_COUNTER_)
+
+#define TU_LITTLE_ENDIAN (0x12u)
+#define TU_BIG_ENDIAN (0x21u)
+
+/*------------------------------------------------------------------*/
+/* Count number of arguments of __VA_ARGS__
+ * - reference https://stackoverflow.com/questions/2124339/c-preprocessor-va-args-number-of-arguments
+ * - _GET_NTH_ARG() takes args >= N (64) but only expand to Nth one (64th)
+ * - _RSEQ_N() is reverse sequential to N to add padding to have
+ * Nth position is the same as the number of arguments
+ * - ##__VA_ARGS__ is used to deal with 0 paramerter (swallows comma)
+ *------------------------------------------------------------------*/
+#if !defined(__CCRX__)
+#define TU_ARGS_NUM(...) _TU_NARG(_0, ##__VA_ARGS__, _RSEQ_N())
+#else
+#define TU_ARGS_NUM(...) _TU_NARG(_0, __VA_ARGS__, _RSEQ_N())
+#endif
+
+#define _TU_NARG(...) _GET_NTH_ARG(__VA_ARGS__)
+#define _GET_NTH_ARG( \
+ _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,_27,_28,_29,_30, \
+ _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
+ _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
+ _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
+ _61,_62,_63,N,...) N
+#define _RSEQ_N() \
+ 62,61,60, \
+ 59,58,57,56,55,54,53,52,51,50, \
+ 49,48,47,46,45,44,43,42,41,40, \
+ 39,38,37,36,35,34,33,32,31,30, \
+ 29,28,27,26,25,24,23,22,21,20, \
+ 19,18,17,16,15,14,13,12,11,10, \
+ 9,8,7,6,5,4,3,2,1,0
+
+// Apply an macro X to each of the arguments with an separated of choice
+#define TU_ARGS_APPLY(_X, _s, ...) TU_XSTRCAT(_TU_ARGS_APPLY_, TU_ARGS_NUM(__VA_ARGS__))(_X, _s, __VA_ARGS__)
+
+#define _TU_ARGS_APPLY_1(_X, _s, _a1) _X(_a1)
+#define _TU_ARGS_APPLY_2(_X, _s, _a1, _a2) _X(_a1) _s _X(_a2)
+#define _TU_ARGS_APPLY_3(_X, _s, _a1, _a2, _a3) _X(_a1) _s _TU_ARGS_APPLY_2(_X, _s, _a2, _a3)
+#define _TU_ARGS_APPLY_4(_X, _s, _a1, _a2, _a3, _a4) _X(_a1) _s _TU_ARGS_APPLY_3(_X, _s, _a2, _a3, _a4)
+#define _TU_ARGS_APPLY_5(_X, _s, _a1, _a2, _a3, _a4, _a5) _X(_a1) _s _TU_ARGS_APPLY_4(_X, _s, _a2, _a3, _a4, _a5)
+#define _TU_ARGS_APPLY_6(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6) _X(_a1) _s _TU_ARGS_APPLY_5(_X, _s, _a2, _a3, _a4, _a5, _a6)
+#define _TU_ARGS_APPLY_7(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7) _X(_a1) _s _TU_ARGS_APPLY_6(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7)
+#define _TU_ARGS_APPLY_8(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) _X(_a1) _s _TU_ARGS_APPLY_7(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7, _a8)
+
+//--------------------------------------------------------------------+
+// Compiler porting with Attribute and Endian
+//--------------------------------------------------------------------+
+
+// TODO refactor since __attribute__ is supported across many compiler
+#if defined(__GNUC__)
+ #define TU_ATTR_ALIGNED(Bytes) __attribute__ ((aligned(Bytes)))
+ #define TU_ATTR_SECTION(sec_name) __attribute__ ((section(#sec_name)))
+ #define TU_ATTR_PACKED __attribute__ ((packed))
+ #define TU_ATTR_WEAK __attribute__ ((weak))
+ #define TU_ATTR_ALWAYS_INLINE __attribute__ ((always_inline))
+ #define TU_ATTR_DEPRECATED(mess) __attribute__ ((deprecated(mess))) // warn if function with this attribute is used
+ #define TU_ATTR_UNUSED __attribute__ ((unused)) // Function/Variable is meant to be possibly unused
+ #define TU_ATTR_USED __attribute__ ((used)) // Function/Variable is meant to be used
+
+ #define TU_ATTR_PACKED_BEGIN
+ #define TU_ATTR_PACKED_END
+ #define TU_ATTR_BIT_FIELD_ORDER_BEGIN
+ #define TU_ATTR_BIT_FIELD_ORDER_END
+
+ #if __has_attribute(__fallthrough__)
+ #define TU_ATTR_FALLTHROUGH __attribute__((fallthrough))
+ #else
+ #define TU_ATTR_FALLTHROUGH do {} while (0) /* fallthrough */
+ #endif
+
+ // Endian conversion use well-known host to network (big endian) naming
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ #define TU_BYTE_ORDER TU_LITTLE_ENDIAN
+ #else
+ #define TU_BYTE_ORDER TU_BIG_ENDIAN
+ #endif
+
+ #define TU_BSWAP16(u16) (__builtin_bswap16(u16))
+ #define TU_BSWAP32(u32) (__builtin_bswap32(u32))
+
+ #ifndef __ARMCC_VERSION
+ // List of obsolete callback function that is renamed and should not be defined.
+ // Put it here since only gcc support this pragma
+ #pragma GCC poison tud_vendor_control_request_cb
+ #endif
+
+#elif defined(__TI_COMPILER_VERSION__)
+ #define TU_ATTR_ALIGNED(Bytes) __attribute__ ((aligned(Bytes)))
+ #define TU_ATTR_SECTION(sec_name) __attribute__ ((section(#sec_name)))
+ #define TU_ATTR_PACKED __attribute__ ((packed))
+ #define TU_ATTR_WEAK __attribute__ ((weak))
+ #define TU_ATTR_ALWAYS_INLINE __attribute__ ((always_inline))
+ #define TU_ATTR_DEPRECATED(mess) __attribute__ ((deprecated(mess))) // warn if function with this attribute is used
+ #define TU_ATTR_UNUSED __attribute__ ((unused)) // Function/Variable is meant to be possibly unused
+ #define TU_ATTR_USED __attribute__ ((used))
+ #define TU_ATTR_FALLTHROUGH __attribute__((fallthrough))
+
+ #define TU_ATTR_PACKED_BEGIN
+ #define TU_ATTR_PACKED_END
+ #define TU_ATTR_BIT_FIELD_ORDER_BEGIN
+ #define TU_ATTR_BIT_FIELD_ORDER_END
+
+ // __BYTE_ORDER is defined in the TI ARM compiler, but not MSP430 (which is little endian)
+ #if ((__BYTE_ORDER__) == (__ORDER_LITTLE_ENDIAN__)) || defined(__MSP430__)
+ #define TU_BYTE_ORDER TU_LITTLE_ENDIAN
+ #else
+ #define TU_BYTE_ORDER TU_BIG_ENDIAN
+ #endif
+
+ #define TU_BSWAP16(u16) (__builtin_bswap16(u16))
+ #define TU_BSWAP32(u32) (__builtin_bswap32(u32))
+
+#elif defined(__ICCARM__)
+ #include
+ #define TU_ATTR_ALIGNED(Bytes) __attribute__ ((aligned(Bytes)))
+ #define TU_ATTR_SECTION(sec_name) __attribute__ ((section(#sec_name)))
+ #define TU_ATTR_PACKED __attribute__ ((packed))
+ #define TU_ATTR_WEAK __attribute__ ((weak))
+ #define TU_ATTR_ALWAYS_INLINE __attribute__ ((always_inline))
+ #define TU_ATTR_DEPRECATED(mess) __attribute__ ((deprecated(mess))) // warn if function with this attribute is used
+ #define TU_ATTR_UNUSED __attribute__ ((unused)) // Function/Variable is meant to be possibly unused
+ #define TU_ATTR_USED __attribute__ ((used)) // Function/Variable is meant to be used
+ #define TU_ATTR_FALLTHROUGH __attribute__((fallthrough))
+
+ #define TU_ATTR_PACKED_BEGIN
+ #define TU_ATTR_PACKED_END
+ #define TU_ATTR_BIT_FIELD_ORDER_BEGIN
+ #define TU_ATTR_BIT_FIELD_ORDER_END
+
+ // Endian conversion use well-known host to network (big endian) naming
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ #define TU_BYTE_ORDER TU_LITTLE_ENDIAN
+ #else
+ #define TU_BYTE_ORDER TU_BIG_ENDIAN
+ #endif
+
+ #define TU_BSWAP16(u16) (__iar_builtin_REV16(u16))
+ #define TU_BSWAP32(u32) (__iar_builtin_REV(u32))
+
+#elif defined(__CCRX__)
+ #define TU_ATTR_ALIGNED(Bytes)
+ #define TU_ATTR_SECTION(sec_name)
+ #define TU_ATTR_PACKED
+ #define TU_ATTR_WEAK
+ #define TU_ATTR_ALWAYS_INLINE
+ #define TU_ATTR_DEPRECATED(mess)
+ #define TU_ATTR_UNUSED
+ #define TU_ATTR_USED
+ #define TU_ATTR_FALLTHROUGH do {} while (0) /* fallthrough */
+
+ #define TU_ATTR_PACKED_BEGIN _Pragma("pack")
+ #define TU_ATTR_PACKED_END _Pragma("packoption")
+ #define TU_ATTR_BIT_FIELD_ORDER_BEGIN _Pragma("bit_order right")
+ #define TU_ATTR_BIT_FIELD_ORDER_END _Pragma("bit_order")
+
+ // Endian conversion use well-known host to network (big endian) naming
+ #if defined(__LIT)
+ #define TU_BYTE_ORDER TU_LITTLE_ENDIAN
+ #else
+ #define TU_BYTE_ORDER TU_BIG_ENDIAN
+ #endif
+
+ #define TU_BSWAP16(u16) ((unsigned short)_builtin_revw((unsigned long)u16))
+ #define TU_BSWAP32(u32) (_builtin_revl(u32))
+
+#else
+ #error "Compiler attribute porting is required"
+#endif
+
+
+#if (TU_BYTE_ORDER == TU_LITTLE_ENDIAN)
+
+ #define tu_htons(u16) (TU_BSWAP16(u16))
+ #define tu_ntohs(u16) (TU_BSWAP16(u16))
+
+ #define tu_htonl(u32) (TU_BSWAP32(u32))
+ #define tu_ntohl(u32) (TU_BSWAP32(u32))
+
+ #define tu_htole16(u16) (u16)
+ #define tu_le16toh(u16) (u16)
+
+ #define tu_htole32(u32) (u32)
+ #define tu_le32toh(u32) (u32)
+
+#elif (TU_BYTE_ORDER == TU_BIG_ENDIAN)
+
+ #define tu_htons(u16) (u16)
+ #define tu_ntohs(u16) (u16)
+
+ #define tu_htonl(u32) (u32)
+ #define tu_ntohl(u32) (u32)
+
+ #define tu_htole16(u16) (TU_BSWAP16(u16))
+ #define tu_le16toh(u16) (TU_BSWAP16(u16))
+
+ #define tu_htole32(u32) (TU_BSWAP32(u32))
+ #define tu_le32toh(u32) (TU_BSWAP32(u32))
+
+#else
+ #error Byte order is undefined
+#endif
+
+#endif /* _TUSB_COMPILER_H_ */
+
+/// @}
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_debug.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_debug.h
new file mode 100644
index 000000000..65fd1920d
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_debug.h
@@ -0,0 +1,178 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_DEBUG_H_
+#define _TUSB_DEBUG_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Debug
+//--------------------------------------------------------------------+
+
+// CFG_TUSB_DEBUG for debugging
+// 0 : no debug
+// 1 : print error
+// 2 : print warning
+// 3 : print info
+#if CFG_TUSB_DEBUG
+
+// Enum to String for debugging purposes
+#if CFG_TUSB_DEBUG >= 2
+extern char const* const tu_str_speed[];
+extern char const* const tu_str_std_request[];
+#endif
+
+void tu_print_mem(void const *buf, uint32_t count, uint8_t indent);
+
+#ifdef CFG_TUSB_DEBUG_PRINTF
+ extern int CFG_TUSB_DEBUG_PRINTF(const char *format, ...);
+ #define tu_printf CFG_TUSB_DEBUG_PRINTF
+#else
+ #define tu_printf printf
+#endif
+
+static inline void tu_print_arr(uint8_t const* buf, uint32_t bufsize)
+{
+ for(uint32_t i=0; i= 2
+ #define TU_LOG2 TU_LOG1
+ #define TU_LOG2_MEM TU_LOG1_MEM
+ #define TU_LOG2_ARR TU_LOG1_ARR
+ #define TU_LOG2_PTR TU_LOG1_PTR
+ #define TU_LOG2_INT TU_LOG1_INT
+ #define TU_LOG2_HEX TU_LOG1_HEX
+#endif
+
+// Log Level 3: Info
+#if CFG_TUSB_DEBUG >= 3
+ #define TU_LOG3 TU_LOG1
+ #define TU_LOG3_MEM TU_LOG1_MEM
+ #define TU_LOG3_ARR TU_LOG1_ARR
+ #define TU_LOG3_PTR TU_LOG1_PTR
+ #define TU_LOG3_INT TU_LOG1_INT
+ #define TU_LOG3_HEX TU_LOG1_HEX
+#endif
+
+typedef struct
+{
+ uint32_t key;
+ const char* data;
+} tu_lookup_entry_t;
+
+typedef struct
+{
+ uint16_t count;
+ tu_lookup_entry_t const* items;
+} tu_lookup_table_t;
+
+static inline const char* tu_lookup_find(tu_lookup_table_t const* p_table, uint32_t key)
+{
+ static char not_found[11];
+
+ for(uint16_t i=0; icount; i++)
+ {
+ if (p_table->items[i].key == key) return p_table->items[i].data;
+ }
+
+ // not found return the key value in hex
+ snprintf(not_found, sizeof(not_found), "0x%08lX", (unsigned long) key);
+
+ return not_found;
+}
+
+#endif // CFG_TUSB_DEBUG
+
+#ifndef TU_LOG
+ #define TU_LOG(n, ...)
+ #define TU_LOG_MEM(n, ...)
+ #define TU_LOG_PTR(n, ...)
+ #define TU_LOG_INT(n, ...)
+ #define TU_LOG_HEX(n, ...)
+ #define TU_LOG_LOCATION()
+ #define TU_LOG_FAILED()
+#endif
+
+// TODO replace all TU_LOGn with TU_LOG(n)
+
+#define TU_LOG0(...)
+#define TU_LOG0_MEM(...)
+#define TU_LOG0_PTR(...)
+#define TU_LOG0_INT(...)
+#define TU_LOG0_HEX(...)
+
+#ifndef TU_LOG1
+ #define TU_LOG1(...)
+ #define TU_LOG1_MEM(...)
+ #define TU_LOG1_PTR(...)
+ #define TU_LOG1_INT(...)
+ #define TU_LOG1_HEX(...)
+#endif
+
+#ifndef TU_LOG2
+ #define TU_LOG2(...)
+ #define TU_LOG2_MEM(...)
+ #define TU_LOG2_PTR(...)
+ #define TU_LOG2_INT(...)
+ #define TU_LOG2_HEX(...)
+#endif
+
+#ifndef TU_LOG3
+ #define TU_LOG3(...)
+ #define TU_LOG3_MEM(...)
+ #define TU_LOG3_PTR(...)
+ #define TU_LOG3_INT(...)
+ #define TU_LOG3_HEX(...)
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_DEBUG_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.c
new file mode 100644
index 000000000..a52c92267
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.c
@@ -0,0 +1,1065 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ * Copyright (c) 2020 Reinhard Panhuber - rework to unmasked pointers
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "osal/osal.h"
+#include "tusb_fifo.h"
+
+#define TU_FIFO_DBG 0
+
+// Suppress IAR warning
+// Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
+#if defined(__ICCARM__)
+#pragma diag_suppress = Pa082
+#endif
+
+#if OSAL_MUTEX_REQUIRED
+
+TU_ATTR_ALWAYS_INLINE static inline void _ff_lock(osal_mutex_t mutex)
+{
+ if (mutex) osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void _ff_unlock(osal_mutex_t mutex)
+{
+ if (mutex) osal_mutex_unlock(mutex);
+}
+
+#else
+
+#define _ff_lock(_mutex)
+#define _ff_unlock(_mutex)
+
+#endif
+
+/** \enum tu_fifo_copy_mode_t
+ * \brief Write modes intended to allow special read and write functions to be able to
+ * copy data to and from USB hardware FIFOs as needed for e.g. STM32s and others
+ */
+typedef enum
+{
+ TU_FIFO_COPY_INC, ///< Copy from/to an increasing source/destination address - default mode
+ TU_FIFO_COPY_CST_FULL_WORDS, ///< Copy from/to a constant source/destination address - required for e.g. STM32 to write into USB hardware FIFO
+} tu_fifo_copy_mode_t;
+
+bool tu_fifo_config(tu_fifo_t *f, void* buffer, uint16_t depth, uint16_t item_size, bool overwritable)
+{
+ // Limit index space to 2*depth - this allows for a fast "modulo" calculation
+ // but limits the maximum depth to 2^16/2 = 2^15 and buffer overflows are detectable
+ // only if overflow happens once (important for unsupervised DMA applications)
+ if (depth > 0x8000) return false;
+
+ _ff_lock(f->mutex_wr);
+ _ff_lock(f->mutex_rd);
+
+ f->buffer = (uint8_t*) buffer;
+ f->depth = depth;
+ f->item_size = (uint16_t) (item_size & 0x7FFF);
+ f->overwritable = overwritable;
+ f->rd_idx = 0;
+ f->wr_idx = 0;
+
+ _ff_unlock(f->mutex_wr);
+ _ff_unlock(f->mutex_rd);
+
+ return true;
+}
+
+//--------------------------------------------------------------------+
+// Pull & Push
+//--------------------------------------------------------------------+
+
+// Intended to be used to read from hardware USB FIFO in e.g. STM32 where all data is read from a constant address
+// Code adapted from dcd_synopsys.c
+// TODO generalize with configurable 1 byte or 4 byte each read
+static void _ff_push_const_addr(uint8_t * ff_buf, const void * app_buf, uint16_t len)
+{
+ volatile const uint32_t * reg_rx = (volatile const uint32_t *) app_buf;
+
+ // Reading full available 32 bit words from const app address
+ uint16_t full_words = len >> 2;
+ while(full_words--)
+ {
+ tu_unaligned_write32(ff_buf, *reg_rx);
+ ff_buf += 4;
+ }
+
+ // Read the remaining 1-3 bytes from const app address
+ uint8_t const bytes_rem = len & 0x03;
+ if ( bytes_rem )
+ {
+ uint32_t tmp32 = *reg_rx;
+ memcpy(ff_buf, &tmp32, bytes_rem);
+ }
+}
+
+// Intended to be used to write to hardware USB FIFO in e.g. STM32
+// where all data is written to a constant address in full word copies
+static void _ff_pull_const_addr(void * app_buf, const uint8_t * ff_buf, uint16_t len)
+{
+ volatile uint32_t * reg_tx = (volatile uint32_t *) app_buf;
+
+ // Write full available 32 bit words to const address
+ uint16_t full_words = len >> 2;
+ while(full_words--)
+ {
+ *reg_tx = tu_unaligned_read32(ff_buf);
+ ff_buf += 4;
+ }
+
+ // Write the remaining 1-3 bytes into const address
+ uint8_t const bytes_rem = len & 0x03;
+ if ( bytes_rem )
+ {
+ uint32_t tmp32 = 0;
+ memcpy(&tmp32, ff_buf, bytes_rem);
+
+ *reg_tx = tmp32;
+ }
+}
+
+// send one item to fifo WITHOUT updating write pointer
+static inline void _ff_push(tu_fifo_t* f, void const * app_buf, uint16_t rel)
+{
+ memcpy(f->buffer + (rel * f->item_size), app_buf, f->item_size);
+}
+
+// send n items to fifo WITHOUT updating write pointer
+static void _ff_push_n(tu_fifo_t* f, void const * app_buf, uint16_t n, uint16_t wr_ptr, tu_fifo_copy_mode_t copy_mode)
+{
+ uint16_t const lin_count = f->depth - wr_ptr;
+ uint16_t const wrap_count = n - lin_count;
+
+ uint16_t lin_bytes = lin_count * f->item_size;
+ uint16_t wrap_bytes = wrap_count * f->item_size;
+
+ // current buffer of fifo
+ uint8_t* ff_buf = f->buffer + (wr_ptr * f->item_size);
+
+ switch (copy_mode)
+ {
+ case TU_FIFO_COPY_INC:
+ if(n <= lin_count)
+ {
+ // Linear only
+ memcpy(ff_buf, app_buf, n*f->item_size);
+ }
+ else
+ {
+ // Wrap around
+
+ // Write data to linear part of buffer
+ memcpy(ff_buf, app_buf, lin_bytes);
+
+ // Write data wrapped around
+ // TU_ASSERT(nWrap_bytes <= f->depth, );
+ memcpy(f->buffer, ((uint8_t const*) app_buf) + lin_bytes, wrap_bytes);
+ }
+ break;
+
+ case TU_FIFO_COPY_CST_FULL_WORDS:
+ // Intended for hardware buffers from which it can be read word by word only
+ if(n <= lin_count)
+ {
+ // Linear only
+ _ff_push_const_addr(ff_buf, app_buf, n*f->item_size);
+ }
+ else
+ {
+ // Wrap around case
+
+ // Write full words to linear part of buffer
+ uint16_t nLin_4n_bytes = lin_bytes & 0xFFFC;
+ _ff_push_const_addr(ff_buf, app_buf, nLin_4n_bytes);
+ ff_buf += nLin_4n_bytes;
+
+ // There could be odd 1-3 bytes before the wrap-around boundary
+ uint8_t rem = lin_bytes & 0x03;
+ if (rem > 0)
+ {
+ volatile const uint32_t * rx_fifo = (volatile const uint32_t *) app_buf;
+
+ uint8_t remrem = (uint8_t) tu_min16(wrap_bytes, 4-rem);
+ wrap_bytes -= remrem;
+
+ uint32_t tmp32 = *rx_fifo;
+ uint8_t * src_u8 = ((uint8_t *) &tmp32);
+
+ // Write 1-3 bytes before wrapped boundary
+ while(rem--) *ff_buf++ = *src_u8++;
+
+ // Read more bytes to beginning to complete a word
+ ff_buf = f->buffer;
+ while(remrem--) *ff_buf++ = *src_u8++;
+ }
+ else
+ {
+ ff_buf = f->buffer; // wrap around to beginning
+ }
+
+ // Write data wrapped part
+ if (wrap_bytes > 0) _ff_push_const_addr(ff_buf, app_buf, wrap_bytes);
+ }
+ break;
+ }
+}
+
+// get one item from fifo WITHOUT updating read pointer
+static inline void _ff_pull(tu_fifo_t* f, void * app_buf, uint16_t rel)
+{
+ memcpy(app_buf, f->buffer + (rel * f->item_size), f->item_size);
+}
+
+// get n items from fifo WITHOUT updating read pointer
+static void _ff_pull_n(tu_fifo_t* f, void* app_buf, uint16_t n, uint16_t rd_ptr, tu_fifo_copy_mode_t copy_mode)
+{
+ uint16_t const lin_count = f->depth - rd_ptr;
+ uint16_t const wrap_count = n - lin_count; // only used if wrapped
+
+ uint16_t lin_bytes = lin_count * f->item_size;
+ uint16_t wrap_bytes = wrap_count * f->item_size;
+
+ // current buffer of fifo
+ uint8_t* ff_buf = f->buffer + (rd_ptr * f->item_size);
+
+ switch (copy_mode)
+ {
+ case TU_FIFO_COPY_INC:
+ if ( n <= lin_count )
+ {
+ // Linear only
+ memcpy(app_buf, ff_buf, n*f->item_size);
+ }
+ else
+ {
+ // Wrap around
+
+ // Read data from linear part of buffer
+ memcpy(app_buf, ff_buf, lin_bytes);
+
+ // Read data wrapped part
+ memcpy((uint8_t*) app_buf + lin_bytes, f->buffer, wrap_bytes);
+ }
+ break;
+
+ case TU_FIFO_COPY_CST_FULL_WORDS:
+ if ( n <= lin_count )
+ {
+ // Linear only
+ _ff_pull_const_addr(app_buf, ff_buf, n*f->item_size);
+ }
+ else
+ {
+ // Wrap around case
+
+ // Read full words from linear part of buffer
+ uint16_t lin_4n_bytes = lin_bytes & 0xFFFC;
+ _ff_pull_const_addr(app_buf, ff_buf, lin_4n_bytes);
+ ff_buf += lin_4n_bytes;
+
+ // There could be odd 1-3 bytes before the wrap-around boundary
+ uint8_t rem = lin_bytes & 0x03;
+ if (rem > 0)
+ {
+ volatile uint32_t * reg_tx = (volatile uint32_t *) app_buf;
+
+ uint8_t remrem = (uint8_t) tu_min16(wrap_bytes, 4-rem);
+ wrap_bytes -= remrem;
+
+ uint32_t tmp32=0;
+ uint8_t * dst_u8 = (uint8_t *)&tmp32;
+
+ // Read 1-3 bytes before wrapped boundary
+ while(rem--) *dst_u8++ = *ff_buf++;
+
+ // Read more bytes from beginning to complete a word
+ ff_buf = f->buffer;
+ while(remrem--) *dst_u8++ = *ff_buf++;
+
+ *reg_tx = tmp32;
+ }
+ else
+ {
+ ff_buf = f->buffer; // wrap around to beginning
+ }
+
+ // Read data wrapped part
+ if (wrap_bytes > 0) _ff_pull_const_addr(app_buf, ff_buf, wrap_bytes);
+ }
+ break;
+
+ default: break;
+ }
+}
+
+//--------------------------------------------------------------------+
+// Helper
+//--------------------------------------------------------------------+
+
+// return only the index difference and as such can be used to determine an overflow i.e overflowable count
+TU_ATTR_ALWAYS_INLINE static inline
+uint16_t _ff_count(uint16_t depth, uint16_t wr_idx, uint16_t rd_idx)
+{
+ // In case we have non-power of two depth we need a further modification
+ if (wr_idx >= rd_idx)
+ {
+ return (uint16_t) (wr_idx - rd_idx);
+ } else
+ {
+ return (uint16_t) (2*depth - (rd_idx - wr_idx));
+ }
+}
+
+// return remaining slot in fifo
+TU_ATTR_ALWAYS_INLINE static inline
+uint16_t _ff_remaining(uint16_t depth, uint16_t wr_idx, uint16_t rd_idx)
+{
+ uint16_t const count = _ff_count(depth, wr_idx, rd_idx);
+ return (depth > count) ? (depth - count) : 0;
+}
+
+//--------------------------------------------------------------------+
+// Index Helper
+//--------------------------------------------------------------------+
+
+// Advance an absolute index
+// "absolute" index is only in the range of [0..2*depth)
+static uint16_t advance_index(uint16_t depth, uint16_t idx, uint16_t offset)
+{
+ // We limit the index space of p such that a correct wrap around happens
+ // Check for a wrap around or if we are in unused index space - This has to be checked first!!
+ // We are exploiting the wrap around to the correct index
+ uint16_t new_idx = (uint16_t) (idx + offset);
+ if ( (idx > new_idx) || (new_idx >= 2*depth) )
+ {
+ uint16_t const non_used_index_space = (uint16_t) (UINT16_MAX - (2*depth-1));
+ new_idx = (uint16_t) (new_idx + non_used_index_space);
+ }
+
+ return new_idx;
+}
+
+#if 0 // not used but
+// Backward an absolute index
+static uint16_t backward_index(uint16_t depth, uint16_t idx, uint16_t offset)
+{
+ // We limit the index space of p such that a correct wrap around happens
+ // Check for a wrap around or if we are in unused index space - This has to be checked first!!
+ // We are exploiting the wrap around to the correct index
+ uint16_t new_idx = (uint16_t) (idx - offset);
+ if ( (idx < new_idx) || (new_idx >= 2*depth) )
+ {
+ uint16_t const non_used_index_space = (uint16_t) (UINT16_MAX - (2*depth-1));
+ new_idx = (uint16_t) (new_idx - non_used_index_space);
+ }
+
+ return new_idx;
+}
+#endif
+
+// index to pointer, simply an modulo with minus.
+TU_ATTR_ALWAYS_INLINE static inline
+uint16_t idx2ptr(uint16_t depth, uint16_t idx)
+{
+ // Only run at most 3 times since index is limit in the range of [0..2*depth)
+ while ( idx >= depth ) idx -= depth;
+ return idx;
+}
+
+// Works on local copies of w
+// When an overwritable fifo is overflowed, rd_idx will be re-index so that it forms
+// an full fifo i.e _ff_count() = depth
+TU_ATTR_ALWAYS_INLINE static inline
+uint16_t _ff_correct_read_index(tu_fifo_t* f, uint16_t wr_idx)
+{
+ uint16_t rd_idx;
+ if ( wr_idx >= f->depth )
+ {
+ rd_idx = wr_idx - f->depth;
+ }else
+ {
+ rd_idx = wr_idx + f->depth;
+ }
+
+ f->rd_idx = rd_idx;
+
+ return rd_idx;
+}
+
+// Works on local copies of w and r
+// Must be protected by mutexes since in case of an overflow read pointer gets modified
+static bool _tu_fifo_peek(tu_fifo_t* f, void * p_buffer, uint16_t wr_idx, uint16_t rd_idx)
+{
+ uint16_t cnt = _ff_count(f->depth, wr_idx, rd_idx);
+
+ // nothing to peek
+ if ( cnt == 0 ) return false;
+
+ // Check overflow and correct if required
+ if ( cnt > f->depth )
+ {
+ rd_idx = _ff_correct_read_index(f, wr_idx);
+ cnt = f->depth;
+ }
+
+ uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);
+
+ // Peek data
+ _ff_pull(f, p_buffer, rd_ptr);
+
+ return true;
+}
+
+// Works on local copies of w and r
+// Must be protected by mutexes since in case of an overflow read pointer gets modified
+static uint16_t _tu_fifo_peek_n(tu_fifo_t* f, void * p_buffer, uint16_t n, uint16_t wr_idx, uint16_t rd_idx, tu_fifo_copy_mode_t copy_mode)
+{
+ uint16_t cnt = _ff_count(f->depth, wr_idx, rd_idx);
+
+ // nothing to peek
+ if ( cnt == 0 ) return 0;
+
+ // Check overflow and correct if required
+ if ( cnt > f->depth )
+ {
+ rd_idx = _ff_correct_read_index(f, wr_idx);
+ cnt = f->depth;
+ }
+
+ // Check if we can read something at and after offset - if too less is available we read what remains
+ if ( cnt < n ) n = cnt;
+
+ uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);
+
+ // Peek data
+ _ff_pull_n(f, p_buffer, n, rd_ptr, copy_mode);
+
+ return n;
+}
+
+static uint16_t _tu_fifo_write_n(tu_fifo_t* f, const void * data, uint16_t n, tu_fifo_copy_mode_t copy_mode)
+{
+ if ( n == 0 ) return 0;
+
+ _ff_lock(f->mutex_wr);
+
+ uint16_t wr_idx = f->wr_idx;
+ uint16_t rd_idx = f->rd_idx;
+
+ uint8_t const* buf8 = (uint8_t const*) data;
+
+ TU_LOG(TU_FIFO_DBG, "rd = %3u, wr = %3u, count = %3u, remain = %3u, n = %3u: ",
+ rd_idx, wr_idx, _ff_count(f->depth, wr_idx, rd_idx), _ff_remaining(f->depth, wr_idx, rd_idx), n);
+
+ if ( !f->overwritable )
+ {
+ // limit up to full
+ uint16_t const remain = _ff_remaining(f->depth, wr_idx, rd_idx);
+ n = tu_min16(n, remain);
+ }
+ else
+ {
+ // In over-writable mode, fifo_write() is allowed even when fifo is full. In such case,
+ // oldest data in fifo i.e at read pointer data will be overwritten
+ // Note: we can modify read buffer contents but we must not modify the read index itself within a write function!
+ // Since it would end up in a race condition with read functions!
+ if ( n >= f->depth )
+ {
+ // Only copy last part
+ if ( copy_mode == TU_FIFO_COPY_INC )
+ {
+ buf8 += (n - f->depth) * f->item_size;
+ }else
+ {
+ // TODO should read from hw fifo to discard data, however reading an odd number could
+ // accidentally discard data.
+ }
+
+ n = f->depth;
+
+ // We start writing at the read pointer's position since we fill the whole buffer
+ wr_idx = rd_idx;
+ }
+ else
+ {
+ uint16_t const overflowable_count = _ff_count(f->depth, wr_idx, rd_idx);
+ if (overflowable_count + n >= 2*f->depth)
+ {
+ // Double overflowed
+ // Index is bigger than the allowed range [0,2*depth)
+ // re-position write index to have a full fifo after pushed
+ wr_idx = advance_index(f->depth, rd_idx, f->depth - n);
+
+ // TODO we should also shift out n bytes from read index since we avoid changing rd index !!
+ // However memmove() is expensive due to actual copying + wrapping consideration.
+ // Also race condition could happen anyway if read() is invoke while moving result in corrupted memory
+ // currently deliberately not implemented --> result in incorrect data read back
+ }else
+ {
+ // normal + single overflowed:
+ // Index is in the range of [0,2*depth) and thus detect and recoverable. Recovering is handled in read()
+ // Therefore we just increase write index
+ // we will correct (re-position) read index later on in fifo_read() function
+ }
+ }
+ }
+
+ if (n)
+ {
+ uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);
+
+ TU_LOG(TU_FIFO_DBG, "actual_n = %u, wr_ptr = %u", n, wr_ptr);
+
+ // Write data
+ _ff_push_n(f, buf8, n, wr_ptr, copy_mode);
+
+ // Advance index
+ f->wr_idx = advance_index(f->depth, wr_idx, n);
+
+ TU_LOG(TU_FIFO_DBG, "\tnew_wr = %u\n", f->wr_idx);
+ }
+
+ _ff_unlock(f->mutex_wr);
+
+ return n;
+}
+
+static uint16_t _tu_fifo_read_n(tu_fifo_t* f, void * buffer, uint16_t n, tu_fifo_copy_mode_t copy_mode)
+{
+ _ff_lock(f->mutex_rd);
+
+ // Peek the data
+ // f->rd_idx might get modified in case of an overflow so we can not use a local variable
+ n = _tu_fifo_peek_n(f, buffer, n, f->wr_idx, f->rd_idx, copy_mode);
+
+ // Advance read pointer
+ f->rd_idx = advance_index(f->depth, f->rd_idx, n);
+
+ _ff_unlock(f->mutex_rd);
+ return n;
+}
+
+//--------------------------------------------------------------------+
+// Application API
+//--------------------------------------------------------------------+
+
+/******************************************************************************/
+/*!
+ @brief Get number of items in FIFO.
+
+ As this function only reads the read and write pointers once, this function is
+ reentrant and thus thread and ISR save without any mutexes. In case an
+ overflow occurred, this function return f.depth at maximum. Overflows are
+ checked and corrected for in the read functions!
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+
+ @returns Number of items in FIFO
+ */
+/******************************************************************************/
+uint16_t tu_fifo_count(tu_fifo_t* f)
+{
+ return tu_min16(_ff_count(f->depth, f->wr_idx, f->rd_idx), f->depth);
+}
+
+/******************************************************************************/
+/*!
+ @brief Check if FIFO is empty.
+
+ As this function only reads the read and write pointers once, this function is
+ reentrant and thus thread and ISR save without any mutexes.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+
+ @returns Number of items in FIFO
+ */
+/******************************************************************************/
+bool tu_fifo_empty(tu_fifo_t* f)
+{
+ return f->wr_idx == f->rd_idx;
+}
+
+/******************************************************************************/
+/*!
+ @brief Check if FIFO is full.
+
+ As this function only reads the read and write pointers once, this function is
+ reentrant and thus thread and ISR save without any mutexes.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+
+ @returns Number of items in FIFO
+ */
+/******************************************************************************/
+bool tu_fifo_full(tu_fifo_t* f)
+{
+ return _ff_count(f->depth, f->wr_idx, f->rd_idx) >= f->depth;
+}
+
+/******************************************************************************/
+/*!
+ @brief Get remaining space in FIFO.
+
+ As this function only reads the read and write pointers once, this function is
+ reentrant and thus thread and ISR save without any mutexes.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+
+ @returns Number of items in FIFO
+ */
+/******************************************************************************/
+uint16_t tu_fifo_remaining(tu_fifo_t* f)
+{
+ return _ff_remaining(f->depth, f->wr_idx, f->rd_idx);
+}
+
+/******************************************************************************/
+/*!
+ @brief Check if overflow happened.
+
+ BE AWARE - THIS FUNCTION MIGHT NOT GIVE A CORRECT ANSWERE IN CASE WRITE POINTER "OVERFLOWS"
+ Only one overflow is allowed for this function to work e.g. if depth = 100, you must not
+ write more than 2*depth-1 items in one rush without updating write pointer. Otherwise
+ write pointer wraps and your pointer states are messed up. This can only happen if you
+ use DMAs, write functions do not allow such an error. Avoid such nasty things!
+
+ All reading functions (read, peek) check for overflows and correct read pointer on their own such
+ that latest items are read.
+ If required (e.g. for DMA use) you can also correct the read pointer by
+ tu_fifo_correct_read_pointer().
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+
+ @returns True if overflow happened
+ */
+/******************************************************************************/
+bool tu_fifo_overflowed(tu_fifo_t* f)
+{
+ return _ff_count(f->depth, f->wr_idx, f->rd_idx) > f->depth;
+}
+
+// Only use in case tu_fifo_overflow() returned true!
+void tu_fifo_correct_read_pointer(tu_fifo_t* f)
+{
+ _ff_lock(f->mutex_rd);
+ _ff_correct_read_index(f, f->wr_idx);
+ _ff_unlock(f->mutex_rd);
+}
+
+/******************************************************************************/
+/*!
+ @brief Read one element out of the buffer.
+
+ This function will return the element located at the array index of the
+ read pointer, and then increment the read pointer index.
+ This function checks for an overflow and corrects read pointer if required.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] buffer
+ Pointer to the place holder for data read from the buffer
+
+ @returns TRUE if the queue is not empty
+ */
+/******************************************************************************/
+bool tu_fifo_read(tu_fifo_t* f, void * buffer)
+{
+ _ff_lock(f->mutex_rd);
+
+ // Peek the data
+ // f->rd_idx might get modified in case of an overflow so we can not use a local variable
+ bool ret = _tu_fifo_peek(f, buffer, f->wr_idx, f->rd_idx);
+
+ // Advance pointer
+ f->rd_idx = advance_index(f->depth, f->rd_idx, ret);
+
+ _ff_unlock(f->mutex_rd);
+ return ret;
+}
+
+/******************************************************************************/
+/*!
+ @brief This function will read n elements from the array index specified by
+ the read pointer and increment the read index.
+ This function checks for an overflow and corrects read pointer if required.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] buffer
+ The pointer to data location
+ @param[in] n
+ Number of element that buffer can afford
+
+ @returns number of items read from the FIFO
+ */
+/******************************************************************************/
+uint16_t tu_fifo_read_n(tu_fifo_t* f, void * buffer, uint16_t n)
+{
+ return _tu_fifo_read_n(f, buffer, n, TU_FIFO_COPY_INC);
+}
+
+uint16_t tu_fifo_read_n_const_addr_full_words(tu_fifo_t* f, void * buffer, uint16_t n)
+{
+ return _tu_fifo_read_n(f, buffer, n, TU_FIFO_COPY_CST_FULL_WORDS);
+}
+
+/******************************************************************************/
+/*!
+ @brief Read one item without removing it from the FIFO.
+ This function checks for an overflow and corrects read pointer if required.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] p_buffer
+ Pointer to the place holder for data read from the buffer
+
+ @returns TRUE if the queue is not empty
+ */
+/******************************************************************************/
+bool tu_fifo_peek(tu_fifo_t* f, void * p_buffer)
+{
+ _ff_lock(f->mutex_rd);
+ bool ret = _tu_fifo_peek(f, p_buffer, f->wr_idx, f->rd_idx);
+ _ff_unlock(f->mutex_rd);
+ return ret;
+}
+
+/******************************************************************************/
+/*!
+ @brief Read n items without removing it from the FIFO
+ This function checks for an overflow and corrects read pointer if required.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] p_buffer
+ Pointer to the place holder for data read from the buffer
+ @param[in] n
+ Number of items to peek
+
+ @returns Number of bytes written to p_buffer
+ */
+/******************************************************************************/
+uint16_t tu_fifo_peek_n(tu_fifo_t* f, void * p_buffer, uint16_t n)
+{
+ _ff_lock(f->mutex_rd);
+ uint16_t ret = _tu_fifo_peek_n(f, p_buffer, n, f->wr_idx, f->rd_idx, TU_FIFO_COPY_INC);
+ _ff_unlock(f->mutex_rd);
+ return ret;
+}
+
+/******************************************************************************/
+/*!
+ @brief Write one element into the buffer.
+
+ This function will write one element into the array index specified by
+ the write pointer and increment the write index.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] data
+ The byte to add to the FIFO
+
+ @returns TRUE if the data was written to the FIFO (overwrittable
+ FIFO will always return TRUE)
+ */
+/******************************************************************************/
+bool tu_fifo_write(tu_fifo_t* f, const void * data)
+{
+ _ff_lock(f->mutex_wr);
+
+ bool ret;
+ uint16_t const wr_idx = f->wr_idx;
+
+ if ( tu_fifo_full(f) && !f->overwritable )
+ {
+ ret = false;
+ }else
+ {
+ uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);
+
+ // Write data
+ _ff_push(f, data, wr_ptr);
+
+ // Advance pointer
+ f->wr_idx = advance_index(f->depth, wr_idx, 1);
+
+ ret = true;
+ }
+
+ _ff_unlock(f->mutex_wr);
+
+ return ret;
+}
+
+/******************************************************************************/
+/*!
+ @brief This function will write n elements into the array index specified by
+ the write pointer and increment the write index.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] data
+ The pointer to data to add to the FIFO
+ @param[in] count
+ Number of element
+ @return Number of written elements
+ */
+/******************************************************************************/
+uint16_t tu_fifo_write_n(tu_fifo_t* f, const void * data, uint16_t n)
+{
+ return _tu_fifo_write_n(f, data, n, TU_FIFO_COPY_INC);
+}
+
+/******************************************************************************/
+/*!
+ @brief This function will write n elements into the array index specified by
+ the write pointer and increment the write index. The source address will
+ not be incremented which is useful for reading from registers.
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] data
+ The pointer to data to add to the FIFO
+ @param[in] count
+ Number of element
+ @return Number of written elements
+ */
+/******************************************************************************/
+uint16_t tu_fifo_write_n_const_addr_full_words(tu_fifo_t* f, const void * data, uint16_t n)
+{
+ return _tu_fifo_write_n(f, data, n, TU_FIFO_COPY_CST_FULL_WORDS);
+}
+
+/******************************************************************************/
+/*!
+ @brief Clear the fifo read and write pointers
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ */
+/******************************************************************************/
+bool tu_fifo_clear(tu_fifo_t *f)
+{
+ _ff_lock(f->mutex_wr);
+ _ff_lock(f->mutex_rd);
+
+ f->rd_idx = 0;
+ f->wr_idx = 0;
+
+ _ff_unlock(f->mutex_wr);
+ _ff_unlock(f->mutex_rd);
+ return true;
+}
+
+/******************************************************************************/
+/*!
+ @brief Change the fifo mode to overwritable or not overwritable
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] overwritable
+ Overwritable mode the fifo is set to
+ */
+/******************************************************************************/
+bool tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable)
+{
+ _ff_lock(f->mutex_wr);
+ _ff_lock(f->mutex_rd);
+
+ f->overwritable = overwritable;
+
+ _ff_unlock(f->mutex_wr);
+ _ff_unlock(f->mutex_rd);
+
+ return true;
+}
+
+/******************************************************************************/
+/*!
+ @brief Advance write pointer - intended to be used in combination with DMA.
+ It is possible to fill the FIFO by use of a DMA in circular mode. Within
+ DMA ISRs you may update the write pointer to be able to read from the FIFO.
+ As long as the DMA is the only process writing into the FIFO this is safe
+ to use.
+
+ USE WITH CARE - WE DO NOT CONDUCT SAFETY CHECKS HERE!
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] n
+ Number of items the write pointer moves forward
+ */
+/******************************************************************************/
+void tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n)
+{
+ f->wr_idx = advance_index(f->depth, f->wr_idx, n);
+}
+
+/******************************************************************************/
+/*!
+ @brief Advance read pointer - intended to be used in combination with DMA.
+ It is possible to read from the FIFO by use of a DMA in linear mode. Within
+ DMA ISRs you may update the read pointer to be able to again write into the
+ FIFO. As long as the DMA is the only process reading from the FIFO this is
+ safe to use.
+
+ USE WITH CARE - WE DO NOT CONDUCT SAFETY CHECKS HERE!
+
+ @param[in] f
+ Pointer to the FIFO buffer to manipulate
+ @param[in] n
+ Number of items the read pointer moves forward
+ */
+/******************************************************************************/
+void tu_fifo_advance_read_pointer(tu_fifo_t *f, uint16_t n)
+{
+ f->rd_idx = advance_index(f->depth, f->rd_idx, n);
+}
+
+/******************************************************************************/
+/*!
+ @brief Get read info
+
+ Returns the length and pointer from which bytes can be read in a linear manner.
+ This is of major interest for DMA transmissions. If returned length is zero the
+ corresponding pointer is invalid.
+ The read pointer does NOT get advanced, use tu_fifo_advance_read_pointer() to
+ do so!
+ @param[in] f
+ Pointer to FIFO
+ @param[out] *info
+ Pointer to struct which holds the desired infos
+ */
+/******************************************************************************/
+void tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
+{
+ // Operate on temporary values in case they change in between
+ uint16_t wr_idx = f->wr_idx;
+ uint16_t rd_idx = f->rd_idx;
+
+ uint16_t cnt = _ff_count(f->depth, wr_idx, rd_idx);
+
+ // Check overflow and correct if required - may happen in case a DMA wrote too fast
+ if (cnt > f->depth)
+ {
+ _ff_lock(f->mutex_rd);
+ rd_idx = _ff_correct_read_index(f, wr_idx);
+ _ff_unlock(f->mutex_rd);
+
+ cnt = f->depth;
+ }
+
+ // Check if fifo is empty
+ if (cnt == 0)
+ {
+ info->len_lin = 0;
+ info->len_wrap = 0;
+ info->ptr_lin = NULL;
+ info->ptr_wrap = NULL;
+ return;
+ }
+
+ // Get relative pointers
+ uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);
+ uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);
+
+ // Copy pointer to buffer to start reading from
+ info->ptr_lin = &f->buffer[rd_ptr];
+
+ // Check if there is a wrap around necessary
+ if (wr_ptr > rd_ptr)
+ {
+ // Non wrapping case
+ info->len_lin = cnt;
+
+ info->len_wrap = 0;
+ info->ptr_wrap = NULL;
+ }
+ else
+ {
+ info->len_lin = f->depth - rd_ptr; // Also the case if FIFO was full
+
+ info->len_wrap = cnt - info->len_lin;
+ info->ptr_wrap = f->buffer;
+ }
+}
+
+/******************************************************************************/
+/*!
+ @brief Get linear write info
+
+ Returns the length and pointer to which bytes can be written into FIFO in a linear manner.
+ This is of major interest for DMA transmissions not using circular mode. If a returned length is zero the
+ corresponding pointer is invalid. The returned lengths summed up are the currently free space in the FIFO.
+ The write pointer does NOT get advanced, use tu_fifo_advance_write_pointer() to do so!
+ TAKE CARE TO NOT OVERFLOW THE BUFFER MORE THAN TWO TIMES THE FIFO DEPTH - IT CAN NOT RECOVERE OTHERWISE!
+ @param[in] f
+ Pointer to FIFO
+ @param[out] *info
+ Pointer to struct which holds the desired infos
+ */
+/******************************************************************************/
+void tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
+{
+ uint16_t wr_idx = f->wr_idx;
+ uint16_t rd_idx = f->rd_idx;
+ uint16_t remain = _ff_remaining(f->depth, wr_idx, rd_idx);
+
+ if (remain == 0)
+ {
+ info->len_lin = 0;
+ info->len_wrap = 0;
+ info->ptr_lin = NULL;
+ info->ptr_wrap = NULL;
+ return;
+ }
+
+ // Get relative pointers
+ uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);
+ uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);
+
+ // Copy pointer to buffer to start writing to
+ info->ptr_lin = &f->buffer[wr_ptr];
+
+ if (wr_ptr < rd_ptr)
+ {
+ // Non wrapping case
+ info->len_lin = rd_ptr-wr_ptr;
+ info->len_wrap = 0;
+ info->ptr_wrap = NULL;
+ }
+ else
+ {
+ info->len_lin = f->depth - wr_ptr;
+ info->len_wrap = remain - info->len_lin; // Remaining length - n already was limited to remain or FIFO depth
+ info->ptr_wrap = f->buffer; // Always start of buffer
+ }
+}
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.h
new file mode 100644
index 000000000..2f60ec2f4
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_fifo.h
@@ -0,0 +1,206 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ * Copyright (c) 2020 Reinhard Panhuber - rework to unmasked pointers
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_FIFO_H_
+#define _TUSB_FIFO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Due to the use of unmasked pointers, this FIFO does not suffer from losing
+// one item slice. Furthermore, write and read operations are completely
+// decoupled as write and read functions do not modify a common state. Henceforth,
+// writing or reading from the FIFO within an ISR is safe as long as no other
+// process (thread or ISR) interferes.
+// Also, this FIFO is ready to be used in combination with a DMA as the write and
+// read pointers can be updated from within a DMA ISR. Overflows are detectable
+// within a certain number (see tu_fifo_overflow()).
+
+#include "common/tusb_common.h"
+#include "osal/osal.h"
+
+// mutex is only needed for RTOS
+// for OS None, we don't get preempted
+#define CFG_FIFO_MUTEX OSAL_MUTEX_REQUIRED
+
+/* Write/Read index is always in the range of:
+ * 0 .. 2*depth-1
+ * The extra window allow us to determine the fifo state of empty or full with only 2 indices
+ * Following are examples with depth = 3
+ *
+ * - empty: W = R
+ * |
+ * -------------------------
+ * | 0 | RW| 2 | 3 | 4 | 5 |
+ *
+ * - full 1: W > R
+ * |
+ * -------------------------
+ * | 0 | R | 2 | 3 | W | 5 |
+ *
+ * - full 2: W < R
+ * |
+ * -------------------------
+ * | 0 | 1 | W | 3 | 4 | R |
+ *
+ * - Number of items in the fifo can be determined in either cases:
+ * - case W >= R: Count = W - R
+ * - case W < R: Count = 2*depth - (R - W)
+ *
+ * In non-overwritable mode, computed Count (in above 2 cases) is at most equal to depth.
+ * However, in over-writable mode, write index can be repeatedly increased and count can be
+ * temporarily larger than depth (overflowed condition) e.g
+ *
+ * - Overflowed 1: write(3), write(1)
+ * In this case we will adjust Read index when read()/peek() is called so that count = depth.
+ * |
+ * -------------------------
+ * | R | 1 | 2 | 3 | W | 5 |
+ *
+ * - Double Overflowed i.e index is out of allowed range [0,2*depth)
+ * This occurs when we continue to write after 1st overflowed to 2nd overflowed. e.g:
+ * write(3), write(1), write(2)
+ * This must be prevented since it will cause unrecoverable state, in above example
+ * if not handled the fifo will be empty instead of continue-to-be full. Since we must not modify
+ * read index in write() function, which cause race condition. We will re-position write index so that
+ * after data is written it is a full fifo i.e W = depth - R
+ *
+ * re-position W = 1 before write(2)
+ * Note: we should also move data from mem[3] to read index as well, but deliberately skipped here
+ * since it is an expensive operation !!!
+ * |
+ * -------------------------
+ * | R | W | 2 | 3 | 4 | 5 |
+ *
+ * perform write(2), result is still a full fifo.
+ *
+ * |
+ * -------------------------
+ * | R | 1 | 2 | W | 4 | 5 |
+
+ */
+typedef struct
+{
+ uint8_t* buffer ; // buffer pointer
+ uint16_t depth ; // max items
+
+ struct TU_ATTR_PACKED {
+ uint16_t item_size : 15; // size of each item
+ bool overwritable : 1 ; // ovwerwritable when full
+ };
+
+ volatile uint16_t wr_idx ; // write index
+ volatile uint16_t rd_idx ; // read index
+
+#if OSAL_MUTEX_REQUIRED
+ osal_mutex_t mutex_wr;
+ osal_mutex_t mutex_rd;
+#endif
+
+} tu_fifo_t;
+
+typedef struct
+{
+ uint16_t len_lin ; ///< linear length in item size
+ uint16_t len_wrap ; ///< wrapped length in item size
+ void * ptr_lin ; ///< linear part start pointer
+ void * ptr_wrap ; ///< wrapped part start pointer
+} tu_fifo_buffer_info_t;
+
+#define TU_FIFO_INIT(_buffer, _depth, _type, _overwritable) \
+{ \
+ .buffer = _buffer, \
+ .depth = _depth, \
+ .item_size = sizeof(_type), \
+ .overwritable = _overwritable, \
+}
+
+#define TU_FIFO_DEF(_name, _depth, _type, _overwritable) \
+ uint8_t _name##_buf[_depth*sizeof(_type)]; \
+ tu_fifo_t _name = TU_FIFO_INIT(_name##_buf, _depth, _type, _overwritable)
+
+
+bool tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable);
+bool tu_fifo_clear(tu_fifo_t *f);
+bool tu_fifo_config(tu_fifo_t *f, void* buffer, uint16_t depth, uint16_t item_size, bool overwritable);
+
+#if OSAL_MUTEX_REQUIRED
+TU_ATTR_ALWAYS_INLINE static inline
+void tu_fifo_config_mutex(tu_fifo_t *f, osal_mutex_t wr_mutex, osal_mutex_t rd_mutex)
+{
+ f->mutex_wr = wr_mutex;
+ f->mutex_rd = rd_mutex;
+}
+
+#else
+
+#define tu_fifo_config_mutex(_f, _wr_mutex, _rd_mutex)
+
+#endif
+
+bool tu_fifo_write (tu_fifo_t* f, void const * p_data);
+uint16_t tu_fifo_write_n (tu_fifo_t* f, void const * p_data, uint16_t n);
+uint16_t tu_fifo_write_n_const_addr_full_words (tu_fifo_t* f, const void * data, uint16_t n);
+
+bool tu_fifo_read (tu_fifo_t* f, void * p_buffer);
+uint16_t tu_fifo_read_n (tu_fifo_t* f, void * p_buffer, uint16_t n);
+uint16_t tu_fifo_read_n_const_addr_full_words (tu_fifo_t* f, void * buffer, uint16_t n);
+
+bool tu_fifo_peek (tu_fifo_t* f, void * p_buffer);
+uint16_t tu_fifo_peek_n (tu_fifo_t* f, void * p_buffer, uint16_t n);
+
+uint16_t tu_fifo_count (tu_fifo_t* f);
+uint16_t tu_fifo_remaining (tu_fifo_t* f);
+bool tu_fifo_empty (tu_fifo_t* f);
+bool tu_fifo_full (tu_fifo_t* f);
+bool tu_fifo_overflowed (tu_fifo_t* f);
+void tu_fifo_correct_read_pointer (tu_fifo_t* f);
+
+TU_ATTR_ALWAYS_INLINE static inline
+uint16_t tu_fifo_depth(tu_fifo_t* f)
+{
+ return f->depth;
+}
+
+// Pointer modifications intended to be used in combinations with DMAs.
+// USE WITH CARE - NO SAFETY CHECKS CONDUCTED HERE! NOT MUTEX PROTECTED!
+void tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n);
+void tu_fifo_advance_read_pointer (tu_fifo_t *f, uint16_t n);
+
+// If you want to read/write from/to the FIFO by use of a DMA, you may need to conduct two copies
+// to handle a possible wrapping part. These functions deliver a pointer to start
+// reading/writing from/to and a valid linear length along which no wrap occurs.
+void tu_fifo_get_read_info (tu_fifo_t *f, tu_fifo_buffer_info_t *info);
+void tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TUSB_FIFO_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_mcu.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_mcu.h
new file mode 100644
index 000000000..0b10c5118
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_mcu.h
@@ -0,0 +1,307 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef TUSB_MCU_H_
+#define TUSB_MCU_H_
+
+//--------------------------------------------------------------------+
+// Port Specific
+// TUP stand for TinyUSB Port (can be renamed)
+//--------------------------------------------------------------------+
+
+//------------- Unaligned Memory Access -------------//
+
+// ARMv7+ (M3-M7, M23-M33) can access unaligned memory
+#if (defined(__ARM_ARCH) && (__ARM_ARCH >= 7))
+ #define TUP_ARCH_STRICT_ALIGN 0
+#else
+ #define TUP_ARCH_STRICT_ALIGN 1
+#endif
+
+/* USB Controller Attributes for Device, Host or MCU (both)
+ * - ENDPOINT_MAX: max (logical) number of endpoint
+ * - ENDPOINT_EXCLUSIVE_NUMBER: endpoint number with different direction IN and OUT aren't allowed,
+ * e.g EP1 OUT & EP1 IN cannot exist together
+ * - RHPORT_HIGHSPEED: support highspeed with on-chip PHY
+ */
+
+//------------- NXP -------------//
+#if TU_CHECK_MCU(OPT_MCU_LPC11UXX, OPT_MCU_LPC13XX, OPT_MCU_LPC15XX)
+ #define TUP_DCD_ENDPOINT_MAX 5
+
+#elif TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)
+ #define TUP_DCD_ENDPOINT_MAX 16
+ #define TUP_USBIP_OHCI
+
+#elif TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)
+ // TODO USB0 has 6, USB1 has 4
+ #define TUP_USBIP_CHIPIDEA_HS
+ #define TUP_USBIP_EHCI
+
+ #define TUP_DCD_ENDPOINT_MAX 6
+ #define TUP_RHPORT_HIGHSPEED 1 // Port0 HS, Port1 FS
+
+#elif TU_CHECK_MCU(OPT_MCU_LPC51UXX)
+ #define TUP_DCD_ENDPOINT_MAX 5
+
+#elif TU_CHECK_MCU(OPT_MCU_LPC54XXX)
+ // TODO USB0 has 5, USB1 has 6
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+#elif TU_CHECK_MCU(OPT_MCU_LPC55XX)
+ // TODO USB0 has 5, USB1 has 6
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+#elif TU_CHECK_MCU(OPT_MCU_MIMXRT)
+ #define TUP_USBIP_CHIPIDEA_HS
+ #define TUP_USBIP_EHCI
+
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #define TUP_RHPORT_HIGHSPEED 1 // Port0 HS, Port1 HS
+
+#elif TU_CHECK_MCU(OPT_MCU_MKL25ZXX, OPT_MCU_K32L2BXX)
+ #define TUP_DCD_ENDPOINT_MAX 16
+
+#elif TU_CHECK_MCU(OPT_MCU_MM32F327X)
+ #define TUP_DCD_ENDPOINT_MAX 16
+
+//------------- Nordic -------------//
+#elif TU_CHECK_MCU(OPT_MCU_NRF5X)
+ // 8 CBI + 1 ISO
+ #define TUP_DCD_ENDPOINT_MAX 9
+
+//------------- Microchip -------------//
+#elif TU_CHECK_MCU(OPT_MCU_SAMD21, OPT_MCU_SAMD51, OPT_MCU_SAME5X) || \
+ TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAML21, OPT_MCU_SAML22)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_SAMG)
+ #define TUP_DCD_ENDPOINT_MAX 6
+ #define TUP_DCD_ENDPOINT_EXCLUSIVE_NUMBER
+
+#elif TU_CHECK_MCU(OPT_MCU_SAMX7X)
+ #define TUP_DCD_ENDPOINT_MAX 10
+ #define TUP_RHPORT_HIGHSPEED 1
+ #define TUP_DCD_ENDPOINT_EXCLUSIVE_NUMBER
+
+#elif TU_CHECK_MCU(OPT_MCU_PIC32MZ)
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #define TUP_DCD_ENDPOINT_EXCLUSIVE_NUMBER
+
+#elif TU_CHECK_MCU(OPT_MCU_PIC32MX, OPT_MCU_PIC32MM, OPT_MCU_PIC32MK) || \
+ TU_CHECK_MCU(OPT_MCU_PIC24, OPT_MCU_DSPIC33)
+ #define TUP_DCD_ENDPOINT_MAX 16
+ #define TUP_DCD_ENDPOINT_EXCLUSIVE_NUMBER
+
+//------------- ST -------------//
+#elif TU_CHECK_MCU(OPT_MCU_STM32F0)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32F1)
+ #if defined (STM32F105x8) || defined (STM32F105xB) || defined (STM32F105xC) || \
+ defined (STM32F107xB) || defined (STM32F107xC)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ #define TUP_DCD_ENDPOINT_MAX 4
+ #else
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #endif
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32F2)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ // FS has 4 ep, HS has 5 ep
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32F3)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32F4)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ // For most mcu, FS has 4, HS has 6. TODO 446/469/479 HS has 9
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32F7)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ // FS has 6, HS has 9
+ #define TUP_DCD_ENDPOINT_MAX 9
+
+ // MCU with on-chip HS Phy
+ #if defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F733xx)
+ #define TUP_RHPORT_HIGHSPEED 1 // Port0: FS, Port1: HS
+ #endif
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32H7)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ #define TUP_DCD_ENDPOINT_MAX 9
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32G4)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32L0, OPT_MCU_STM32L1)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32L4)
+ #if defined (STM32L475xx) || defined (STM32L476xx) || \
+ defined (STM32L485xx) || defined (STM32L486xx) || defined (STM32L496xx) || \
+ defined (STM32L4A6xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || \
+ defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || \
+ defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+
+ #define TUP_DCD_ENDPOINT_MAX 6
+ #else
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #endif
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32WB)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_STM32U5)
+ #define TUP_USBIP_DWC2
+ #define TUP_USBIP_DWC2_STM32
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+//------------- Sony -------------//
+#elif TU_CHECK_MCU(OPT_MCU_CXD56)
+ #define TUP_DCD_ENDPOINT_MAX 7
+ #define TUP_RHPORT_HIGHSPEED 1
+ #define TUP_DCD_ENDPOINT_EXCLUSIVE_NUMBER
+
+//------------- TI -------------//
+#elif TU_CHECK_MCU(OPT_MCU_MSP430x5xx)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_MSP432E4, OPT_MCU_TM4C123, OPT_MCU_TM4C129)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+//------------- ValentyUSB -------------//
+#elif TU_CHECK_MCU(OPT_MCU_VALENTYUSB_EPTRI)
+ #define TUP_DCD_ENDPOINT_MAX 16
+
+//------------- Nuvoton -------------//
+#elif TU_CHECK_MCU(OPT_MCU_NUC121, OPT_MCU_NUC126)
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+#elif TU_CHECK_MCU(OPT_MCU_NUC120)
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+#elif TU_CHECK_MCU(OPT_MCU_NUC505)
+ #define TUP_DCD_ENDPOINT_MAX 12
+ #define TUP_RHPORT_HIGHSPEED 1
+
+//------------- Espressif -------------//
+#elif TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3)
+ #define TUP_USBIP_DWC2
+ #define TUP_DCD_ENDPOINT_MAX 6
+
+//------------- Dialog -------------//
+#elif TU_CHECK_MCU(OPT_MCU_DA1469X)
+ #define TUP_DCD_ENDPOINT_MAX 4
+
+//------------- Raspberry Pi -------------//
+#elif TU_CHECK_MCU(OPT_MCU_RP2040)
+ #define TUP_DCD_ENDPOINT_MAX 16
+
+ #define TU_ATTR_FAST_FUNC __attribute__((section(".time_critical.tinyusb")))
+
+//------------- Silabs -------------//
+#elif TU_CHECK_MCU(OPT_MCU_EFM32GG)
+ #define TUP_USBIP_DWC2
+ #define TUP_DCD_ENDPOINT_MAX 7
+
+//------------- Renesas -------------//
+#elif TU_CHECK_MCU(OPT_MCU_RX63X, OPT_MCU_RX65X, OPT_MCU_RX72N)
+ #define TUP_DCD_ENDPOINT_MAX 10
+
+//------------- GigaDevice -------------//
+#elif TU_CHECK_MCU(OPT_MCU_GD32VF103)
+ #define TUP_USBIP_DWC2
+ #define TUP_DCD_ENDPOINT_MAX 4
+
+//------------- Broadcom -------------//
+#elif TU_CHECK_MCU(OPT_MCU_BCM2711, OPT_MCU_BCM2835, OPT_MCU_BCM2837)
+ #define TUP_USBIP_DWC2
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #define TUP_RHPORT_HIGHSPEED 1
+
+//------------- Broadcom -------------//
+#elif TU_CHECK_MCU(OPT_MCU_XMC4000)
+ #define TUP_USBIP_DWC2
+ #define TUP_DCD_ENDPOINT_MAX 8
+
+//------------- BridgeTek -------------//
+#elif TU_CHECK_MCU(OPT_MCU_FT90X)
+ #define TUP_DCD_ENDPOINT_MAX 8
+ #define TUP_RHPORT_HIGHSPEED 1
+
+#elif TU_CHECK_MCU(OPT_MCU_FT93X)
+ #define TUP_DCD_ENDPOINT_MAX 16
+ #define TUP_RHPORT_HIGHSPEED 1
+
+//------------ Allwinner -------------//
+#elif TU_CHECK_MCU(OPT_MCU_F1C100S)
+ #define TUP_DCD_ENDPOINT_MAX 4
+
+//------------- WCH -------------//
+#elif TU_CHECK_MCU(OPT_MCU_CH32V307)
+ #define TUP_DCD_ENDPOINT_MAX 16
+ #define TUP_RHPORT_HIGHSPEED 1
+#endif
+
+//--------------------------------------------------------------------+
+// Default Values
+//--------------------------------------------------------------------+
+
+#ifndef TUP_MCU_MULTIPLE_CORE
+#define TUP_MCU_MULTIPLE_CORE 0
+#endif
+
+#ifndef TUP_DCD_ENDPOINT_MAX
+ #warning "TUP_DCD_ENDPOINT_MAX is not defined for this MCU, default to 8"
+ #define TUP_DCD_ENDPOINT_MAX 8
+#endif
+
+// Default to fullspeed if not defined
+#ifndef TUP_RHPORT_HIGHSPEED
+ #define TUP_RHPORT_HIGHSPEED 0
+#endif
+
+// fast function, normally mean placing function in SRAM
+#ifndef TU_ATTR_FAST_FUNC
+ #define TU_ATTR_FAST_FUNC
+#endif
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_private.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_private.h
new file mode 100644
index 000000000..d5541856c
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_private.h
@@ -0,0 +1,173 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022, Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+
+#ifndef _TUSB_PRIVATE_H_
+#define _TUSB_PRIVATE_H_
+
+// Internal Helper used by Host and Device Stack
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+typedef struct TU_ATTR_PACKED
+{
+ volatile uint8_t busy : 1;
+ volatile uint8_t stalled : 1;
+ volatile uint8_t claimed : 1;
+}tu_edpt_state_t;
+
+typedef struct {
+ bool is_host; // host or device most
+ union {
+ uint8_t daddr;
+ uint8_t rhport;
+ uint8_t hwid;
+ };
+ uint8_t ep_addr;
+ uint8_t ep_speed;
+
+ uint16_t ep_packetsize;
+ uint16_t ep_bufsize;
+
+ // TODO xfer_fifo can skip this buffer
+ uint8_t* ep_buf;
+
+ tu_fifo_t ff;
+
+ // mutex: read if ep rx, write if e tx
+ OSAL_MUTEX_DEF(ff_mutex);
+
+}tu_edpt_stream_t;
+
+//--------------------------------------------------------------------+
+// Endpoint
+//--------------------------------------------------------------------+
+
+// Check if endpoint descriptor is valid per USB specs
+bool tu_edpt_validate(tusb_desc_endpoint_t const * desc_ep, tusb_speed_t speed);
+
+// Bind all endpoint of a interface descriptor to class driver
+void tu_edpt_bind_driver(uint8_t ep2drv[][2], tusb_desc_interface_t const* p_desc, uint16_t desc_len, uint8_t driver_id);
+
+// Calculate total length of n interfaces (depending on IAD)
+uint16_t tu_desc_get_interface_total_len(tusb_desc_interface_t const* desc_itf, uint8_t itf_count, uint16_t max_len);
+
+// Claim an endpoint with provided mutex
+bool tu_edpt_claim(tu_edpt_state_t* ep_state, osal_mutex_t mutex);
+
+// Release an endpoint with provided mutex
+bool tu_edpt_release(tu_edpt_state_t* ep_state, osal_mutex_t mutex);
+
+//--------------------------------------------------------------------+
+// Endpoint Stream
+//--------------------------------------------------------------------+
+
+// Init an stream, should only be called once
+bool tu_edpt_stream_init(tu_edpt_stream_t* s, bool is_host, bool is_tx, bool overwritable,
+ void* ff_buf, uint16_t ff_bufsize, uint8_t* ep_buf, uint16_t ep_bufsize);
+
+// Open an stream for an endpoint
+// hwid is either device address (host mode) or rhport (device mode)
+TU_ATTR_ALWAYS_INLINE static inline
+void tu_edpt_stream_open(tu_edpt_stream_t* s, uint8_t hwid, tusb_desc_endpoint_t const *desc_ep)
+{
+ tu_fifo_clear(&s->ff);
+ s->hwid = hwid;
+ s->ep_addr = desc_ep->bEndpointAddress;
+ s->ep_packetsize = tu_edpt_packet_size(desc_ep);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline
+void tu_edpt_stream_close(tu_edpt_stream_t* s)
+{
+ s->hwid = 0;
+ s->ep_addr = 0;
+}
+
+// Clear fifo
+TU_ATTR_ALWAYS_INLINE static inline
+bool tu_edpt_stream_clear(tu_edpt_stream_t* s)
+{
+ return tu_fifo_clear(&s->ff);
+}
+
+//--------------------------------------------------------------------+
+// Stream Write
+//--------------------------------------------------------------------+
+
+// Write to stream
+uint32_t tu_edpt_stream_write(tu_edpt_stream_t* s, void const *buffer, uint32_t bufsize);
+
+// Start an usb transfer if endpoint is not busy
+uint32_t tu_edpt_stream_write_xfer(tu_edpt_stream_t* s);
+
+// Start an zero-length packet if needed
+bool tu_edpt_stream_write_zlp_if_needed(tu_edpt_stream_t* s, uint32_t last_xferred_bytes);
+
+// Get the number of bytes available for writing
+TU_ATTR_ALWAYS_INLINE static inline
+uint32_t tu_edpt_stream_write_available(tu_edpt_stream_t* s)
+{
+ return (uint32_t) tu_fifo_remaining(&s->ff);
+}
+
+//--------------------------------------------------------------------+
+// Stream Read
+//--------------------------------------------------------------------+
+
+// Read from stream
+uint32_t tu_edpt_stream_read(tu_edpt_stream_t* s, void* buffer, uint32_t bufsize);
+
+// Start an usb transfer if endpoint is not busy
+uint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t* s);
+
+// Must be called in the transfer complete callback
+TU_ATTR_ALWAYS_INLINE static inline
+void tu_edpt_stream_read_xfer_complete(tu_edpt_stream_t* s, uint32_t xferred_bytes)
+{
+ tu_fifo_write_n(&s->ff, s->ep_buf, (uint16_t) xferred_bytes);
+}
+
+// Get the number of bytes available for reading
+TU_ATTR_ALWAYS_INLINE static inline
+uint32_t tu_edpt_stream_read_available(tu_edpt_stream_t* s)
+{
+ return (uint32_t) tu_fifo_count(&s->ff);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline
+bool tu_edpt_stream_peek(tu_edpt_stream_t* s, uint8_t* ch)
+{
+ return tu_fifo_peek(&s->ff, ch);
+}
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_PRIVATE_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_timeout.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_timeout.h
new file mode 100644
index 000000000..ce53955f0
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_timeout.h
@@ -0,0 +1,80 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/** \ingroup Group_Common Common Files
+ * \defgroup Group_TimeoutTimer timeout timer
+ * @{ */
+
+#ifndef _TUSB_TIMEOUT_H_
+#define _TUSB_TIMEOUT_H_
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ uint32_t start;
+ uint32_t interval;
+}tu_timeout_t;
+
+#if 0
+
+extern uint32_t tusb_hal_millis(void);
+
+static inline void tu_timeout_set(tu_timeout_t* tt, uint32_t msec)
+{
+ tt->interval = msec;
+ tt->start = tusb_hal_millis();
+}
+
+static inline bool tu_timeout_expired(tu_timeout_t* tt)
+{
+ return ( tusb_hal_millis() - tt->start ) >= tt->interval;
+}
+
+// For used with periodic event to prevent drift
+static inline void tu_timeout_reset(tu_timeout_t* tt)
+{
+ tt->start += tt->interval;
+}
+
+static inline void tu_timeout_restart(tu_timeout_t* tt)
+{
+ tt->start = tusb_hal_millis();
+}
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_TIMEOUT_H_ */
+
+/** @} */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_types.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_types.h
new file mode 100644
index 000000000..82798a484
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_types.h
@@ -0,0 +1,581 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/** \ingroup group_usb_definitions
+ * \defgroup USBDef_Type USB Types
+ * @{ */
+
+#ifndef _TUSB_TYPES_H_
+#define _TUSB_TYPES_H_
+
+#include
+#include
+#include "tusb_compiler.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*------------------------------------------------------------------*/
+/* CONSTANTS
+ *------------------------------------------------------------------*/
+
+/// defined base on EHCI specs value for Endpoint Speed
+typedef enum
+{
+ TUSB_SPEED_FULL = 0,
+ TUSB_SPEED_LOW = 1,
+ TUSB_SPEED_HIGH = 2,
+ TUSB_SPEED_INVALID = 0xff,
+}tusb_speed_t;
+
+/// defined base on USB Specs Endpoint's bmAttributes
+typedef enum
+{
+ TUSB_XFER_CONTROL = 0 ,
+ TUSB_XFER_ISOCHRONOUS ,
+ TUSB_XFER_BULK ,
+ TUSB_XFER_INTERRUPT
+}tusb_xfer_type_t;
+
+typedef enum
+{
+ TUSB_DIR_OUT = 0,
+ TUSB_DIR_IN = 1,
+
+ TUSB_DIR_IN_MASK = 0x80
+}tusb_dir_t;
+
+enum
+{
+ TUSB_EPSIZE_BULK_FS = 64,
+ TUSB_EPSIZE_BULK_HS= 512,
+
+ TUSB_EPSIZE_ISO_FS_MAX = 1023,
+ TUSB_EPSIZE_ISO_HS_MAX = 1024,
+};
+
+/// Isochronous End Point Attributes
+typedef enum
+{
+ TUSB_ISO_EP_ATT_NO_SYNC = 0x00,
+ TUSB_ISO_EP_ATT_ASYNCHRONOUS = 0x04,
+ TUSB_ISO_EP_ATT_ADAPTIVE = 0x08,
+ TUSB_ISO_EP_ATT_SYNCHRONOUS = 0x0C,
+ TUSB_ISO_EP_ATT_DATA = 0x00, ///< Data End Point
+ TUSB_ISO_EP_ATT_EXPLICIT_FB = 0x10, ///< Feedback End Point
+ TUSB_ISO_EP_ATT_IMPLICIT_FB = 0x20, ///< Data endpoint that also serves as an implicit feedback
+}tusb_iso_ep_attribute_t;
+
+/// USB Descriptor Types
+typedef enum
+{
+ TUSB_DESC_DEVICE = 0x01,
+ TUSB_DESC_CONFIGURATION = 0x02,
+ TUSB_DESC_STRING = 0x03,
+ TUSB_DESC_INTERFACE = 0x04,
+ TUSB_DESC_ENDPOINT = 0x05,
+ TUSB_DESC_DEVICE_QUALIFIER = 0x06,
+ TUSB_DESC_OTHER_SPEED_CONFIG = 0x07,
+ TUSB_DESC_INTERFACE_POWER = 0x08,
+ TUSB_DESC_OTG = 0x09,
+ TUSB_DESC_DEBUG = 0x0A,
+ TUSB_DESC_INTERFACE_ASSOCIATION = 0x0B,
+
+ TUSB_DESC_BOS = 0x0F,
+ TUSB_DESC_DEVICE_CAPABILITY = 0x10,
+
+ TUSB_DESC_FUNCTIONAL = 0x21,
+
+ // Class Specific Descriptor
+ TUSB_DESC_CS_DEVICE = 0x21,
+ TUSB_DESC_CS_CONFIGURATION = 0x22,
+ TUSB_DESC_CS_STRING = 0x23,
+ TUSB_DESC_CS_INTERFACE = 0x24,
+ TUSB_DESC_CS_ENDPOINT = 0x25,
+
+ TUSB_DESC_SUPERSPEED_ENDPOINT_COMPANION = 0x30,
+ TUSB_DESC_SUPERSPEED_ISO_ENDPOINT_COMPANION = 0x31
+}tusb_desc_type_t;
+
+typedef enum
+{
+ TUSB_REQ_GET_STATUS = 0 ,
+ TUSB_REQ_CLEAR_FEATURE = 1 ,
+ TUSB_REQ_RESERVED = 2 ,
+ TUSB_REQ_SET_FEATURE = 3 ,
+ TUSB_REQ_RESERVED2 = 4 ,
+ TUSB_REQ_SET_ADDRESS = 5 ,
+ TUSB_REQ_GET_DESCRIPTOR = 6 ,
+ TUSB_REQ_SET_DESCRIPTOR = 7 ,
+ TUSB_REQ_GET_CONFIGURATION = 8 ,
+ TUSB_REQ_SET_CONFIGURATION = 9 ,
+ TUSB_REQ_GET_INTERFACE = 10 ,
+ TUSB_REQ_SET_INTERFACE = 11 ,
+ TUSB_REQ_SYNCH_FRAME = 12
+}tusb_request_code_t;
+
+typedef enum
+{
+ TUSB_REQ_FEATURE_EDPT_HALT = 0,
+ TUSB_REQ_FEATURE_REMOTE_WAKEUP = 1,
+ TUSB_REQ_FEATURE_TEST_MODE = 2
+}tusb_request_feature_selector_t;
+
+typedef enum
+{
+ TUSB_REQ_TYPE_STANDARD = 0,
+ TUSB_REQ_TYPE_CLASS,
+ TUSB_REQ_TYPE_VENDOR,
+ TUSB_REQ_TYPE_INVALID
+} tusb_request_type_t;
+
+typedef enum
+{
+ TUSB_REQ_RCPT_DEVICE =0,
+ TUSB_REQ_RCPT_INTERFACE,
+ TUSB_REQ_RCPT_ENDPOINT,
+ TUSB_REQ_RCPT_OTHER
+} tusb_request_recipient_t;
+
+// https://www.usb.org/defined-class-codes
+typedef enum
+{
+ TUSB_CLASS_UNSPECIFIED = 0 ,
+ TUSB_CLASS_AUDIO = 1 ,
+ TUSB_CLASS_CDC = 2 ,
+ TUSB_CLASS_HID = 3 ,
+ TUSB_CLASS_RESERVED_4 = 4 ,
+ TUSB_CLASS_PHYSICAL = 5 ,
+ TUSB_CLASS_IMAGE = 6 ,
+ TUSB_CLASS_PRINTER = 7 ,
+ TUSB_CLASS_MSC = 8 ,
+ TUSB_CLASS_HUB = 9 ,
+ TUSB_CLASS_CDC_DATA = 10 ,
+ TUSB_CLASS_SMART_CARD = 11 ,
+ TUSB_CLASS_RESERVED_12 = 12 ,
+ TUSB_CLASS_CONTENT_SECURITY = 13 ,
+ TUSB_CLASS_VIDEO = 14 ,
+ TUSB_CLASS_PERSONAL_HEALTHCARE = 15 ,
+ TUSB_CLASS_AUDIO_VIDEO = 16 ,
+
+ TUSB_CLASS_DIAGNOSTIC = 0xDC ,
+ TUSB_CLASS_WIRELESS_CONTROLLER = 0xE0 ,
+ TUSB_CLASS_MISC = 0xEF ,
+ TUSB_CLASS_APPLICATION_SPECIFIC = 0xFE ,
+ TUSB_CLASS_VENDOR_SPECIFIC = 0xFF
+}tusb_class_code_t;
+
+typedef enum
+{
+ MISC_SUBCLASS_COMMON = 2
+}misc_subclass_type_t;
+
+typedef enum
+{
+ MISC_PROTOCOL_IAD = 1
+}misc_protocol_type_t;
+
+typedef enum
+{
+ APP_SUBCLASS_USBTMC = 0x03,
+ APP_SUBCLASS_DFU_RUNTIME = 0x01
+} app_subclass_type_t;
+
+typedef enum
+{
+ DEVICE_CAPABILITY_WIRELESS_USB = 0x01,
+ DEVICE_CAPABILITY_USB20_EXTENSION = 0x02,
+ DEVICE_CAPABILITY_SUPERSPEED_USB = 0x03,
+ DEVICE_CAPABILITY_CONTAINER_id = 0x04,
+ DEVICE_CAPABILITY_PLATFORM = 0x05,
+ DEVICE_CAPABILITY_POWER_DELIVERY = 0x06,
+ DEVICE_CAPABILITY_BATTERY_INFO = 0x07,
+ DEVICE_CAPABILITY_PD_CONSUMER_PORT = 0x08,
+ DEVICE_CAPABILITY_PD_PROVIDER_PORT = 0x09,
+ DEVICE_CAPABILITY_SUPERSPEED_PLUS = 0x0A,
+ DEVICE_CAPABILITY_PRECESION_TIME_MEASUREMENT = 0x0B,
+ DEVICE_CAPABILITY_WIRELESS_USB_EXT = 0x0C,
+ DEVICE_CAPABILITY_BILLBOARD = 0x0D,
+ DEVICE_CAPABILITY_AUTHENTICATION = 0x0E,
+ DEVICE_CAPABILITY_BILLBOARD_EX = 0x0F,
+ DEVICE_CAPABILITY_CONFIGURATION_SUMMARY = 0x10
+}device_capability_type_t;
+
+enum {
+ TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP = TU_BIT(5),
+ TUSB_DESC_CONFIG_ATT_SELF_POWERED = TU_BIT(6),
+};
+
+#define TUSB_DESC_CONFIG_POWER_MA(x) ((x)/2)
+
+typedef enum
+{
+ XFER_RESULT_SUCCESS = 0,
+ XFER_RESULT_FAILED,
+ XFER_RESULT_STALLED,
+ XFER_RESULT_TIMEOUT,
+ XFER_RESULT_INVALID
+}xfer_result_t;
+
+enum // TODO remove
+{
+ DESC_OFFSET_LEN = 0,
+ DESC_OFFSET_TYPE = 1
+};
+
+enum
+{
+ INTERFACE_INVALID_NUMBER = 0xff
+};
+
+typedef enum
+{
+ MS_OS_20_SET_HEADER_DESCRIPTOR = 0x00,
+ MS_OS_20_SUBSET_HEADER_CONFIGURATION = 0x01,
+ MS_OS_20_SUBSET_HEADER_FUNCTION = 0x02,
+ MS_OS_20_FEATURE_COMPATBLE_ID = 0x03,
+ MS_OS_20_FEATURE_REG_PROPERTY = 0x04,
+ MS_OS_20_FEATURE_MIN_RESUME_TIME = 0x05,
+ MS_OS_20_FEATURE_MODEL_ID = 0x06,
+ MS_OS_20_FEATURE_CCGP_DEVICE = 0x07,
+ MS_OS_20_FEATURE_VENDOR_REVISION = 0x08
+} microsoft_os_20_type_t;
+
+enum
+{
+ CONTROL_STAGE_IDLE,
+ CONTROL_STAGE_SETUP,
+ CONTROL_STAGE_DATA,
+ CONTROL_STAGE_ACK
+};
+
+enum
+{
+ TUSB_INDEX_INVALID = 0xff
+};
+
+//--------------------------------------------------------------------+
+// USB Descriptors
+//--------------------------------------------------------------------+
+
+// Start of all packed definitions for compiler without per-type packed
+TU_ATTR_PACKED_BEGIN
+TU_ATTR_BIT_FIELD_ORDER_BEGIN
+
+/// USB Device Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes.
+ uint8_t bDescriptorType ; ///< DEVICE Descriptor Type.
+ uint16_t bcdUSB ; ///< BUSB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H). This field identifies the release of the USB Specification with which the device and its descriptors are compliant.
+
+ uint8_t bDeviceClass ; ///< Class code (assigned by the USB-IF). \li If this field is reset to zero, each interface within a configuration specifies its own class information and the various interfaces operate independently. \li If this field is set to a value between 1 and FEH, the device supports different class specifications on different interfaces and the interfaces may not operate independently. This value identifies the class definition used for the aggregate interfaces. \li If this field is set to FFH, the device class is vendor-specific.
+ uint8_t bDeviceSubClass ; ///< Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bDeviceClass field. \li If the bDeviceClass field is reset to zero, this field must also be reset to zero. \li If the bDeviceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.
+ uint8_t bDeviceProtocol ; ///< Protocol code (assigned by the USB-IF). These codes are qualified by the value of the bDeviceClass and the bDeviceSubClass fields. If a device supports class-specific protocols on a device basis as opposed to an interface basis, this code identifies the protocols that the device uses as defined by the specification of the device class. \li If this field is reset to zero, the device does not use class-specific protocols on a device basis. However, it may use classspecific protocols on an interface basis. \li If this field is set to FFH, the device uses a vendor-specific protocol on a device basis.
+ uint8_t bMaxPacketSize0 ; ///< Maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid). For HS devices is fixed to 64.
+
+ uint16_t idVendor ; ///< Vendor ID (assigned by the USB-IF).
+ uint16_t idProduct ; ///< Product ID (assigned by the manufacturer).
+ uint16_t bcdDevice ; ///< Device release number in binary-coded decimal.
+ uint8_t iManufacturer ; ///< Index of string descriptor describing manufacturer.
+ uint8_t iProduct ; ///< Index of string descriptor describing product.
+ uint8_t iSerialNumber ; ///< Index of string descriptor describing the device's serial number.
+
+ uint8_t bNumConfigurations ; ///< Number of possible configurations.
+} tusb_desc_device_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_device_t) == 18, "size is not correct");
+
+// USB Binary Device Object Store (BOS) Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes
+ uint8_t bDescriptorType ; ///< CONFIGURATION Descriptor Type
+ uint16_t wTotalLength ; ///< Total length of data returned for this descriptor
+ uint8_t bNumDeviceCaps ; ///< Number of device capability descriptors in the BOS
+} tusb_desc_bos_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_bos_t) == 5, "size is not correct");
+
+/// USB Configuration Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes
+ uint8_t bDescriptorType ; ///< CONFIGURATION Descriptor Type
+ uint16_t wTotalLength ; ///< Total length of data returned for this configuration. Includes the combined length of all descriptors (configuration, interface, endpoint, and class- or vendor-specific) returned for this configuration.
+
+ uint8_t bNumInterfaces ; ///< Number of interfaces supported by this configuration
+ uint8_t bConfigurationValue ; ///< Value to use as an argument to the SetConfiguration() request to select this configuration.
+ uint8_t iConfiguration ; ///< Index of string descriptor describing this configuration
+ uint8_t bmAttributes ; ///< Configuration characteristics \n D7: Reserved (set to one)\n D6: Self-powered \n D5: Remote Wakeup \n D4...0: Reserved (reset to zero) \n D7 is reserved and must be set to one for historical reasons. \n A device configuration that uses power from the bus and a local source reports a non-zero value in bMaxPower to indicate the amount of bus power required and sets D6. The actual power source at runtime may be determined using the GetStatus(DEVICE) request (see USB 2.0 spec Section 9.4.5). \n If a device configuration supports remote wakeup, D5 is set to one.
+ uint8_t bMaxPower ; ///< Maximum power consumption of the USB device from the bus in this specific configuration when the device is fully operational. Expressed in 2 mA units (i.e., 50 = 100 mA).
+} tusb_desc_configuration_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_configuration_t) == 9, "size is not correct");
+
+/// USB Interface Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes
+ uint8_t bDescriptorType ; ///< INTERFACE Descriptor Type
+
+ uint8_t bInterfaceNumber ; ///< Number of this interface. Zero-based value identifying the index in the array of concurrent interfaces supported by this configuration.
+ uint8_t bAlternateSetting ; ///< Value used to select this alternate setting for the interface identified in the prior field
+ uint8_t bNumEndpoints ; ///< Number of endpoints used by this interface (excluding endpoint zero). If this value is zero, this interface only uses the Default Control Pipe.
+ uint8_t bInterfaceClass ; ///< Class code (assigned by the USB-IF). \li A value of zero is reserved for future standardization. \li If this field is set to FFH, the interface class is vendor-specific. \li All other values are reserved for assignment by the USB-IF.
+ uint8_t bInterfaceSubClass ; ///< Subclass code (assigned by the USB-IF). \n These codes are qualified by the value of the bInterfaceClass field. \li If the bInterfaceClass field is reset to zero, this field must also be reset to zero. \li If the bInterfaceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.
+ uint8_t bInterfaceProtocol ; ///< Protocol code (assigned by the USB). \n These codes are qualified by the value of the bInterfaceClass and the bInterfaceSubClass fields. If an interface supports class-specific requests, this code identifies the protocols that the device uses as defined by the specification of the device class. \li If this field is reset to zero, the device does not use a class-specific protocol on this interface. \li If this field is set to FFH, the device uses a vendor-specific protocol for this interface.
+ uint8_t iInterface ; ///< Index of string descriptor describing this interface
+} tusb_desc_interface_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_interface_t) == 9, "size is not correct");
+
+/// USB Endpoint Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; // Size of this descriptor in bytes
+ uint8_t bDescriptorType ; // ENDPOINT Descriptor Type
+
+ uint8_t bEndpointAddress ; // The address of the endpoint
+
+ struct TU_ATTR_PACKED {
+ uint8_t xfer : 2; // Control, ISO, Bulk, Interrupt
+ uint8_t sync : 2; // None, Asynchronous, Adaptive, Synchronous
+ uint8_t usage : 2; // Data, Feedback, Implicit feedback
+ uint8_t : 2;
+ } bmAttributes;
+
+ uint16_t wMaxPacketSize ; // Bit 10..0 : max packet size, bit 12..11 additional transaction per highspeed micro-frame
+ uint8_t bInterval ; // Polling interval, in frames or microframes depending on the operating speed
+} tusb_desc_endpoint_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_endpoint_t) == 7, "size is not correct");
+
+/// USB Other Speed Configuration Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of descriptor
+ uint8_t bDescriptorType ; ///< Other_speed_Configuration Type
+ uint16_t wTotalLength ; ///< Total length of data returned
+
+ uint8_t bNumInterfaces ; ///< Number of interfaces supported by this speed configuration
+ uint8_t bConfigurationValue ; ///< Value to use to select configuration
+ uint8_t iConfiguration ; ///< Index of string descriptor
+ uint8_t bmAttributes ; ///< Same as Configuration descriptor
+ uint8_t bMaxPower ; ///< Same as Configuration descriptor
+} tusb_desc_other_speed_t;
+
+/// USB Device Qualifier Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of descriptor
+ uint8_t bDescriptorType ; ///< Device Qualifier Type
+ uint16_t bcdUSB ; ///< USB specification version number (e.g., 0200H for V2.00)
+
+ uint8_t bDeviceClass ; ///< Class Code
+ uint8_t bDeviceSubClass ; ///< SubClass Code
+ uint8_t bDeviceProtocol ; ///< Protocol Code
+
+ uint8_t bMaxPacketSize0 ; ///< Maximum packet size for other speed
+ uint8_t bNumConfigurations ; ///< Number of Other-speed Configurations
+ uint8_t bReserved ; ///< Reserved for future use, must be zero
+} tusb_desc_device_qualifier_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_desc_device_qualifier_t) == 10, "size is not correct");
+
+/// USB Interface Association Descriptor (IAD ECN)
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of descriptor
+ uint8_t bDescriptorType ; ///< Other_speed_Configuration Type
+
+ uint8_t bFirstInterface ; ///< Index of the first associated interface.
+ uint8_t bInterfaceCount ; ///< Total number of associated interfaces.
+
+ uint8_t bFunctionClass ; ///< Interface class ID.
+ uint8_t bFunctionSubClass ; ///< Interface subclass ID.
+ uint8_t bFunctionProtocol ; ///< Interface protocol ID.
+
+ uint8_t iFunction ; ///< Index of the string descriptor describing the interface association.
+} tusb_desc_interface_assoc_t;
+
+// USB String Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength ; ///< Size of this descriptor in bytes
+ uint8_t bDescriptorType ; ///< Descriptor Type
+ uint16_t unicode_string[];
+} tusb_desc_string_t;
+
+// USB Binary Device Object Store (BOS)
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength;
+ uint8_t bDescriptorType ;
+ uint8_t bDevCapabilityType;
+ uint8_t bReserved;
+ uint8_t PlatformCapabilityUUID[16];
+ uint8_t CapabilityData[];
+} tusb_desc_bos_platform_t;
+
+// USB WebuSB URL Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bScheme;
+ char url[];
+} tusb_desc_webusb_url_t;
+
+// DFU Functional Descriptor
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+
+ union {
+ struct TU_ATTR_PACKED {
+ uint8_t bitCanDnload : 1;
+ uint8_t bitCanUpload : 1;
+ uint8_t bitManifestationTolerant : 1;
+ uint8_t bitWillDetach : 1;
+ uint8_t reserved : 4;
+ } bmAttributes;
+
+ uint8_t bAttributes;
+ };
+
+ uint16_t wDetachTimeOut;
+ uint16_t wTransferSize;
+ uint16_t bcdDFUVersion;
+} tusb_desc_dfu_functional_t;
+
+/*------------------------------------------------------------------*/
+/* Types
+ *------------------------------------------------------------------*/
+typedef struct TU_ATTR_PACKED{
+ union {
+ struct TU_ATTR_PACKED {
+ uint8_t recipient : 5; ///< Recipient type tusb_request_recipient_t.
+ uint8_t type : 2; ///< Request type tusb_request_type_t.
+ uint8_t direction : 1; ///< Direction type. tusb_dir_t
+ } bmRequestType_bit;
+
+ uint8_t bmRequestType;
+ };
+
+ uint8_t bRequest;
+ uint16_t wValue;
+ uint16_t wIndex;
+ uint16_t wLength;
+} tusb_control_request_t;
+
+TU_VERIFY_STATIC( sizeof(tusb_control_request_t) == 8, "size is not correct");
+
+
+TU_ATTR_PACKED_END // End of all packed definitions
+TU_ATTR_BIT_FIELD_ORDER_END
+
+//--------------------------------------------------------------------+
+// Endpoint helper
+//--------------------------------------------------------------------+
+
+// Get direction from Endpoint address
+TU_ATTR_ALWAYS_INLINE static inline tusb_dir_t tu_edpt_dir(uint8_t addr)
+{
+ return (addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;
+}
+
+// Get Endpoint number from address
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_edpt_number(uint8_t addr)
+{
+ return (uint8_t)(addr & (~TUSB_DIR_IN_MASK));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)
+{
+ return (uint8_t)(num | (dir ? TUSB_DIR_IN_MASK : 0));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const* desc_ep)
+{
+ return tu_le16toh(desc_ep->wMaxPacketSize) & TU_GENMASK(10, 0);
+}
+
+#if CFG_TUSB_DEBUG
+TU_ATTR_ALWAYS_INLINE static inline const char *tu_edpt_dir_str(tusb_dir_t dir)
+{
+ static const char *str[] = {"out", "in"};
+ return str[dir];
+}
+
+TU_ATTR_ALWAYS_INLINE static inline const char *tu_edpt_type_str(tusb_xfer_type_t t)
+{
+ static const char *str[] = {"control", "isochronous", "bulk", "interrupt"};
+ return str[t];
+}
+#endif
+
+//--------------------------------------------------------------------+
+// Descriptor helper
+//--------------------------------------------------------------------+
+
+// return next descriptor
+TU_ATTR_ALWAYS_INLINE static inline uint8_t const * tu_desc_next(void const* desc)
+{
+ uint8_t const* desc8 = (uint8_t const*) desc;
+ return desc8 + desc8[DESC_OFFSET_LEN];
+}
+
+// get descriptor type
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_type(void const* desc)
+{
+ return ((uint8_t const*) desc)[DESC_OFFSET_TYPE];
+}
+
+// get descriptor length
+TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_len(void const* desc)
+{
+ return ((uint8_t const*) desc)[DESC_OFFSET_LEN];
+}
+
+// find descriptor that match byte1 (type)
+uint8_t const * tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1);
+
+// find descriptor that match byte1 (type) and byte2
+uint8_t const * tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2);
+
+// find descriptor that match byte1 (type) and byte2
+uint8_t const * tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_TYPES_H_ */
+
+/** @} */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_verify.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_verify.h
new file mode 100644
index 000000000..a52a6d269
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/common/tusb_verify.h
@@ -0,0 +1,156 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef TUSB_VERIFY_H_
+#define TUSB_VERIFY_H_
+
+#include
+#include
+#include "tusb_option.h"
+#include "tusb_compiler.h"
+
+/*------------------------------------------------------------------*/
+/* This file use an advanced macro technique to mimic the default parameter
+ * as C++ for the sake of code simplicity. Beware of a headache macro
+ * manipulation that you are told to stay away.
+ *
+ * This contains macros for both VERIFY and ASSERT:
+ *
+ * VERIFY: Used when there is an error condition which is not the
+ * fault of the MCU. For example, bounds checking on data
+ * sent to the micro over USB should use this function.
+ * Another example is checking for buffer overflows, where
+ * returning from the active function causes a NAK.
+ *
+ * ASSERT: Used for error conditions that are caused by MCU firmware
+ * bugs. This is used to discover bugs in the code more
+ * quickly. One example would be adding assertions in library
+ * function calls to confirm a function's (untainted)
+ * parameters are valid.
+ *
+ * The difference in behavior is that ASSERT triggers a breakpoint while
+ * verify does not.
+ *
+ * #define TU_VERIFY(cond) if(cond) return false;
+ * #define TU_VERIFY(cond,ret) if(cond) return ret;
+ *
+ * #define TU_VERIFY_HDLR(cond,handler) if(cond) {handler; return false;}
+ * #define TU_VERIFY_HDLR(cond,ret,handler) if(cond) {handler; return ret;}
+ *
+ * #define TU_ASSERT(cond) if(cond) {_MESS_FAILED(); TU_BREAKPOINT(), return false;}
+ * #define TU_ASSERT(cond,ret) if(cond) {_MESS_FAILED(); TU_BREAKPOINT(), return ret;}
+ *
+ *------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// TU_VERIFY Helper
+//--------------------------------------------------------------------+
+
+#if CFG_TUSB_DEBUG
+ #include
+ #define _MESS_FAILED() tu_printf("%s %d: ASSERT FAILED\r\n", __func__, __LINE__)
+#else
+ #define _MESS_FAILED() do {} while (0)
+#endif
+
+// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7, M33
+#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)
+ #define TU_BREAKPOINT() do \
+ { \
+ volatile uint32_t* ARM_CM_DHCSR = ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \
+ if ( (*ARM_CM_DHCSR) & 1UL ) __asm("BKPT #0\n"); /* Only halt mcu if debugger is attached */ \
+ } while(0)
+
+#elif defined(__riscv)
+ #define TU_BREAKPOINT() do { __asm("ebreak\n"); } while(0)
+
+#elif defined(_mips)
+ #define TU_BREAKPOINT() do { __asm("sdbbp 0"); } while (0)
+
+#else
+ #define TU_BREAKPOINT() do {} while (0)
+#endif
+
+/*------------------------------------------------------------------*/
+/* Macro Generator
+ *------------------------------------------------------------------*/
+
+// Helper to implement optional parameter for TU_VERIFY Macro family
+#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
+#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
+
+/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
+#define TU_VERIFY_DEFINE(_cond, _handler, _ret) do \
+{ \
+ if ( !(_cond) ) { _handler; return _ret; } \
+} while(0)
+
+/*------------------------------------------------------------------*/
+/* TU_VERIFY
+ * - TU_VERIFY_1ARGS : return false if failed
+ * - TU_VERIFY_2ARGS : return provided value if failed
+ *------------------------------------------------------------------*/
+#define TU_VERIFY_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
+#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)
+
+#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
+
+
+/*------------------------------------------------------------------*/
+/* TU_VERIFY WITH HANDLER
+ * - TU_VERIFY_HDLR_2ARGS : execute handler, return false if failed
+ * - TU_VERIFY_HDLR_3ARGS : execute handler, return provided error if failed
+ *------------------------------------------------------------------*/
+#define TU_VERIFY_HDLR_2ARGS(_cond, _handler) TU_VERIFY_DEFINE(_cond, _handler, false)
+#define TU_VERIFY_HDLR_3ARGS(_cond, _handler, _ret) TU_VERIFY_DEFINE(_cond, _handler, _ret)
+
+#define TU_VERIFY_HDLR(...) _GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)
+
+/*------------------------------------------------------------------*/
+/* ASSERT
+ * basically TU_VERIFY with TU_BREAKPOINT() as handler
+ * - 1 arg : return false if failed
+ * - 2 arg : return error if failed
+ *------------------------------------------------------------------*/
+#define ASSERT_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), false)
+#define ASSERT_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), _ret)
+
+#ifndef TU_ASSERT
+#define TU_ASSERT(...) _GET_3RD_ARG(__VA_ARGS__, ASSERT_2ARGS, ASSERT_1ARGS,UNUSED)(__VA_ARGS__)
+#endif
+
+/*------------------------------------------------------------------*/
+/* ASSERT HDLR
+ *------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TUSB_VERIFY_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/dcd.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/dcd.h
new file mode 100644
index 000000000..c1780f656
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/dcd.h
@@ -0,0 +1,224 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_DCD_H_
+#define _TUSB_DCD_H_
+
+#include "common/tusb_common.h"
+#include "osal/osal.h"
+#include "common/tusb_fifo.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Configuration
+//--------------------------------------------------------------------+
+
+#ifndef CFG_TUD_ENDPPOINT_MAX
+ #define CFG_TUD_ENDPPOINT_MAX TUP_DCD_ENDPOINT_MAX
+#endif
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF PROTYPES
+//--------------------------------------------------------------------+
+
+typedef enum
+{
+ DCD_EVENT_INVALID = 0,
+ DCD_EVENT_BUS_RESET,
+ DCD_EVENT_UNPLUGGED,
+ DCD_EVENT_SOF,
+ DCD_EVENT_SUSPEND, // TODO LPM Sleep L1 support
+ DCD_EVENT_RESUME,
+
+ DCD_EVENT_SETUP_RECEIVED,
+ DCD_EVENT_XFER_COMPLETE,
+
+ // Not an DCD event, just a convenient way to defer ISR function
+ USBD_EVENT_FUNC_CALL,
+
+ DCD_EVENT_COUNT
+} dcd_eventid_t;
+
+typedef struct TU_ATTR_ALIGNED(4)
+{
+ uint8_t rhport;
+ uint8_t event_id;
+
+ union
+ {
+ // BUS RESET
+ struct {
+ tusb_speed_t speed;
+ } bus_reset;
+
+ // SOF
+ struct {
+ uint32_t frame_count;
+ }sof;
+
+ // SETUP_RECEIVED
+ tusb_control_request_t setup_received;
+
+ // XFER_COMPLETE
+ struct {
+ uint8_t ep_addr;
+ uint8_t result;
+ uint32_t len;
+ }xfer_complete;
+
+ // FUNC_CALL
+ struct {
+ void (*func) (void*);
+ void* param;
+ }func_call;
+ };
+} dcd_event_t;
+
+//TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, "size is not correct");
+
+//--------------------------------------------------------------------+
+// Controller API
+//--------------------------------------------------------------------+
+
+// Initialize controller to device mode
+void dcd_init (uint8_t rhport);
+
+// Interrupt Handler
+void dcd_int_handler(uint8_t rhport);
+
+// Enable device interrupt
+void dcd_int_enable (uint8_t rhport);
+
+// Disable device interrupt
+void dcd_int_disable(uint8_t rhport);
+
+// Receive Set Address request, mcu port must also include status IN response
+void dcd_set_address(uint8_t rhport, uint8_t dev_addr);
+
+// Wake up host
+void dcd_remote_wakeup(uint8_t rhport);
+
+// Connect by enabling internal pull-up resistor on D+/D-
+void dcd_connect(uint8_t rhport) TU_ATTR_WEAK;
+
+// Disconnect by disabling internal pull-up resistor on D+/D-
+void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
+
+// Enable/Disable Start-of-frame interrupt. Default is disabled
+void dcd_sof_enable(uint8_t rhport, bool en);
+
+//--------------------------------------------------------------------+
+// Endpoint API
+//--------------------------------------------------------------------+
+
+// Invoked when a control transfer's status stage is complete.
+// May help DCD to prepare for next control transfer, this API is optional.
+void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request) TU_ATTR_WEAK;
+
+// Configure endpoint's registers according to descriptor
+bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_ep);
+
+// Close all non-control endpoints, cancel all pending transfers if any.
+// Invoked when switching from a non-zero Configuration by SET_CONFIGURE therefore
+// required for multiple configuration support.
+void dcd_edpt_close_all (uint8_t rhport);
+
+// Close an endpoint.
+// Since it is weak, caller must TU_ASSERT this function's existence before calling it.
+void dcd_edpt_close (uint8_t rhport, uint8_t ep_addr) TU_ATTR_WEAK;
+
+// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack
+bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes);
+
+// Submit an transfer using fifo, When complete dcd_event_xfer_complete() is invoked to notify the stack
+// This API is optional, may be useful for register-based for transferring data.
+bool dcd_edpt_xfer_fifo (uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes) TU_ATTR_WEAK;
+
+// Stall endpoint, any queuing transfer should be removed from endpoint
+void dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr);
+
+// clear stall, data toggle is also reset to DATA0
+// This API never calls with control endpoints, since it is auto cleared when receiving setup packet
+void dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr);
+
+//--------------------------------------------------------------------+
+// Event API (implemented by stack)
+//--------------------------------------------------------------------+
+
+// Called by DCD to notify device stack
+extern void dcd_event_handler(dcd_event_t const * event, bool in_isr);
+
+// helper to send bus signal event
+TU_ATTR_ALWAYS_INLINE static inline void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = eid };
+ dcd_event_handler(&event, in_isr);
+}
+
+// helper to send bus reset event
+TU_ATTR_ALWAYS_INLINE static inline void dcd_event_bus_reset (uint8_t rhport, tusb_speed_t speed, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_BUS_RESET };
+ event.bus_reset.speed = speed;
+ dcd_event_handler(&event, in_isr);
+}
+
+// helper to send setup received
+TU_ATTR_ALWAYS_INLINE static inline void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED };
+ memcpy(&event.setup_received, setup, 8);
+
+ dcd_event_handler(&event, in_isr);
+}
+
+// helper to send transfer complete event
+TU_ATTR_ALWAYS_INLINE static inline void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_XFER_COMPLETE };
+
+ event.xfer_complete.ep_addr = ep_addr;
+ event.xfer_complete.len = xferred_bytes;
+ event.xfer_complete.result = result;
+
+ dcd_event_handler(&event, in_isr);
+}
+
+static inline void dcd_event_sof(uint8_t rhport, uint32_t frame_count, bool in_isr)
+{
+ dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SOF };
+ event.sof.frame_count = frame_count;
+ dcd_event_handler(&event, in_isr);
+}
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_DCD_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.c
new file mode 100644
index 000000000..6e0c6710d
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.c
@@ -0,0 +1,1385 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if CFG_TUD_ENABLED
+
+#include "device/dcd.h"
+#include "tusb.h"
+#include "common/tusb_private.h"
+
+#include "device/usbd.h"
+#include "device/usbd_pvt.h"
+
+//--------------------------------------------------------------------+
+// USBD Configuration
+//--------------------------------------------------------------------+
+
+#ifndef CFG_TUD_TASK_QUEUE_SZ
+ #define CFG_TUD_TASK_QUEUE_SZ 16
+#endif
+
+// Debug level of USBD
+#define USBD_DBG 2
+
+//--------------------------------------------------------------------+
+// Device Data
+//--------------------------------------------------------------------+
+
+// Invalid driver ID in itf2drv[] ep2drv[][] mapping
+enum { DRVID_INVALID = 0xFFu };
+
+typedef struct
+{
+ struct TU_ATTR_PACKED
+ {
+ volatile uint8_t connected : 1;
+ volatile uint8_t addressed : 1;
+ volatile uint8_t suspended : 1;
+
+ uint8_t remote_wakeup_en : 1; // enable/disable by host
+ uint8_t remote_wakeup_support : 1; // configuration descriptor's attribute
+ uint8_t self_powered : 1; // configuration descriptor's attribute
+ };
+
+ volatile uint8_t cfg_num; // current active configuration (0x00 is not configured)
+ uint8_t speed;
+
+ uint8_t itf2drv[CFG_TUD_INTERFACE_MAX]; // map interface number to driver (0xff is invalid)
+ uint8_t ep2drv[CFG_TUD_ENDPPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid ), can use only 4-bit each
+
+ tu_edpt_state_t ep_status[CFG_TUD_ENDPPOINT_MAX][2];
+
+}usbd_device_t;
+
+static usbd_device_t _usbd_dev;
+
+//--------------------------------------------------------------------+
+// Class Driver
+//--------------------------------------------------------------------+
+#if CFG_TUSB_DEBUG >= 2
+ #define DRIVER_NAME(_name) .name = _name,
+#else
+ #define DRIVER_NAME(_name)
+#endif
+
+// Built-in class drivers
+static usbd_class_driver_t const _usbd_driver[] =
+{
+ #if CFG_TUD_CDC
+ {
+ DRIVER_NAME("CDC")
+ .init = cdcd_init,
+ .reset = cdcd_reset,
+ .open = cdcd_open,
+ .control_xfer_cb = cdcd_control_xfer_cb,
+ .xfer_cb = cdcd_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_MSC
+ {
+ DRIVER_NAME("MSC")
+ .init = mscd_init,
+ .reset = mscd_reset,
+ .open = mscd_open,
+ .control_xfer_cb = mscd_control_xfer_cb,
+ .xfer_cb = mscd_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_HID
+ {
+ DRIVER_NAME("HID")
+ .init = hidd_init,
+ .reset = hidd_reset,
+ .open = hidd_open,
+ .control_xfer_cb = hidd_control_xfer_cb,
+ .xfer_cb = hidd_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_AUDIO
+ {
+ DRIVER_NAME("AUDIO")
+ .init = audiod_init,
+ .reset = audiod_reset,
+ .open = audiod_open,
+ .control_xfer_cb = audiod_control_xfer_cb,
+ .xfer_cb = audiod_xfer_cb,
+ .sof = audiod_sof_isr
+ },
+ #endif
+
+ #if CFG_TUD_VIDEO
+ {
+ DRIVER_NAME("VIDEO")
+ .init = videod_init,
+ .reset = videod_reset,
+ .open = videod_open,
+ .control_xfer_cb = videod_control_xfer_cb,
+ .xfer_cb = videod_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_MIDI
+ {
+ DRIVER_NAME("MIDI")
+ .init = midid_init,
+ .open = midid_open,
+ .reset = midid_reset,
+ .control_xfer_cb = midid_control_xfer_cb,
+ .xfer_cb = midid_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_VENDOR
+ {
+ DRIVER_NAME("VENDOR")
+ .init = vendord_init,
+ .reset = vendord_reset,
+ .open = vendord_open,
+ .control_xfer_cb = tud_vendor_control_xfer_cb,
+ .xfer_cb = vendord_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_USBTMC
+ {
+ DRIVER_NAME("TMC")
+ .init = usbtmcd_init_cb,
+ .reset = usbtmcd_reset_cb,
+ .open = usbtmcd_open_cb,
+ .control_xfer_cb = usbtmcd_control_xfer_cb,
+ .xfer_cb = usbtmcd_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_DFU_RUNTIME
+ {
+ DRIVER_NAME("DFU-RUNTIME")
+ .init = dfu_rtd_init,
+ .reset = dfu_rtd_reset,
+ .open = dfu_rtd_open,
+ .control_xfer_cb = dfu_rtd_control_xfer_cb,
+ .xfer_cb = NULL,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_DFU
+ {
+ DRIVER_NAME("DFU")
+ .init = dfu_moded_init,
+ .reset = dfu_moded_reset,
+ .open = dfu_moded_open,
+ .control_xfer_cb = dfu_moded_control_xfer_cb,
+ .xfer_cb = NULL,
+ .sof = NULL
+ },
+ #endif
+
+ #if CFG_TUD_ECM_RNDIS || CFG_TUD_NCM
+ {
+ DRIVER_NAME("NET")
+ .init = netd_init,
+ .reset = netd_reset,
+ .open = netd_open,
+ .control_xfer_cb = netd_control_xfer_cb,
+ .xfer_cb = netd_xfer_cb,
+ .sof = NULL,
+ },
+ #endif
+
+ #if CFG_TUD_BTH
+ {
+ DRIVER_NAME("BTH")
+ .init = btd_init,
+ .reset = btd_reset,
+ .open = btd_open,
+ .control_xfer_cb = btd_control_xfer_cb,
+ .xfer_cb = btd_xfer_cb,
+ .sof = NULL
+ },
+ #endif
+};
+
+enum { BUILTIN_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) };
+
+// Additional class drivers implemented by application
+static usbd_class_driver_t const * _app_driver = NULL;
+static uint8_t _app_driver_count = 0;
+
+// virtually joins built-in and application drivers together.
+// Application is positioned first to allow overwriting built-in ones.
+static inline usbd_class_driver_t const * get_driver(uint8_t drvid)
+{
+ // Application drivers
+ if ( usbd_app_driver_get_cb )
+ {
+ if ( drvid < _app_driver_count ) return &_app_driver[drvid];
+ drvid -= _app_driver_count;
+ }
+
+ // Built-in drivers
+ if (drvid < BUILTIN_DRIVER_COUNT) return &_usbd_driver[drvid];
+
+ return NULL;
+}
+
+#define TOTAL_DRIVER_COUNT (_app_driver_count + BUILTIN_DRIVER_COUNT)
+
+//--------------------------------------------------------------------+
+// DCD Event
+//--------------------------------------------------------------------+
+
+enum { RHPORT_INVALID = 0xFFu };
+static uint8_t _usbd_rhport = RHPORT_INVALID;
+
+// Event queue
+// usbd_int_set() is used as mutex in OS NONE config
+OSAL_QUEUE_DEF(usbd_int_set, _usbd_qdef, CFG_TUD_TASK_QUEUE_SZ, dcd_event_t);
+static osal_queue_t _usbd_q;
+
+// Mutex for claiming endpoint
+#if OSAL_MUTEX_REQUIRED
+ static osal_mutex_def_t _ubsd_mutexdef;
+ static osal_mutex_t _usbd_mutex;
+#else
+ #define _usbd_mutex NULL
+#endif
+
+
+//--------------------------------------------------------------------+
+// Prototypes
+//--------------------------------------------------------------------+
+static bool process_control_request(uint8_t rhport, tusb_control_request_t const * p_request);
+static bool process_set_config(uint8_t rhport, uint8_t cfg_num);
+static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const * p_request);
+
+// from usbd_control.c
+void usbd_control_reset(void);
+void usbd_control_set_request(tusb_control_request_t const *request);
+void usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp );
+bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+
+
+//--------------------------------------------------------------------+
+// Debug
+//--------------------------------------------------------------------+
+#if CFG_TUSB_DEBUG >= 2
+static char const* const _usbd_event_str[DCD_EVENT_COUNT] =
+{
+ "Invalid" ,
+ "Bus Reset" ,
+ "Unplugged" ,
+ "SOF" ,
+ "Suspend" ,
+ "Resume" ,
+ "Setup Received" ,
+ "Xfer Complete" ,
+ "Func Call"
+};
+
+// for usbd_control to print the name of control complete driver
+void usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback)
+{
+ for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
+ {
+ usbd_class_driver_t const * driver = get_driver(i);
+ if ( driver && driver->control_xfer_cb == callback )
+ {
+ TU_LOG(USBD_DBG, " %s control complete\r\n", driver->name);
+ return;
+ }
+ }
+}
+
+#endif
+
+//--------------------------------------------------------------------+
+// Application API
+//--------------------------------------------------------------------+
+tusb_speed_t tud_speed_get(void)
+{
+ return (tusb_speed_t) _usbd_dev.speed;
+}
+
+bool tud_connected(void)
+{
+ return _usbd_dev.connected;
+}
+
+bool tud_mounted(void)
+{
+ return _usbd_dev.cfg_num ? true : false;
+}
+
+bool tud_suspended(void)
+{
+ return _usbd_dev.suspended;
+}
+
+bool tud_remote_wakeup(void)
+{
+ // only wake up host if this feature is supported and enabled and we are suspended
+ TU_VERIFY (_usbd_dev.suspended && _usbd_dev.remote_wakeup_support && _usbd_dev.remote_wakeup_en );
+ dcd_remote_wakeup(_usbd_rhport);
+ return true;
+}
+
+bool tud_disconnect(void)
+{
+ TU_VERIFY(dcd_disconnect);
+ dcd_disconnect(_usbd_rhport);
+ return true;
+}
+
+bool tud_connect(void)
+{
+ TU_VERIFY(dcd_connect);
+ dcd_connect(_usbd_rhport);
+ return true;
+}
+
+//--------------------------------------------------------------------+
+// USBD Task
+//--------------------------------------------------------------------+
+bool tud_inited(void)
+{
+ return _usbd_rhport != RHPORT_INVALID;
+}
+
+bool tud_init (uint8_t rhport)
+{
+ // skip if already initialized
+ if ( tud_inited() ) return true;
+
+ TU_LOG(USBD_DBG, "USBD init on controller %u\r\n", rhport);
+ TU_LOG_INT(USBD_DBG, sizeof(usbd_device_t));
+ TU_LOG_INT(USBD_DBG, sizeof(tu_fifo_t));
+ TU_LOG_INT(USBD_DBG, sizeof(tu_edpt_stream_t));
+
+ tu_varclr(&_usbd_dev);
+
+#if OSAL_MUTEX_REQUIRED
+ // Init device mutex
+ _usbd_mutex = osal_mutex_create(&_ubsd_mutexdef);
+ TU_ASSERT(_usbd_mutex);
+#endif
+
+ // Init device queue & task
+ _usbd_q = osal_queue_create(&_usbd_qdef);
+ TU_ASSERT(_usbd_q);
+
+ // Get application driver if available
+ if ( usbd_app_driver_get_cb )
+ {
+ _app_driver = usbd_app_driver_get_cb(&_app_driver_count);
+ }
+
+ // Init class drivers
+ for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
+ {
+ usbd_class_driver_t const * driver = get_driver(i);
+ TU_ASSERT(driver);
+ TU_LOG(USBD_DBG, "%s init\r\n", driver->name);
+ driver->init();
+ }
+
+ _usbd_rhport = rhport;
+
+ // Init device controller driver
+ dcd_init(rhport);
+ dcd_int_enable(rhport);
+
+ return true;
+}
+
+static void configuration_reset(uint8_t rhport)
+{
+ for ( uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++ )
+ {
+ usbd_class_driver_t const * driver = get_driver(i);
+ TU_ASSERT(driver, );
+ driver->reset(rhport);
+ }
+
+ tu_varclr(&_usbd_dev);
+ memset(_usbd_dev.itf2drv, DRVID_INVALID, sizeof(_usbd_dev.itf2drv)); // invalid mapping
+ memset(_usbd_dev.ep2drv , DRVID_INVALID, sizeof(_usbd_dev.ep2drv )); // invalid mapping
+}
+
+static void usbd_reset(uint8_t rhport)
+{
+ configuration_reset(rhport);
+ usbd_control_reset();
+}
+
+bool tud_task_event_ready(void)
+{
+ // Skip if stack is not initialized
+ if ( !tusb_inited() ) return false;
+
+ return !osal_queue_empty(_usbd_q);
+}
+
+/* USB Device Driver task
+ * This top level thread manages all device controller event and delegates events to class-specific drivers.
+ * This should be called periodically within the mainloop or rtos thread.
+ *
+ @code
+ int main(void)
+ {
+ application_init();
+ tusb_init();
+
+ while(1) // the mainloop
+ {
+ application_code();
+ tud_task(); // tinyusb device task
+ }
+ }
+ @endcode
+ */
+void tud_task_ext(uint32_t timeout_ms, bool in_isr)
+{
+ (void) in_isr; // not implemented yet
+
+ // Skip if stack is not initialized
+ if ( !tusb_inited() ) return;
+
+ // Loop until there is no more events in the queue
+ while (1)
+ {
+ dcd_event_t event;
+ if ( !osal_queue_receive(_usbd_q, &event, timeout_ms) ) return;
+
+#if CFG_TUSB_DEBUG >= 2
+ if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG(USBD_DBG, "\r\n"); // extra line for setup
+ TU_LOG(USBD_DBG, "USBD %s ", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : "CORRUPTED");
+#endif
+
+ switch ( event.event_id )
+ {
+ case DCD_EVENT_BUS_RESET:
+ TU_LOG(USBD_DBG, ": %s Speed\r\n", tu_str_speed[event.bus_reset.speed]);
+ usbd_reset(event.rhport);
+ _usbd_dev.speed = event.bus_reset.speed;
+ break;
+
+ case DCD_EVENT_UNPLUGGED:
+ TU_LOG(USBD_DBG, "\r\n");
+ usbd_reset(event.rhport);
+
+ // invoke callback
+ if (tud_umount_cb) tud_umount_cb();
+ break;
+
+ case DCD_EVENT_SETUP_RECEIVED:
+ TU_LOG_PTR(USBD_DBG, &event.setup_received);
+ TU_LOG(USBD_DBG, "\r\n");
+
+ // Mark as connected after receiving 1st setup packet.
+ // But it is easier to set it every time instead of wasting time to check then set
+ _usbd_dev.connected = 1;
+
+ // mark both in & out control as free
+ _usbd_dev.ep_status[0][TUSB_DIR_OUT].busy = false;
+ _usbd_dev.ep_status[0][TUSB_DIR_OUT].claimed = 0;
+ _usbd_dev.ep_status[0][TUSB_DIR_IN ].busy = false;
+ _usbd_dev.ep_status[0][TUSB_DIR_IN ].claimed = 0;
+
+ // Process control request
+ if ( !process_control_request(event.rhport, &event.setup_received) )
+ {
+ TU_LOG(USBD_DBG, " Stall EP0\r\n");
+ // Failed -> stall both control endpoint IN and OUT
+ dcd_edpt_stall(event.rhport, 0);
+ dcd_edpt_stall(event.rhport, 0 | TUSB_DIR_IN_MASK);
+ }
+ break;
+
+ case DCD_EVENT_XFER_COMPLETE:
+ {
+ // Invoke the class callback associated with the endpoint address
+ uint8_t const ep_addr = event.xfer_complete.ep_addr;
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const ep_dir = tu_edpt_dir(ep_addr);
+
+ TU_LOG(USBD_DBG, "on EP %02X with %u bytes\r\n", ep_addr, (unsigned int) event.xfer_complete.len);
+
+ _usbd_dev.ep_status[epnum][ep_dir].busy = false;
+ _usbd_dev.ep_status[epnum][ep_dir].claimed = 0;
+
+ if ( 0 == epnum )
+ {
+ usbd_control_xfer_cb(event.rhport, ep_addr, (xfer_result_t)event.xfer_complete.result, event.xfer_complete.len);
+ }
+ else
+ {
+ usbd_class_driver_t const * driver = get_driver( _usbd_dev.ep2drv[epnum][ep_dir] );
+ TU_ASSERT(driver, );
+
+ TU_LOG(USBD_DBG, " %s xfer callback\r\n", driver->name);
+ driver->xfer_cb(event.rhport, ep_addr, (xfer_result_t)event.xfer_complete.result, event.xfer_complete.len);
+ }
+ }
+ break;
+
+ case DCD_EVENT_SUSPEND:
+ // NOTE: When plugging/unplugging device, the D+/D- state are unstable and
+ // can accidentally meet the SUSPEND condition ( Bus Idle for 3ms ), which result in a series of event
+ // e.g suspend -> resume -> unplug/plug. Skip suspend/resume if not connected
+ if ( _usbd_dev.connected )
+ {
+ TU_LOG(USBD_DBG, ": Remote Wakeup = %u\r\n", _usbd_dev.remote_wakeup_en);
+ if (tud_suspend_cb) tud_suspend_cb(_usbd_dev.remote_wakeup_en);
+ }else
+ {
+ TU_LOG(USBD_DBG, " Skipped\r\n");
+ }
+ break;
+
+ case DCD_EVENT_RESUME:
+ if ( _usbd_dev.connected )
+ {
+ TU_LOG(USBD_DBG, "\r\n");
+ if (tud_resume_cb) tud_resume_cb();
+ }else
+ {
+ TU_LOG(USBD_DBG, " Skipped\r\n");
+ }
+ break;
+
+ case USBD_EVENT_FUNC_CALL:
+ TU_LOG(USBD_DBG, "\r\n");
+ if ( event.func_call.func ) event.func_call.func(event.func_call.param);
+ break;
+
+ case DCD_EVENT_SOF:
+ default:
+ TU_BREAKPOINT();
+ break;
+ }
+
+#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO
+ // return if there is no more events, for application to run other background
+ if (osal_queue_empty(_usbd_q)) return;
+#endif
+ }
+}
+
+//--------------------------------------------------------------------+
+// Control Request Parser & Handling
+//--------------------------------------------------------------------+
+
+// Helper to invoke class driver control request handler
+static bool invoke_class_control(uint8_t rhport, usbd_class_driver_t const * driver, tusb_control_request_t const * request)
+{
+ usbd_control_set_complete_callback(driver->control_xfer_cb);
+ TU_LOG(USBD_DBG, " %s control request\r\n", driver->name);
+ return driver->control_xfer_cb(rhport, CONTROL_STAGE_SETUP, request);
+}
+
+// This handles the actual request and its response.
+// return false will cause its caller to stall control endpoint
+static bool process_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
+{
+ usbd_control_set_complete_callback(NULL);
+
+ TU_ASSERT(p_request->bmRequestType_bit.type < TUSB_REQ_TYPE_INVALID);
+
+ // Vendor request
+ if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR )
+ {
+ TU_VERIFY(tud_vendor_control_xfer_cb);
+
+ usbd_control_set_complete_callback(tud_vendor_control_xfer_cb);
+ return tud_vendor_control_xfer_cb(rhport, CONTROL_STAGE_SETUP, p_request);
+ }
+
+#if CFG_TUSB_DEBUG >= 2
+ if (TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type && p_request->bRequest <= TUSB_REQ_SYNCH_FRAME)
+ {
+ TU_LOG(USBD_DBG, " %s", tu_str_std_request[p_request->bRequest]);
+ if (TUSB_REQ_GET_DESCRIPTOR != p_request->bRequest) TU_LOG(USBD_DBG, "\r\n");
+ }
+#endif
+
+ switch ( p_request->bmRequestType_bit.recipient )
+ {
+ //------------- Device Requests e.g in enumeration -------------//
+ case TUSB_REQ_RCPT_DEVICE:
+ if ( TUSB_REQ_TYPE_CLASS == p_request->bmRequestType_bit.type )
+ {
+ uint8_t const itf = tu_u16_low(p_request->wIndex);
+ TU_VERIFY(itf < TU_ARRAY_SIZE(_usbd_dev.itf2drv));
+
+ usbd_class_driver_t const * driver = get_driver(_usbd_dev.itf2drv[itf]);
+ TU_VERIFY(driver);
+
+ // forward to class driver: "non-STD request to Interface"
+ return invoke_class_control(rhport, driver, p_request);
+ }
+
+ if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type )
+ {
+ // Non standard request is not supported
+ TU_BREAKPOINT();
+ return false;
+ }
+
+ switch ( p_request->bRequest )
+ {
+ case TUSB_REQ_SET_ADDRESS:
+ // Depending on mcu, status phase could be sent either before or after changing device address,
+ // or even require stack to not response with status at all
+ // Therefore DCD must take full responsibility to response and include zlp status packet if needed.
+ usbd_control_set_request(p_request); // set request since DCD has no access to tud_control_status() API
+ dcd_set_address(rhport, (uint8_t) p_request->wValue);
+ // skip tud_control_status()
+ _usbd_dev.addressed = 1;
+ break;
+
+ case TUSB_REQ_GET_CONFIGURATION:
+ {
+ uint8_t cfg_num = _usbd_dev.cfg_num;
+ tud_control_xfer(rhport, p_request, &cfg_num, 1);
+ }
+ break;
+
+ case TUSB_REQ_SET_CONFIGURATION:
+ {
+ uint8_t const cfg_num = (uint8_t) p_request->wValue;
+
+ // Only process if new configure is different
+ if (_usbd_dev.cfg_num != cfg_num)
+ {
+ if ( _usbd_dev.cfg_num )
+ {
+ // already configured: need to clear all endpoints and driver first
+ TU_LOG(USBD_DBG, " Clear current Configuration (%u) before switching\r\n", _usbd_dev.cfg_num);
+
+ // close all non-control endpoints, cancel all pending transfers if any
+ dcd_edpt_close_all(rhport);
+
+ // close all drivers and current configured state except bus speed
+ uint8_t const speed = _usbd_dev.speed;
+ configuration_reset(rhport);
+
+ _usbd_dev.speed = speed; // restore speed
+ }
+
+ // switch to new configuration if not zero
+ if ( cfg_num ) TU_ASSERT( process_set_config(rhport, cfg_num) );
+ }
+
+ _usbd_dev.cfg_num = cfg_num;
+ tud_control_status(rhport, p_request);
+ }
+ break;
+
+ case TUSB_REQ_GET_DESCRIPTOR:
+ TU_VERIFY( process_get_descriptor(rhport, p_request) );
+ break;
+
+ case TUSB_REQ_SET_FEATURE:
+ // Only support remote wakeup for device feature
+ TU_VERIFY(TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue);
+
+ TU_LOG(USBD_DBG, " Enable Remote Wakeup\r\n");
+
+ // Host may enable remote wake up before suspending especially HID device
+ _usbd_dev.remote_wakeup_en = true;
+ tud_control_status(rhport, p_request);
+ break;
+
+ case TUSB_REQ_CLEAR_FEATURE:
+ // Only support remote wakeup for device feature
+ TU_VERIFY(TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue);
+
+ TU_LOG(USBD_DBG, " Disable Remote Wakeup\r\n");
+
+ // Host may disable remote wake up after resuming
+ _usbd_dev.remote_wakeup_en = false;
+ tud_control_status(rhport, p_request);
+ break;
+
+ case TUSB_REQ_GET_STATUS:
+ {
+ // Device status bit mask
+ // - Bit 0: Self Powered
+ // - Bit 1: Remote Wakeup enabled
+ uint16_t status = (uint16_t) ((_usbd_dev.self_powered ? 1u : 0u) | (_usbd_dev.remote_wakeup_en ? 2u : 0u));
+ tud_control_xfer(rhport, p_request, &status, 2);
+ }
+ break;
+
+ // Unknown/Unsupported request
+ default: TU_BREAKPOINT(); return false;
+ }
+ break;
+
+ //------------- Class/Interface Specific Request -------------//
+ case TUSB_REQ_RCPT_INTERFACE:
+ {
+ uint8_t const itf = tu_u16_low(p_request->wIndex);
+ TU_VERIFY(itf < TU_ARRAY_SIZE(_usbd_dev.itf2drv));
+
+ usbd_class_driver_t const * driver = get_driver(_usbd_dev.itf2drv[itf]);
+ TU_VERIFY(driver);
+
+ // all requests to Interface (STD or Class) is forwarded to class driver.
+ // notable requests are: GET HID REPORT DESCRIPTOR, SET_INTERFACE, GET_INTERFACE
+ if ( !invoke_class_control(rhport, driver, p_request) )
+ {
+ // For GET_INTERFACE and SET_INTERFACE, it is mandatory to respond even if the class
+ // driver doesn't use alternate settings or implement this
+ TU_VERIFY(TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type);
+
+ switch(p_request->bRequest)
+ {
+ case TUSB_REQ_GET_INTERFACE:
+ case TUSB_REQ_SET_INTERFACE:
+ // Clear complete callback if driver set since it can also stall the request.
+ usbd_control_set_complete_callback(NULL);
+
+ if (TUSB_REQ_GET_INTERFACE == p_request->bRequest)
+ {
+ uint8_t alternate = 0;
+ tud_control_xfer(rhport, p_request, &alternate, 1);
+ }else
+ {
+ tud_control_status(rhport, p_request);
+ }
+ break;
+
+ default: return false;
+ }
+ }
+ }
+ break;
+
+ //------------- Endpoint Request -------------//
+ case TUSB_REQ_RCPT_ENDPOINT:
+ {
+ uint8_t const ep_addr = tu_u16_low(p_request->wIndex);
+ uint8_t const ep_num = tu_edpt_number(ep_addr);
+ uint8_t const ep_dir = tu_edpt_dir(ep_addr);
+
+ TU_ASSERT(ep_num < TU_ARRAY_SIZE(_usbd_dev.ep2drv) );
+
+ usbd_class_driver_t const * driver = get_driver(_usbd_dev.ep2drv[ep_num][ep_dir]);
+
+ if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type )
+ {
+ // Forward class request to its driver
+ TU_VERIFY(driver);
+ return invoke_class_control(rhport, driver, p_request);
+ }
+ else
+ {
+ // Handle STD request to endpoint
+ switch ( p_request->bRequest )
+ {
+ case TUSB_REQ_GET_STATUS:
+ {
+ uint16_t status = usbd_edpt_stalled(rhport, ep_addr) ? 0x0001 : 0x0000;
+ tud_control_xfer(rhport, p_request, &status, 2);
+ }
+ break;
+
+ case TUSB_REQ_CLEAR_FEATURE:
+ case TUSB_REQ_SET_FEATURE:
+ {
+ if ( TUSB_REQ_FEATURE_EDPT_HALT == p_request->wValue )
+ {
+ if ( TUSB_REQ_CLEAR_FEATURE == p_request->bRequest )
+ {
+ usbd_edpt_clear_stall(rhport, ep_addr);
+ }else
+ {
+ usbd_edpt_stall(rhport, ep_addr);
+ }
+ }
+
+ if (driver)
+ {
+ // Some classes such as USBTMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request
+ // We will also forward std request targeted endpoint to class drivers as well
+
+ // STD request must always be ACKed regardless of driver returned value
+ // Also clear complete callback if driver set since it can also stall the request.
+ (void) invoke_class_control(rhport, driver, p_request);
+ usbd_control_set_complete_callback(NULL);
+
+ // skip ZLP status if driver already did that
+ if ( !_usbd_dev.ep_status[0][TUSB_DIR_IN].busy ) tud_control_status(rhport, p_request);
+ }
+ }
+ break;
+
+ // Unknown/Unsupported request
+ default: TU_BREAKPOINT(); return false;
+ }
+ }
+ }
+ break;
+
+ // Unknown recipient
+ default: TU_BREAKPOINT(); return false;
+ }
+
+ return true;
+}
+
+// Process Set Configure Request
+// This function parse configuration descriptor & open drivers accordingly
+static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
+{
+ // index is cfg_num-1
+ tusb_desc_configuration_t const * desc_cfg = (tusb_desc_configuration_t const *) tud_descriptor_configuration_cb(cfg_num-1);
+ TU_ASSERT(desc_cfg != NULL && desc_cfg->bDescriptorType == TUSB_DESC_CONFIGURATION);
+
+ // Parse configuration descriptor
+ _usbd_dev.remote_wakeup_support = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP) ? 1u : 0u;
+ _usbd_dev.self_powered = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_SELF_POWERED ) ? 1u : 0u;
+
+ // Parse interface descriptor
+ uint8_t const * p_desc = ((uint8_t const*) desc_cfg) + sizeof(tusb_desc_configuration_t);
+ uint8_t const * desc_end = ((uint8_t const*) desc_cfg) + tu_le16toh(desc_cfg->wTotalLength);
+
+ while( p_desc < desc_end )
+ {
+ uint8_t assoc_itf_count = 1;
+
+ // Class will always starts with Interface Association (if any) and then Interface descriptor
+ if ( TUSB_DESC_INTERFACE_ASSOCIATION == tu_desc_type(p_desc) )
+ {
+ tusb_desc_interface_assoc_t const * desc_iad = (tusb_desc_interface_assoc_t const *) p_desc;
+ assoc_itf_count = desc_iad->bInterfaceCount;
+
+ p_desc = tu_desc_next(p_desc); // next to Interface
+
+ // IAD's first interface number and class should match with opened interface
+ //TU_ASSERT(desc_iad->bFirstInterface == desc_itf->bInterfaceNumber &&
+ // desc_iad->bFunctionClass == desc_itf->bInterfaceClass);
+ }
+
+ TU_ASSERT( TUSB_DESC_INTERFACE == tu_desc_type(p_desc) );
+ tusb_desc_interface_t const * desc_itf = (tusb_desc_interface_t const*) p_desc;
+
+ // Find driver for this interface
+ uint16_t const remaining_len = (uint16_t) (desc_end-p_desc);
+ uint8_t drv_id;
+ for (drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++)
+ {
+ usbd_class_driver_t const *driver = get_driver(drv_id);
+ TU_ASSERT(driver);
+ uint16_t const drv_len = driver->open(rhport, desc_itf, remaining_len);
+
+ if ( (sizeof(tusb_desc_interface_t) <= drv_len) && (drv_len <= remaining_len) )
+ {
+ // Open successfully
+ TU_LOG(USBD_DBG, " %s opened\r\n", driver->name);
+
+ // Some drivers use 2 or more interfaces but may not have IAD e.g MIDI (always) or
+ // BTH (even CDC) with class in device descriptor (single interface)
+ if ( assoc_itf_count == 1)
+ {
+ #if CFG_TUD_CDC
+ if ( driver->open == cdcd_open ) assoc_itf_count = 2;
+ #endif
+
+ #if CFG_TUD_MIDI
+ if ( driver->open == midid_open ) assoc_itf_count = 2;
+ #endif
+
+ #if CFG_TUD_BTH && CFG_TUD_BTH_ISO_ALT_COUNT
+ if ( driver->open == btd_open ) assoc_itf_count = 2;
+ #endif
+ }
+
+ // bind (associated) interfaces to found driver
+ for(uint8_t i=0; ibInterfaceNumber+i;
+
+ // Interface number must not be used already
+ TU_ASSERT(DRVID_INVALID == _usbd_dev.itf2drv[itf_num]);
+ _usbd_dev.itf2drv[itf_num] = drv_id;
+ }
+
+ // bind all endpoints to found driver
+ tu_edpt_bind_driver(_usbd_dev.ep2drv, desc_itf, drv_len, drv_id);
+
+ // next Interface
+ p_desc += drv_len;
+
+ break; // exit driver find loop
+ }
+ }
+
+ // Failed if there is no supported drivers
+ TU_ASSERT(drv_id < TOTAL_DRIVER_COUNT);
+ }
+
+ // invoke callback
+ if (tud_mount_cb) tud_mount_cb();
+
+ return true;
+}
+
+// return descriptor's buffer and update desc_len
+static bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const * p_request)
+{
+ tusb_desc_type_t const desc_type = (tusb_desc_type_t) tu_u16_high(p_request->wValue);
+ uint8_t const desc_index = tu_u16_low( p_request->wValue );
+
+ switch(desc_type)
+ {
+ case TUSB_DESC_DEVICE:
+ {
+ TU_LOG(USBD_DBG, " Device\r\n");
+
+ void* desc_device = (void*) (uintptr_t) tud_descriptor_device_cb();
+
+ // Only response with exactly 1 Packet if: not addressed and host requested more data than device descriptor has.
+ // This only happens with the very first get device descriptor and EP0 size = 8 or 16.
+ if ((CFG_TUD_ENDPOINT0_SIZE < sizeof(tusb_desc_device_t)) && !_usbd_dev.addressed &&
+ ((tusb_control_request_t const*) p_request)->wLength > sizeof(tusb_desc_device_t))
+ {
+ // Hack here: we modify the request length to prevent usbd_control response with zlp
+ // since we are responding with 1 packet & less data than wLength.
+ tusb_control_request_t mod_request = *p_request;
+ mod_request.wLength = CFG_TUD_ENDPOINT0_SIZE;
+
+ return tud_control_xfer(rhport, &mod_request, desc_device, CFG_TUD_ENDPOINT0_SIZE);
+ }else
+ {
+ return tud_control_xfer(rhport, p_request, desc_device, sizeof(tusb_desc_device_t));
+ }
+ }
+ // break; // unreachable
+
+ case TUSB_DESC_BOS:
+ {
+ TU_LOG(USBD_DBG, " BOS\r\n");
+
+ // requested by host if USB > 2.0 ( i.e 2.1 or 3.x )
+ if (!tud_descriptor_bos_cb) return false;
+
+ uintptr_t desc_bos = (uintptr_t) tud_descriptor_bos_cb();
+ TU_ASSERT(desc_bos);
+
+ // Use offsetof to avoid pointer to the odd/misaligned address
+ uint16_t const total_len = tu_le16toh( tu_unaligned_read16((const void*) (desc_bos + offsetof(tusb_desc_bos_t, wTotalLength))) );
+
+ return tud_control_xfer(rhport, p_request, (void*) desc_bos, total_len);
+ }
+ // break; // unreachable
+
+ case TUSB_DESC_CONFIGURATION:
+ case TUSB_DESC_OTHER_SPEED_CONFIG:
+ {
+ uintptr_t desc_config;
+
+ if ( desc_type == TUSB_DESC_CONFIGURATION )
+ {
+ TU_LOG(USBD_DBG, " Configuration[%u]\r\n", desc_index);
+ desc_config = (uintptr_t) tud_descriptor_configuration_cb(desc_index);
+ }else
+ {
+ // Host only request this after getting Device Qualifier descriptor
+ TU_LOG(USBD_DBG, " Other Speed Configuration\r\n");
+ TU_VERIFY( tud_descriptor_other_speed_configuration_cb );
+ desc_config = (uintptr_t) tud_descriptor_other_speed_configuration_cb(desc_index);
+ }
+
+ TU_ASSERT(desc_config);
+
+ // Use offsetof to avoid pointer to the odd/misaligned address
+ uint16_t const total_len = tu_le16toh( tu_unaligned_read16((const void*) (desc_config + offsetof(tusb_desc_configuration_t, wTotalLength))) );
+
+ return tud_control_xfer(rhport, p_request, (void*) desc_config, total_len);
+ }
+ // break; // unreachable
+
+ case TUSB_DESC_STRING:
+ {
+ TU_LOG(USBD_DBG, " String[%u]\r\n", desc_index);
+
+ // String Descriptor always uses the desc set from user
+ uint8_t const* desc_str = (uint8_t const*) tud_descriptor_string_cb(desc_index, tu_le16toh(p_request->wIndex));
+ TU_VERIFY(desc_str);
+
+ // first byte of descriptor is its size
+ return tud_control_xfer(rhport, p_request, (void*) (uintptr_t) desc_str, tu_desc_len(desc_str));
+ }
+ // break; // unreachable
+
+ case TUSB_DESC_DEVICE_QUALIFIER:
+ {
+ TU_LOG(USBD_DBG, " Device Qualifier\r\n");
+
+ TU_VERIFY( tud_descriptor_device_qualifier_cb );
+
+ uint8_t const* desc_qualifier = tud_descriptor_device_qualifier_cb();
+ TU_VERIFY(desc_qualifier);
+
+ // first byte of descriptor is its size
+ return tud_control_xfer(rhport, p_request, (void*) (uintptr_t) desc_qualifier, tu_desc_len(desc_qualifier));
+ }
+ // break; // unreachable
+
+ default: return false;
+ }
+}
+
+//--------------------------------------------------------------------+
+// DCD Event Handler
+//--------------------------------------------------------------------+
+TU_ATTR_FAST_FUNC void dcd_event_handler(dcd_event_t const * event, bool in_isr)
+{
+ switch (event->event_id)
+ {
+ case DCD_EVENT_UNPLUGGED:
+ _usbd_dev.connected = 0;
+ _usbd_dev.addressed = 0;
+ _usbd_dev.cfg_num = 0;
+ _usbd_dev.suspended = 0;
+ osal_queue_send(_usbd_q, event, in_isr);
+ break;
+
+ case DCD_EVENT_SUSPEND:
+ // NOTE: When plugging/unplugging device, the D+/D- state are unstable and
+ // can accidentally meet the SUSPEND condition ( Bus Idle for 3ms ).
+ // In addition, some MCUs such as SAMD or boards that haven no VBUS detection cannot distinguish
+ // suspended vs disconnected. We will skip handling SUSPEND/RESUME event if not currently connected
+ if ( _usbd_dev.connected )
+ {
+ _usbd_dev.suspended = 1;
+ osal_queue_send(_usbd_q, event, in_isr);
+ }
+ break;
+
+ case DCD_EVENT_RESUME:
+ // skip event if not connected (especially required for SAMD)
+ if ( _usbd_dev.connected )
+ {
+ _usbd_dev.suspended = 0;
+ osal_queue_send(_usbd_q, event, in_isr);
+ }
+ break;
+
+ case DCD_EVENT_SOF:
+ // SOF driver handler in ISR context
+ for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++)
+ {
+ usbd_class_driver_t const * driver = get_driver(i);
+ if (driver && driver->sof)
+ {
+ driver->sof(event->rhport, event->sof.frame_count);
+ }
+ }
+
+ // Some MCUs after running dcd_remote_wakeup() does not have way to detect the end of remote wakeup
+ // which last 1-15 ms. DCD can use SOF as a clear indicator that bus is back to operational
+ if ( _usbd_dev.suspended )
+ {
+ _usbd_dev.suspended = 0;
+
+ dcd_event_t const event_resume = { .rhport = event->rhport, .event_id = DCD_EVENT_RESUME };
+ osal_queue_send(_usbd_q, &event_resume, in_isr);
+ }
+
+ // skip osal queue for SOF in usbd task
+ break;
+
+ default:
+ osal_queue_send(_usbd_q, event, in_isr);
+ break;
+ }
+}
+
+//--------------------------------------------------------------------+
+// USBD API For Class Driver
+//--------------------------------------------------------------------+
+
+void usbd_int_set(bool enabled)
+{
+ if (enabled)
+ {
+ dcd_int_enable(_usbd_rhport);
+ }else
+ {
+ dcd_int_disable(_usbd_rhport);
+ }
+}
+
+// Parse consecutive endpoint descriptors (IN & OUT)
+bool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in)
+{
+ for(int i=0; ibDescriptorType && xfer_type == desc_ep->bmAttributes.xfer);
+ TU_ASSERT(usbd_edpt_open(rhport, desc_ep));
+
+ if ( tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN )
+ {
+ (*ep_in) = desc_ep->bEndpointAddress;
+ }else
+ {
+ (*ep_out) = desc_ep->bEndpointAddress;
+ }
+
+ p_desc = tu_desc_next(p_desc);
+ }
+
+ return true;
+}
+
+// Helper to defer an isr function
+void usbd_defer_func(osal_task_func_t func, void* param, bool in_isr)
+{
+ dcd_event_t event =
+ {
+ .rhport = 0,
+ .event_id = USBD_EVENT_FUNC_CALL,
+ };
+
+ event.func_call.func = func;
+ event.func_call.param = param;
+
+ dcd_event_handler(&event, in_isr);
+}
+
+//--------------------------------------------------------------------+
+// USBD Endpoint API
+//--------------------------------------------------------------------+
+
+bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep)
+{
+ rhport = _usbd_rhport;
+
+ TU_ASSERT(tu_edpt_number(desc_ep->bEndpointAddress) < CFG_TUD_ENDPPOINT_MAX);
+ TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) _usbd_dev.speed));
+
+ return dcd_edpt_open(rhport, desc_ep);
+}
+
+bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr)
+{
+ (void) rhport;
+
+ // TODO add this check later, also make sure we don't starve an out endpoint while suspending
+ // TU_VERIFY(tud_ready());
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+ tu_edpt_state_t* ep_state = &_usbd_dev.ep_status[epnum][dir];
+
+ return tu_edpt_claim(ep_state, _usbd_mutex);
+}
+
+bool usbd_edpt_release(uint8_t rhport, uint8_t ep_addr)
+{
+ (void) rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+ tu_edpt_state_t* ep_state = &_usbd_dev.ep_status[epnum][dir];
+
+ return tu_edpt_release(ep_state, _usbd_mutex);
+}
+
+bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes)
+{
+ rhport = _usbd_rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ // TODO skip ready() check for now since enumeration also use this API
+ // TU_VERIFY(tud_ready());
+
+ TU_LOG(USBD_DBG, " Queue EP %02X with %u bytes ...\r\n", ep_addr, total_bytes);
+
+ // Attempt to transfer on a busy endpoint, sound like an race condition !
+ TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);
+
+ // Set busy first since the actual transfer can be complete before dcd_edpt_xfer()
+ // could return and USBD task can preempt and clear the busy
+ _usbd_dev.ep_status[epnum][dir].busy = true;
+
+ if ( dcd_edpt_xfer(rhport, ep_addr, buffer, total_bytes) )
+ {
+ return true;
+ }else
+ {
+ // DCD error, mark endpoint as ready to allow next transfer
+ _usbd_dev.ep_status[epnum][dir].busy = false;
+ _usbd_dev.ep_status[epnum][dir].claimed = 0;
+ TU_LOG(USBD_DBG, "FAILED\r\n");
+ TU_BREAKPOINT();
+ return false;
+ }
+}
+
+// The number of bytes has to be given explicitly to allow more flexible control of how many
+// bytes should be written and second to keep the return value free to give back a boolean
+// success message. If total_bytes is too big, the FIFO will copy only what is available
+// into the USB buffer!
+bool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes)
+{
+ rhport = _usbd_rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ TU_LOG(USBD_DBG, " Queue ISO EP %02X with %u bytes ... ", ep_addr, total_bytes);
+
+ // Attempt to transfer on a busy endpoint, sound like an race condition !
+ TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);
+
+ // Set busy first since the actual transfer can be complete before dcd_edpt_xfer() could return
+ // and usbd task can preempt and clear the busy
+ _usbd_dev.ep_status[epnum][dir].busy = true;
+
+ if (dcd_edpt_xfer_fifo(rhport, ep_addr, ff, total_bytes))
+ {
+ TU_LOG(USBD_DBG, "OK\r\n");
+ return true;
+ }else
+ {
+ // DCD error, mark endpoint as ready to allow next transfer
+ _usbd_dev.ep_status[epnum][dir].busy = false;
+ _usbd_dev.ep_status[epnum][dir].claimed = 0;
+ TU_LOG(USBD_DBG, "failed\r\n");
+ TU_BREAKPOINT();
+ return false;
+ }
+}
+
+bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr)
+{
+ (void) rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ return _usbd_dev.ep_status[epnum][dir].busy;
+}
+
+void usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr)
+{
+ rhport = _usbd_rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ // only stalled if currently cleared
+ if ( !_usbd_dev.ep_status[epnum][dir].stalled )
+ {
+ TU_LOG(USBD_DBG, " Stall EP %02X\r\n", ep_addr);
+ dcd_edpt_stall(rhport, ep_addr);
+ _usbd_dev.ep_status[epnum][dir].stalled = true;
+ _usbd_dev.ep_status[epnum][dir].busy = true;
+ }
+}
+
+void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
+{
+ rhport = _usbd_rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ // only clear if currently stalled
+ if ( _usbd_dev.ep_status[epnum][dir].stalled )
+ {
+ TU_LOG(USBD_DBG, " Clear Stall EP %02X\r\n", ep_addr);
+ dcd_edpt_clear_stall(rhport, ep_addr);
+ _usbd_dev.ep_status[epnum][dir].stalled = false;
+ _usbd_dev.ep_status[epnum][dir].busy = false;
+ }
+}
+
+bool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr)
+{
+ (void) rhport;
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ return _usbd_dev.ep_status[epnum][dir].stalled;
+}
+
+/**
+ * usbd_edpt_close will disable an endpoint.
+ *
+ * In progress transfers on this EP may be delivered after this call.
+ *
+ */
+void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr)
+{
+ rhport = _usbd_rhport;
+
+ TU_ASSERT(dcd_edpt_close, /**/);
+ TU_LOG(USBD_DBG, " CLOSING Endpoint: 0x%02X\r\n", ep_addr);
+
+ uint8_t const epnum = tu_edpt_number(ep_addr);
+ uint8_t const dir = tu_edpt_dir(ep_addr);
+
+ dcd_edpt_close(rhport, ep_addr);
+ _usbd_dev.ep_status[epnum][dir].stalled = false;
+ _usbd_dev.ep_status[epnum][dir].busy = false;
+ _usbd_dev.ep_status[epnum][dir].claimed = false;
+
+ return;
+}
+
+void usbd_sof_enable(uint8_t rhport, bool en)
+{
+ rhport = _usbd_rhport;
+
+ // TODO: Check needed if all drivers including the user sof_cb does not need an active SOF ISR any more.
+ // Only if all drivers switched off SOF calls the SOF interrupt may be disabled
+ dcd_sof_enable(rhport, en);
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.h
new file mode 100644
index 000000000..ad19d1045
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd.h
@@ -0,0 +1,867 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_USBD_H_
+#define _TUSB_USBD_H_
+
+#include "common/tusb_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Application API
+//--------------------------------------------------------------------+
+
+// Init device stack
+bool tud_init (uint8_t rhport);
+
+// Check if device stack is already initialized
+bool tud_inited(void);
+
+// Task function should be called in main/rtos loop, extended version of tud_task()
+// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever
+// - in_isr: if function is called in ISR
+void tud_task_ext(uint32_t timeout_ms, bool in_isr);
+
+// Task function should be called in main/rtos loop
+TU_ATTR_ALWAYS_INLINE static inline
+void tud_task (void)
+{
+ tud_task_ext(UINT32_MAX, false);
+}
+
+// Check if there is pending events need processing by tud_task()
+bool tud_task_event_ready(void);
+
+#ifndef _TUSB_DCD_H_
+extern void dcd_int_handler(uint8_t rhport);
+#endif
+
+// Interrupt handler, name alias to DCD
+#define tud_int_handler dcd_int_handler
+
+// Get current bus speed
+tusb_speed_t tud_speed_get(void);
+
+// Check if device is connected (may not mounted/configured yet)
+// True if just got out of Bus Reset and received the very first data from host
+bool tud_connected(void);
+
+// Check if device is connected and configured
+bool tud_mounted(void);
+
+// Check if device is suspended
+bool tud_suspended(void);
+
+// Check if device is ready to transfer
+TU_ATTR_ALWAYS_INLINE static inline
+bool tud_ready(void)
+{
+ return tud_mounted() && !tud_suspended();
+}
+
+// Remote wake up host, only if suspended and enabled by host
+bool tud_remote_wakeup(void);
+
+// Enable pull-up resistor on D+ D-
+// Return false on unsupported MCUs
+bool tud_disconnect(void);
+
+// Disable pull-up resistor on D+ D-
+// Return false on unsupported MCUs
+bool tud_connect(void);
+
+// Carry out Data and Status stage of control transfer
+// - If len = 0, it is equivalent to sending status only
+// - If len > wLength : it will be truncated
+bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const * request, void* buffer, uint16_t len);
+
+// Send STATUS (zero length) packet
+bool tud_control_status(uint8_t rhport, tusb_control_request_t const * request);
+
+//--------------------------------------------------------------------+
+// Application Callbacks (WEAK is optional)
+//--------------------------------------------------------------------+
+
+// Invoked when received GET DEVICE DESCRIPTOR request
+// Application return pointer to descriptor
+uint8_t const * tud_descriptor_device_cb(void);
+
+// Invoked when received GET CONFIGURATION DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
+uint8_t const * tud_descriptor_configuration_cb(uint8_t index);
+
+// Invoked when received GET STRING DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
+uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid);
+
+// Invoked when received GET BOS DESCRIPTOR request
+// Application return pointer to descriptor
+TU_ATTR_WEAK uint8_t const * tud_descriptor_bos_cb(void);
+
+// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.
+// device_qualifier descriptor describes information about a high-speed capable device that would
+// change if the device were operating at the other speed. If not highspeed capable stall this request.
+TU_ATTR_WEAK uint8_t const* tud_descriptor_device_qualifier_cb(void);
+
+// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request
+// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
+// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa
+TU_ATTR_WEAK uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index);
+
+// Invoked when device is mounted (configured)
+TU_ATTR_WEAK void tud_mount_cb(void);
+
+// Invoked when device is unmounted
+TU_ATTR_WEAK void tud_umount_cb(void);
+
+// Invoked when usb bus is suspended
+// Within 7ms, device must draw an average of current less than 2.5 mA from bus
+TU_ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
+
+// Invoked when usb bus is resumed
+TU_ATTR_WEAK void tud_resume_cb(void);
+
+// Invoked when received control request with VENDOR TYPE
+TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
+
+//--------------------------------------------------------------------+
+// Binary Device Object Store (BOS) Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_BOS_DESC_LEN 5
+
+// total length, number of device caps
+#define TUD_BOS_DESCRIPTOR(_total_len, _caps_num) \
+ 5, TUSB_DESC_BOS, U16_TO_U8S_LE(_total_len), _caps_num
+
+// Device Capability Platform 128-bit UUID + Data
+#define TUD_BOS_PLATFORM_DESCRIPTOR(...) \
+ 4+TU_ARGS_NUM(__VA_ARGS__), TUSB_DESC_DEVICE_CAPABILITY, DEVICE_CAPABILITY_PLATFORM, 0x00, __VA_ARGS__
+
+//------------- WebUSB BOS Platform -------------//
+
+// Descriptor Length
+#define TUD_BOS_WEBUSB_DESC_LEN 24
+
+// Vendor Code, iLandingPage
+#define TUD_BOS_WEBUSB_DESCRIPTOR(_vendor_code, _ipage) \
+ TUD_BOS_PLATFORM_DESCRIPTOR(TUD_BOS_WEBUSB_UUID, U16_TO_U8S_LE(0x0100), _vendor_code, _ipage)
+
+#define TUD_BOS_WEBUSB_UUID \
+ 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, \
+ 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65
+
+//------------- Microsoft OS 2.0 Platform -------------//
+#define TUD_BOS_MICROSOFT_OS_DESC_LEN 28
+
+// Total Length of descriptor set, vendor code
+#define TUD_BOS_MS_OS_20_DESCRIPTOR(_desc_set_len, _vendor_code) \
+ TUD_BOS_PLATFORM_DESCRIPTOR(TUD_BOS_MS_OS_20_UUID, U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(_desc_set_len), _vendor_code, 0)
+
+#define TUD_BOS_MS_OS_20_UUID \
+ 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, \
+ 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F
+
+//--------------------------------------------------------------------+
+// Configuration Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_CONFIG_DESC_LEN (9)
+
+// Config number, interface count, string index, total length, attribute, power in mA
+#define TUD_CONFIG_DESCRIPTOR(config_num, _itfcount, _stridx, _total_len, _attribute, _power_ma) \
+ 9, TUSB_DESC_CONFIGURATION, U16_TO_U8S_LE(_total_len), _itfcount, config_num, _stridx, TU_BIT(7) | _attribute, (_power_ma)/2
+
+//--------------------------------------------------------------------+
+// CDC Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor: 66 bytes
+#define TUD_CDC_DESC_LEN (8+9+5+5+4+5+7+9+7+7)
+
+// CDC Descriptor Template
+// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
+#define TUD_CDC_DESCRIPTOR(_itfnum, _stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize) \
+ /* Interface Associate */\
+ 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_NONE, 0,\
+ /* CDC Control Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_NONE, _stridx,\
+ /* CDC Header */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0120),\
+ /* CDC Call */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_CALL_MANAGEMENT, 0, (uint8_t)((_itfnum) + 1),\
+ /* CDC ACM: support line request */\
+ 4, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, 2,\
+ /* CDC Union */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\
+ /* Endpoint Notification */\
+ 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 16,\
+ /* CDC Data Interface */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+//--------------------------------------------------------------------+
+// MSC Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor: 23 bytes
+#define TUD_MSC_DESC_LEN (9 + 7 + 7)
+
+// Interface number, string index, EP Out & EP In address, EP size
+#define TUD_MSC_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
+ /* Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_MSC, MSC_SUBCLASS_SCSI, MSC_PROTOCOL_BOT, _stridx,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+
+//--------------------------------------------------------------------+
+// HID Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor: 25 bytes
+#define TUD_HID_DESC_LEN (9 + 9 + 7)
+
+// HID Input only descriptor
+// Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval
+#define TUD_HID_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epin, _epsize, _ep_interval) \
+ /* Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_HID, (uint8_t)((_boot_protocol) ? (uint8_t)HID_SUBCLASS_BOOT : 0), _boot_protocol, _stridx,\
+ /* HID descriptor */\
+ 9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval
+
+// Length of template descriptor: 32 bytes
+#define TUD_HID_INOUT_DESC_LEN (9 + 9 + 7 + 7)
+
+// HID Input & Output descriptor
+// Interface number, string index, protocol, report descriptor len, EP OUT & IN address, size & polling interval
+#define TUD_HID_INOUT_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epout, _epin, _epsize, _ep_interval) \
+ /* Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_HID, (uint8_t)((_boot_protocol) ? (uint8_t)HID_SUBCLASS_BOOT : 0), _boot_protocol, _stridx,\
+ /* HID descriptor */\
+ 9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval, \
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval
+
+//--------------------------------------------------------------------+
+// MIDI Descriptor Templates
+// Note: MIDI v1.0 is based on Audio v1.0
+//--------------------------------------------------------------------+
+
+#define TUD_MIDI_DESC_HEAD_LEN (9 + 9 + 9 + 7)
+#define TUD_MIDI_DESC_HEAD(_itfnum, _stridx, _numcables) \
+ /* Audio Control (AC) Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 0, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_FUNC_PROTOCOL_CODE_UNDEF, _stridx,\
+ /* AC Header */\
+ 9, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_HEADER, U16_TO_U8S_LE(0x0100), U16_TO_U8S_LE(0x0009), 1, (uint8_t)((_itfnum) + 1),\
+ /* MIDI Streaming (MS) Interface */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum) + 1), 0, 2, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_MIDI_STREAMING, AUDIO_FUNC_PROTOCOL_CODE_UNDEF, 0,\
+ /* MS Header */\
+ 7, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_HEADER, U16_TO_U8S_LE(0x0100), U16_TO_U8S_LE(7 + (_numcables) * TUD_MIDI_DESC_JACK_LEN + 2 * TUD_MIDI_DESC_EP_LEN(_numcables))
+
+#define TUD_MIDI_JACKID_IN_EMB(_cablenum) \
+ (uint8_t)(((_cablenum) - 1) * 4 + 1)
+
+#define TUD_MIDI_JACKID_IN_EXT(_cablenum) \
+ (uint8_t)(((_cablenum) - 1) * 4 + 2)
+
+#define TUD_MIDI_JACKID_OUT_EMB(_cablenum) \
+ (uint8_t)(((_cablenum) - 1) * 4 + 3)
+
+#define TUD_MIDI_JACKID_OUT_EXT(_cablenum) \
+ (uint8_t)(((_cablenum) - 1) * 4 + 4)
+
+#define TUD_MIDI_DESC_JACK_LEN (6 + 6 + 9 + 9)
+#define TUD_MIDI_DESC_JACK_DESC(_cablenum, _stridx) \
+ /* MS In Jack (Embedded) */\
+ 6, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_IN_JACK, MIDI_JACK_EMBEDDED, TUD_MIDI_JACKID_IN_EMB(_cablenum), _stridx,\
+ /* MS In Jack (External) */\
+ 6, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_IN_JACK, MIDI_JACK_EXTERNAL, TUD_MIDI_JACKID_IN_EXT(_cablenum), _stridx,\
+ /* MS Out Jack (Embedded), connected to In Jack External */\
+ 9, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_OUT_JACK, MIDI_JACK_EMBEDDED, TUD_MIDI_JACKID_OUT_EMB(_cablenum), 1, TUD_MIDI_JACKID_IN_EXT(_cablenum), 1, _stridx,\
+ /* MS Out Jack (External), connected to In Jack Embedded */\
+ 9, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_OUT_JACK, MIDI_JACK_EXTERNAL, TUD_MIDI_JACKID_OUT_EXT(_cablenum), 1, TUD_MIDI_JACKID_IN_EMB(_cablenum), 1, _stridx
+
+#define TUD_MIDI_DESC_JACK(_cablenum) TUD_MIDI_DESC_JACK_DESC(_cablenum, 0)
+
+#define TUD_MIDI_DESC_EP_LEN(_numcables) (9 + 4 + (_numcables))
+#define TUD_MIDI_DESC_EP(_epout, _epsize, _numcables) \
+ /* Endpoint: Note Audio v1.0's endpoint has 9 bytes instead of 7 */\
+ 9, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0, 0, 0, \
+ /* MS Endpoint (connected to embedded jack) */\
+ (uint8_t)(4 + (_numcables)), TUSB_DESC_CS_ENDPOINT, MIDI_CS_ENDPOINT_GENERAL, _numcables
+
+// Length of template descriptor (88 bytes)
+#define TUD_MIDI_DESC_LEN (TUD_MIDI_DESC_HEAD_LEN + TUD_MIDI_DESC_JACK_LEN + TUD_MIDI_DESC_EP_LEN(1) * 2)
+
+// MIDI simple descriptor
+// - 1 Embedded Jack In connected to 1 External Jack Out
+// - 1 Embedded Jack out connected to 1 External Jack In
+#define TUD_MIDI_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
+ TUD_MIDI_DESC_HEAD(_itfnum, _stridx, 1),\
+ TUD_MIDI_DESC_JACK_DESC(1, 0),\
+ TUD_MIDI_DESC_EP(_epout, _epsize, 1),\
+ TUD_MIDI_JACKID_IN_EMB(1),\
+ TUD_MIDI_DESC_EP(_epin, _epsize, 1),\
+ TUD_MIDI_JACKID_OUT_EMB(1)
+
+//--------------------------------------------------------------------+
+// Audio v2.0 Descriptor Templates
+//--------------------------------------------------------------------+
+
+/* Standard Interface Association Descriptor (IAD) */
+#define TUD_AUDIO_DESC_IAD_LEN 8
+#define TUD_AUDIO_DESC_IAD(_firstitfs, _nitfs, _stridx) \
+ TUD_AUDIO_DESC_IAD_LEN, TUSB_DESC_INTERFACE_ASSOCIATION, _firstitfs, _nitfs, TUSB_CLASS_AUDIO, AUDIO_FUNCTION_SUBCLASS_UNDEFINED, AUDIO_FUNC_PROTOCOL_CODE_V2, _stridx
+
+/* Standard AC Interface Descriptor(4.7.1) */
+#define TUD_AUDIO_DESC_STD_AC_LEN 9
+#define TUD_AUDIO_DESC_STD_AC(_itfnum, _nEPs, _stridx) /* _nEPs is 0 or 1 */\
+ TUD_AUDIO_DESC_STD_AC_LEN, TUSB_DESC_INTERFACE, _itfnum, /* fixed to zero */ 0x00, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_INT_PROTOCOL_CODE_V2, _stridx
+
+/* Class-Specific AC Interface Header Descriptor(4.7.2) */
+#define TUD_AUDIO_DESC_CS_AC_LEN 9
+#define TUD_AUDIO_DESC_CS_AC(_bcdADC, _category, _totallen, _ctrl) /* _bcdADC : Audio Device Class Specification Release Number in Binary-Coded Decimal, _category : see audio_function_t, _totallen : Total number of bytes returned for the class-specific AudioControl interface i.e. Clock Source, Unit and Terminal descriptors - Do not include TUD_AUDIO_DESC_CS_AC_LEN, we already do this here*/ \
+ TUD_AUDIO_DESC_CS_AC_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_HEADER, U16_TO_U8S_LE(_bcdADC), _category, U16_TO_U8S_LE(_totallen + TUD_AUDIO_DESC_CS_AC_LEN), _ctrl
+
+/* Clock Source Descriptor(4.7.2.1) */
+#define TUD_AUDIO_DESC_CLK_SRC_LEN 8
+#define TUD_AUDIO_DESC_CLK_SRC(_clkid, _attr, _ctrl, _assocTerm, _stridx) \
+ TUD_AUDIO_DESC_CLK_SRC_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_CLOCK_SOURCE, _clkid, _attr, _ctrl, _assocTerm, _stridx
+
+/* Input Terminal Descriptor(4.7.2.4) */
+#define TUD_AUDIO_DESC_INPUT_TERM_LEN 17
+#define TUD_AUDIO_DESC_INPUT_TERM(_termid, _termtype, _assocTerm, _clkid, _nchannelslogical, _channelcfg, _idxchannelnames, _ctrl, _stridx) \
+ TUD_AUDIO_DESC_INPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_INPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _clkid, _nchannelslogical, U32_TO_U8S_LE(_channelcfg), _idxchannelnames, U16_TO_U8S_LE(_ctrl), _stridx
+
+/* Output Terminal Descriptor(4.7.2.5) */
+#define TUD_AUDIO_DESC_OUTPUT_TERM_LEN 12
+#define TUD_AUDIO_DESC_OUTPUT_TERM(_termid, _termtype, _assocTerm, _srcid, _clkid, _ctrl, _stridx) \
+ TUD_AUDIO_DESC_OUTPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_OUTPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _srcid, _clkid, U16_TO_U8S_LE(_ctrl), _stridx
+
+/* Feature Unit Descriptor(4.7.2.8) */
+// 1 - Channel
+#define TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN 6+(1+1)*4
+#define TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL(_unitid, _srcid, _ctrlch0master, _ctrlch1, _stridx) \
+ TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_FEATURE_UNIT, _unitid, _srcid, U32_TO_U8S_LE(_ctrlch0master), U32_TO_U8S_LE(_ctrlch1), _stridx
+
+// 2 - Channels
+#define TUD_AUDIO_DESC_FEATURE_UNIT_TWO_CHANNEL_LEN (6+(2+1)*4)
+#define TUD_AUDIO_DESC_FEATURE_UNIT_TWO_CHANNEL(_unitid, _srcid, _ctrlch0master, _ctrlch1, _ctrlch2, _stridx) \
+ TUD_AUDIO_DESC_FEATURE_UNIT_TWO_CHANNEL_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_FEATURE_UNIT, _unitid, _srcid, U32_TO_U8S_LE(_ctrlch0master), U32_TO_U8S_LE(_ctrlch1), U32_TO_U8S_LE(_ctrlch2), _stridx
+// 4 - Channels
+#define TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL_LEN (6+(4+1)*4)
+#define TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL(_unitid, _srcid, _ctrlch0master, _ctrlch1, _ctrlch2, _ctrlch3, _ctrlch4, _stridx) \
+ TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AC_INTERFACE_FEATURE_UNIT, _unitid, _srcid, U32_TO_U8S_LE(_ctrlch0master), U32_TO_U8S_LE(_ctrlch1), U32_TO_U8S_LE(_ctrlch2), U32_TO_U8S_LE(_ctrlch3), U32_TO_U8S_LE(_ctrlch4), _stridx
+
+// For more channels, add definitions here
+
+/* Standard AS Interface Descriptor(4.9.1) */
+#define TUD_AUDIO_DESC_STD_AS_INT_LEN 9
+#define TUD_AUDIO_DESC_STD_AS_INT(_itfnum, _altset, _nEPs, _stridx) \
+ TUD_AUDIO_DESC_STD_AS_INT_LEN, TUSB_DESC_INTERFACE, _itfnum, _altset, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_STREAMING, AUDIO_INT_PROTOCOL_CODE_V2, _stridx
+
+/* Class-Specific AS Interface Descriptor(4.9.2) */
+#define TUD_AUDIO_DESC_CS_AS_INT_LEN 16
+#define TUD_AUDIO_DESC_CS_AS_INT(_termid, _ctrl, _formattype, _formats, _nchannelsphysical, _channelcfg, _stridx) \
+ TUD_AUDIO_DESC_CS_AS_INT_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AS_INTERFACE_AS_GENERAL, _termid, _ctrl, _formattype, U32_TO_U8S_LE(_formats), _nchannelsphysical, U32_TO_U8S_LE(_channelcfg), _stridx
+
+/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */
+#define TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN 6
+#define TUD_AUDIO_DESC_TYPE_I_FORMAT(_subslotsize, _bitresolution) /* _subslotsize is number of bytes per sample (i.e. subslot) and can be 1,2,3, or 4 */\
+ TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN, TUSB_DESC_CS_INTERFACE, AUDIO_CS_AS_INTERFACE_FORMAT_TYPE, AUDIO_FORMAT_TYPE_I, _subslotsize, _bitresolution
+
+/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */
+#define TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN 7
+#define TUD_AUDIO_DESC_STD_AS_ISO_EP(_ep, _attr, _maxEPsize, _interval) \
+ TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN, TUSB_DESC_ENDPOINT, _ep, _attr, U16_TO_U8S_LE(_maxEPsize), _interval
+
+/* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */
+#define TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN 8
+#define TUD_AUDIO_DESC_CS_AS_ISO_EP(_attr, _ctrl, _lockdelayunit, _lockdelay) \
+ TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN, TUSB_DESC_CS_ENDPOINT, AUDIO_CS_EP_SUBTYPE_GENERAL, _attr, _ctrl, _lockdelayunit, U16_TO_U8S_LE(_lockdelay)
+
+/* Standard AS Isochronous Feedback Endpoint Descriptor(4.10.2.1) */
+#define TUD_AUDIO_DESC_STD_AS_ISO_FB_EP_LEN 7
+#define TUD_AUDIO_DESC_STD_AS_ISO_FB_EP(_ep, _interval) \
+ TUD_AUDIO_DESC_STD_AS_ISO_FB_EP_LEN, TUSB_DESC_ENDPOINT, _ep, (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_NO_SYNC | TUSB_ISO_EP_ATT_EXPLICIT_FB), U16_TO_U8S_LE(4), _interval
+
+// AUDIO simple descriptor (UAC2) for 1 microphone input
+// - 1 Input Terminal, 1 Feature Unit (Mute and Volume Control), 1 Output Terminal, 1 Clock Source
+
+#define TUD_AUDIO_MIC_ONE_CH_DESC_LEN (TUD_AUDIO_DESC_IAD_LEN\
+ + TUD_AUDIO_DESC_STD_AC_LEN\
+ + TUD_AUDIO_DESC_CS_AC_LEN\
+ + TUD_AUDIO_DESC_CLK_SRC_LEN\
+ + TUD_AUDIO_DESC_INPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_CS_AS_INT_LEN\
+ + TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
+ + TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN)
+
+#define TUD_AUDIO_MIC_ONE_CH_DESC_N_AS_INT 1 // Number of AS interfaces
+
+#define TUD_AUDIO_MIC_ONE_CH_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epin, _epsize) \
+ /* Standard Interface Association Descriptor (IAD) */\
+ TUD_AUDIO_DESC_IAD(/*_firstitfs*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\
+ /* Standard AC Interface Descriptor(4.7.1) */\
+ TUD_AUDIO_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\
+ /* Class-Specific AC Interface Header Descriptor(4.7.2) */\
+ TUD_AUDIO_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO_FUNC_MICROPHONE, /*_totallen*/ TUD_AUDIO_DESC_CLK_SRC_LEN+TUD_AUDIO_DESC_INPUT_TERM_LEN+TUD_AUDIO_DESC_OUTPUT_TERM_LEN+TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN, /*_ctrl*/ AUDIO_CS_AS_INTERFACE_CTRL_LATENCY_POS),\
+ /* Clock Source Descriptor(4.7.2.1) */\
+ TUD_AUDIO_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO_CTRL_R << AUDIO_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01, /*_stridx*/ 0x00),\
+ /* Input Terminal Descriptor(4.7.2.4) */\
+ TUD_AUDIO_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x03, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ AUDIO_CTRL_R << AUDIO_IN_TERM_CTRL_CONNECTOR_POS, /*_stridx*/ 0x00),\
+ /* Output Terminal Descriptor(4.7.2.5) */\
+ TUD_AUDIO_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\
+ /* Feature Unit Descriptor(4.7.2.8) */\
+ TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_ctrlch0master*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 1 - alternate interface for data streaming */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\
+ /* Class-Specific AS Interface Descriptor(4.9.2) */\
+ TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ 0x03, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\
+ /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\
+ TUD_AUDIO_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\
+ /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\
+ TUD_AUDIO_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epsize, /*_interval*/ TUD_OPT_HIGH_SPEED ? 0x04 : 0x01),\
+ /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\
+ TUD_AUDIO_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO_CTRL_NONE, /*_lockdelayunit*/ AUDIO_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)
+
+// AUDIO simple descriptor (UAC2) for 4 microphone input
+// - 1 Input Terminal, 1 Feature Unit (Mute and Volume Control), 1 Output Terminal, 1 Clock Source
+
+#define TUD_AUDIO_MIC_FOUR_CH_DESC_LEN (TUD_AUDIO_DESC_IAD_LEN\
+ + TUD_AUDIO_DESC_STD_AC_LEN\
+ + TUD_AUDIO_DESC_CS_AC_LEN\
+ + TUD_AUDIO_DESC_CLK_SRC_LEN\
+ + TUD_AUDIO_DESC_INPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_CS_AS_INT_LEN\
+ + TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
+ + TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN)
+
+#define TUD_AUDIO_MIC_FOUR_CH_DESC_N_AS_INT 1 // Number of AS interfaces
+
+#define TUD_AUDIO_MIC_FOUR_CH_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epin, _epsize) \
+ /* Standard Interface Association Descriptor (IAD) */\
+ TUD_AUDIO_DESC_IAD(/*_firstitfs*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\
+ /* Standard AC Interface Descriptor(4.7.1) */\
+ TUD_AUDIO_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\
+ /* Class-Specific AC Interface Header Descriptor(4.7.2) */\
+ TUD_AUDIO_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO_FUNC_MICROPHONE, /*_totallen*/ TUD_AUDIO_DESC_CLK_SRC_LEN+TUD_AUDIO_DESC_INPUT_TERM_LEN+TUD_AUDIO_DESC_OUTPUT_TERM_LEN+TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL_LEN, /*_ctrl*/ AUDIO_CS_AS_INTERFACE_CTRL_LATENCY_POS),\
+ /* Clock Source Descriptor(4.7.2.1) */\
+ TUD_AUDIO_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO_CTRL_R << AUDIO_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01, /*_stridx*/ 0x00),\
+ /* Input Terminal Descriptor(4.7.2.4) */\
+ TUD_AUDIO_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x03, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x04, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ AUDIO_CTRL_R << AUDIO_IN_TERM_CTRL_CONNECTOR_POS, /*_stridx*/ 0x00),\
+ /* Output Terminal Descriptor(4.7.2.5) */\
+ TUD_AUDIO_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\
+ /* Feature Unit Descriptor(4.7.2.8) */\
+ TUD_AUDIO_DESC_FEATURE_UNIT_FOUR_CHANNEL(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_ctrlch0master*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch2*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch3*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch4*/ AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS, /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 1 - alternate interface for data streaming */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\
+ /* Class-Specific AS Interface Descriptor(4.9.2) */\
+ TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ 0x03, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x04, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\
+ /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\
+ TUD_AUDIO_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\
+ /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\
+ TUD_AUDIO_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epsize, /*_interval*/ TUD_OPT_HIGH_SPEED ? 0x04 : 0x01),\
+ /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\
+ TUD_AUDIO_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO_CTRL_NONE, /*_lockdelayunit*/ AUDIO_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)
+
+// AUDIO simple descriptor (UAC2) for mono speaker
+// - 1 Input Terminal, 2 Feature Unit (Mute and Volume Control), 3 Output Terminal, 4 Clock Source
+
+#define TUD_AUDIO_SPEAKER_MONO_FB_DESC_LEN (TUD_AUDIO_DESC_IAD_LEN\
+ + TUD_AUDIO_DESC_STD_AC_LEN\
+ + TUD_AUDIO_DESC_CS_AC_LEN\
+ + TUD_AUDIO_DESC_CLK_SRC_LEN\
+ + TUD_AUDIO_DESC_INPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_OUTPUT_TERM_LEN\
+ + TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_INT_LEN\
+ + TUD_AUDIO_DESC_CS_AS_INT_LEN\
+ + TUD_AUDIO_DESC_TYPE_I_FORMAT_LEN\
+ + TUD_AUDIO_DESC_STD_AS_ISO_EP_LEN\
+ + TUD_AUDIO_DESC_CS_AS_ISO_EP_LEN\
+ + TUD_AUDIO_DESC_STD_AS_ISO_FB_EP_LEN)
+
+#define TUD_AUDIO_SPEAKER_MONO_FB_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epout, _epsize, _epfb) \
+ /* Standard Interface Association Descriptor (IAD) */\
+ TUD_AUDIO_DESC_IAD(/*_firstitfs*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\
+ /* Standard AC Interface Descriptor(4.7.1) */\
+ TUD_AUDIO_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\
+ /* Class-Specific AC Interface Header Descriptor(4.7.2) */\
+ TUD_AUDIO_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO_FUNC_DESKTOP_SPEAKER, /*_totallen*/ TUD_AUDIO_DESC_CLK_SRC_LEN+TUD_AUDIO_DESC_INPUT_TERM_LEN+TUD_AUDIO_DESC_OUTPUT_TERM_LEN+TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL_LEN, /*_ctrl*/ AUDIO_CS_AS_INTERFACE_CTRL_LATENCY_POS),\
+ /* Clock Source Descriptor(4.7.2.1) */\
+ TUD_AUDIO_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO_CTRL_R << AUDIO_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01, /*_stridx*/ 0x00),\
+ /* Input Terminal Descriptor(4.7.2.4) */\
+ TUD_AUDIO_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO_CTRL_R << AUDIO_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\
+ /* Output Terminal Descriptor(4.7.2.5) */\
+ TUD_AUDIO_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_OUT_DESKTOP_SPEAKER, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\
+ /* Feature Unit Descriptor(4.7.2.8) */\
+ TUD_AUDIO_DESC_FEATURE_UNIT_ONE_CHANNEL(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_ctrlch0master*/ 0 * (AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS), /*_ctrlch1*/ 0 * (AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO_CTRL_RW << AUDIO_FEATURE_UNIT_CTRL_VOLUME_POS), /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\
+ /* Standard AS Interface Descriptor(4.9.1) */\
+ /* Interface 1, Alternate 1 - alternate interface for data streaming */\
+ TUD_AUDIO_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ 0x00),\
+ /* Class-Specific AS Interface Descriptor(4.9.2) */\
+ TUD_AUDIO_DESC_CS_AS_INT(/*_termid*/ 0x01, /*_ctrl*/ AUDIO_CTRL_NONE, /*_formattype*/ AUDIO_FORMAT_TYPE_I, /*_formats*/ AUDIO_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\
+ /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\
+ TUD_AUDIO_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\
+ /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\
+ TUD_AUDIO_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epsize, /*_interval*/ TUD_OPT_HIGH_SPEED ? 0x04 : 0x01),\
+ /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\
+ TUD_AUDIO_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO_CTRL_NONE, /*_lockdelayunit*/ AUDIO_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\
+ /* Standard AS Isochronous Feedback Endpoint Descriptor(4.10.2.1) */\
+ TUD_AUDIO_DESC_STD_AS_ISO_FB_EP(/*_ep*/ _epfb, /*_interval*/ 1)\
+
+// Calculate wMaxPacketSize of Endpoints
+#define TUD_AUDIO_EP_SIZE(_maxFrequency, _nBytesPerSample, _nChannels) \
+ ((((_maxFrequency + (TUD_OPT_HIGH_SPEED ? 7999 : 999)) / (TUD_OPT_HIGH_SPEED ? 8000 : 1000)) + 1) * _nBytesPerSample * _nChannels)
+
+
+//--------------------------------------------------------------------+
+// USBTMC/USB488 Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_USBTMC_APP_CLASS (TUSB_CLASS_APPLICATION_SPECIFIC)
+#define TUD_USBTMC_APP_SUBCLASS 0x03u
+
+#define TUD_USBTMC_PROTOCOL_STD 0x00u
+#define TUD_USBTMC_PROTOCOL_USB488 0x01u
+
+// Interface number, number of endpoints, EP string index, USB_TMC_PROTOCOL*, bulk-out endpoint ID,
+// bulk-in endpoint ID
+#define TUD_USBTMC_IF_DESCRIPTOR(_itfnum, _bNumEndpoints, _stridx, _itfProtocol) \
+ /* Interface */ \
+ 0x09, TUSB_DESC_INTERFACE, _itfnum, 0x00, _bNumEndpoints, TUD_USBTMC_APP_CLASS, TUD_USBTMC_APP_SUBCLASS, _itfProtocol, _stridx
+
+#define TUD_USBTMC_IF_DESCRIPTOR_LEN 9u
+
+#define TUD_USBTMC_BULK_DESCRIPTORS(_epout, _epin, _bulk_epsize) \
+ /* Endpoint Out */ \
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \
+ /* Endpoint In */ \
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u
+
+#define TUD_USBTMC_BULK_DESCRIPTORS_LEN (7u+7u)
+
+/* optional interrupt endpoint */ \
+// _int_pollingInterval : for LS/FS, expressed in frames (1ms each). 16 may be a good number?
+#define TUD_USBTMC_INT_DESCRIPTOR(_ep_interrupt, _ep_interrupt_size, _int_pollingInterval ) \
+ 7, TUSB_DESC_ENDPOINT, _ep_interrupt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_interrupt_size), _int_pollingInterval
+
+#define TUD_USBTMC_INT_DESCRIPTOR_LEN (7u)
+
+//--------------------------------------------------------------------+
+// Vendor Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_VENDOR_DESC_LEN (9+7+7)
+
+// Interface number, string index, EP Out & IN address, EP size
+#define TUD_VENDOR_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
+ /* Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_VENDOR_SPECIFIC, 0x00, 0x00, _stridx,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+//--------------------------------------------------------------------+
+// DFU Runtime Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_DFU_APP_CLASS (TUSB_CLASS_APPLICATION_SPECIFIC)
+#define TUD_DFU_APP_SUBCLASS (APP_SUBCLASS_DFU_RUNTIME)
+
+// Length of template descriptr: 18 bytes
+#define TUD_DFU_RT_DESC_LEN (9 + 9)
+
+// DFU runtime descriptor
+// Interface number, string index, attributes, detach timeout, transfer size
+#define TUD_DFU_RT_DESCRIPTOR(_itfnum, _stridx, _attr, _timeout, _xfer_size) \
+ /* Interface */ \
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 0, TUD_DFU_APP_CLASS, TUD_DFU_APP_SUBCLASS, DFU_PROTOCOL_RT, _stridx, \
+ /* Function */ \
+ 9, DFU_DESC_FUNCTIONAL, _attr, U16_TO_U8S_LE(_timeout), U16_TO_U8S_LE(_xfer_size), U16_TO_U8S_LE(0x0101)
+
+//--------------------------------------------------------------------+
+// DFU Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor: 9 bytes + number of alternatives * 9
+#define TUD_DFU_DESC_LEN(_alt_count) (9 + (_alt_count) * 9)
+
+// Interface number, Alternate count, starting string index, attributes, detach timeout, transfer size
+// Note: Alternate count must be numeric or macro, string index is increased by one for each Alt interface
+#define TUD_DFU_DESCRIPTOR(_itfnum, _alt_count, _stridx, _attr, _timeout, _xfer_size) \
+ TU_XSTRCAT(_TUD_DFU_ALT_,_alt_count)(_itfnum, 0, _stridx), \
+ /* Function */ \
+ 9, DFU_DESC_FUNCTIONAL, _attr, U16_TO_U8S_LE(_timeout), U16_TO_U8S_LE(_xfer_size), U16_TO_U8S_LE(0x0101)
+
+#define _TUD_DFU_ALT(_itfnum, _alt, _stridx) \
+ /* Interface */ \
+ 9, TUSB_DESC_INTERFACE, _itfnum, _alt, 0, TUD_DFU_APP_CLASS, TUD_DFU_APP_SUBCLASS, DFU_PROTOCOL_DFU, _stridx
+
+#define _TUD_DFU_ALT_1(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx)
+
+#define _TUD_DFU_ALT_2(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_1(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_3(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_2(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_4(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_3(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_5(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_4(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_6(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_5(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_7(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_6(_itfnum, _alt_count+1, _stridx+1)
+
+#define _TUD_DFU_ALT_8(_itfnum, _alt_count, _stridx) \
+ _TUD_DFU_ALT(_itfnum, _alt_count, _stridx), \
+ _TUD_DFU_ALT_7(_itfnum, _alt_count+1, _stridx+1)
+
+//--------------------------------------------------------------------+
+// CDC-ECM Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor: 71 bytes
+#define TUD_CDC_ECM_DESC_LEN (8+9+5+5+13+7+9+9+7+7)
+
+// CDC-ECM Descriptor Template
+// Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.
+#define TUD_CDC_ECM_DESCRIPTOR(_itfnum, _desc_stridx, _mac_stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize, _maxsegmentsize) \
+ /* Interface Association */\
+ 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL, 0, 0,\
+ /* CDC Control Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL, 0, _desc_stridx,\
+ /* CDC-ECM Header */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0120),\
+ /* CDC-ECM Union */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\
+ /* CDC-ECM Functional Descriptor */\
+ 13, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ETHERNET_NETWORKING, _mac_stridx, 0, 0, 0, 0, U16_TO_U8S_LE(_maxsegmentsize), U16_TO_U8S_LE(0), 0,\
+ /* Endpoint Notification */\
+ 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\
+ /* CDC Data Interface (default inactive) */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, 0, 0,\
+ /* CDC Data Interface (alternative active) */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 1, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+//--------------------------------------------------------------------+
+// RNDIS Descriptor Templates
+//--------------------------------------------------------------------+
+
+#if 0
+/* Windows XP */
+#define TUD_RNDIS_ITF_CLASS TUSB_CLASS_CDC
+#define TUD_RNDIS_ITF_SUBCLASS CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL
+#define TUD_RNDIS_ITF_PROTOCOL 0xFF /* CDC_COMM_PROTOCOL_MICROSOFT_RNDIS */
+#else
+/* Windows 7+ */
+#define TUD_RNDIS_ITF_CLASS TUSB_CLASS_WIRELESS_CONTROLLER
+#define TUD_RNDIS_ITF_SUBCLASS 0x01
+#define TUD_RNDIS_ITF_PROTOCOL 0x03
+#endif
+
+// Length of template descriptor: 66 bytes
+#define TUD_RNDIS_DESC_LEN (8+9+5+5+4+5+7+9+7+7)
+
+// RNDIS Descriptor Template
+// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
+#define TUD_RNDIS_DESCRIPTOR(_itfnum, _stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize) \
+ /* Interface Association */\
+ 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUD_RNDIS_ITF_CLASS, TUD_RNDIS_ITF_SUBCLASS, TUD_RNDIS_ITF_PROTOCOL, 0,\
+ /* CDC Control Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUD_RNDIS_ITF_CLASS, TUD_RNDIS_ITF_SUBCLASS, TUD_RNDIS_ITF_PROTOCOL, _stridx,\
+ /* CDC-ACM Header */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0110),\
+ /* CDC Call Management */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_CALL_MANAGEMENT, 0, (uint8_t)((_itfnum) + 1),\
+ /* ACM */\
+ 4, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, 0,\
+ /* CDC Union */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\
+ /* Endpoint Notification */\
+ 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\
+ /* CDC Data Interface */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+//--------------------------------------------------------------------+
+// Bluetooth Radio Descriptor Templates
+//--------------------------------------------------------------------+
+
+#define TUD_BT_APP_CLASS (TUSB_CLASS_WIRELESS_CONTROLLER)
+#define TUD_BT_APP_SUBCLASS 0x01
+#define TUD_BT_PROTOCOL_PRIMARY_CONTROLLER 0x01
+#define TUD_BT_PROTOCOL_AMP_CONTROLLER 0x02
+
+#ifndef CFG_TUD_BTH_ISO_ALT_COUNT
+#define CFG_TUD_BTH_ISO_ALT_COUNT 0
+#endif
+
+// Length of template descriptor: 38 bytes + number of ISO alternatives * 23
+#define TUD_BTH_DESC_LEN (8 + 9 + 7 + 7 + 7 + (CFG_TUD_BTH_ISO_ALT_COUNT) * (9 + 7 + 7))
+
+/* Primary Interface */
+#define TUD_BTH_PRI_ITF(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size) \
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 3, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, _stridx, \
+ /* Endpoint In for events */ \
+ 7, TUSB_DESC_ENDPOINT, _ep_evt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_evt_size), _ep_evt_interval, \
+ /* Endpoint In for ACL data */ \
+ 7, TUSB_DESC_ENDPOINT, _ep_in, TUSB_XFER_BULK, U16_TO_U8S_LE(_ep_size), 1, \
+ /* Endpoint Out for ACL data */ \
+ 7, TUSB_DESC_ENDPOINT, _ep_out, TUSB_XFER_BULK, U16_TO_U8S_LE(_ep_size), 1
+
+#define TUD_BTH_ISO_ITF(_itfnum, _alt, _ep_in, _ep_out, _n) ,\
+ /* Interface with 2 endpoints */ \
+ 9, TUSB_DESC_INTERFACE, _itfnum, _alt, 2, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, 0, \
+ /* Isochronous endpoints */ \
+ 7, TUSB_DESC_ENDPOINT, _ep_in, TUSB_XFER_ISOCHRONOUS, U16_TO_U8S_LE(_n), 1, \
+ 7, TUSB_DESC_ENDPOINT, _ep_out, TUSB_XFER_ISOCHRONOUS, U16_TO_U8S_LE(_n), 1
+
+#define _FIRST(a, ...) a
+#define _REST(a, ...) __VA_ARGS__
+
+#define TUD_BTH_ISO_ITF_0(_itfnum, ...)
+#define TUD_BTH_ISO_ITF_1(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 1, _ep_in, _ep_out, _FIRST(__VA_ARGS__))
+#define TUD_BTH_ISO_ITF_2(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 2, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \
+ TUD_BTH_ISO_ITF_1(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))
+#define TUD_BTH_ISO_ITF_3(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 3, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \
+ TUD_BTH_ISO_ITF_2(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))
+#define TUD_BTH_ISO_ITF_4(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 4, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \
+ TUD_BTH_ISO_ITF_3(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))
+#define TUD_BTH_ISO_ITF_5(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 5, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \
+ TUD_BTH_ISO_ITF_4(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))
+#define TUD_BTH_ISO_ITF_6(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 6, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \
+ TUD_BTH_ISO_ITF_5(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))
+
+#define TUD_BTH_ISO_ITFS(_itfnum, _ep_in, _ep_out, ...) \
+ TU_XSTRCAT(TUD_BTH_ISO_ITF_, CFG_TUD_BTH_ISO_ALT_COUNT)(_itfnum, _ep_in, _ep_out, __VA_ARGS__)
+
+// BT Primary controller descriptor
+// Interface number, string index, attributes, event endpoint, event endpoint size, interval, data in, data out, data endpoint size, iso endpoint sizes
+// TODO BTH should also use IAD like CDC for composite device
+#define TUD_BTH_DESCRIPTOR(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size,...) \
+ /* Interface Associate */\
+ 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, 0,\
+ TUD_BTH_PRI_ITF(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size) \
+ TUD_BTH_ISO_ITFS(_itfnum + 1, _ep_in + 1, _ep_out + 1, __VA_ARGS__)
+
+//--------------------------------------------------------------------+
+// CDC-NCM Descriptor Templates
+//--------------------------------------------------------------------+
+
+// Length of template descriptor
+#define TUD_CDC_NCM_DESC_LEN (8+9+5+5+13+6+7+9+9+7+7)
+
+// CDC-ECM Descriptor Template
+// Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.
+#define TUD_CDC_NCM_DESCRIPTOR(_itfnum, _desc_stridx, _mac_stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize, _maxsegmentsize) \
+ /* Interface Association */\
+ 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, 0,\
+ /* CDC Control Interface */\
+ 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, _desc_stridx,\
+ /* CDC-NCM Header */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0110),\
+ /* CDC-NCM Union */\
+ 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\
+ /* CDC-NCM Functional Descriptor */\
+ 13, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ETHERNET_NETWORKING, _mac_stridx, 0, 0, 0, 0, U16_TO_U8S_LE(_maxsegmentsize), U16_TO_U8S_LE(0), 0, \
+ /* CDC-NCM Functional Descriptor */\
+ 6, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_NCM, U16_TO_U8S_LE(0x0100), 0, \
+ /* Endpoint Notification */\
+ 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 50,\
+ /* CDC Data Interface (default inactive) */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, NCM_DATA_PROTOCOL_NETWORK_TRANSFER_BLOCK, 0,\
+ /* CDC Data Interface (alternative active) */\
+ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 1, 2, TUSB_CLASS_CDC_DATA, 0, NCM_DATA_PROTOCOL_NETWORK_TRANSFER_BLOCK, 0,\
+ /* Endpoint In */\
+ 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\
+ /* Endpoint Out */\
+ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TUSB_USBD_H_ */
+
+/** @} */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_control.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_control.c
new file mode 100644
index 000000000..0995ef669
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_control.c
@@ -0,0 +1,233 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if CFG_TUD_ENABLED
+
+#include "dcd.h"
+#include "tusb.h"
+#include "device/usbd_pvt.h"
+
+#if CFG_TUSB_DEBUG >= 2
+extern void usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback);
+#endif
+
+enum
+{
+ EDPT_CTRL_OUT = 0x00,
+ EDPT_CTRL_IN = 0x80
+};
+
+typedef struct
+{
+ tusb_control_request_t request;
+
+ uint8_t* buffer;
+ uint16_t data_len;
+ uint16_t total_xferred;
+
+ usbd_control_xfer_cb_t complete_cb;
+} usbd_control_xfer_t;
+
+static usbd_control_xfer_t _ctrl_xfer;
+
+CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN
+static uint8_t _usbd_ctrl_buf[CFG_TUD_ENDPOINT0_SIZE];
+
+//--------------------------------------------------------------------+
+// Application API
+//--------------------------------------------------------------------+
+
+// Queue ZLP status transaction
+static inline bool _status_stage_xact(uint8_t rhport, tusb_control_request_t const * request)
+{
+ // Opposite to endpoint in Data Phase
+ uint8_t const ep_addr = request->bmRequestType_bit.direction ? EDPT_CTRL_OUT : EDPT_CTRL_IN;
+ return usbd_edpt_xfer(rhport, ep_addr, NULL, 0);
+}
+
+// Status phase
+bool tud_control_status(uint8_t rhport, tusb_control_request_t const * request)
+{
+ _ctrl_xfer.request = (*request);
+ _ctrl_xfer.buffer = NULL;
+ _ctrl_xfer.total_xferred = 0;
+ _ctrl_xfer.data_len = 0;
+
+ return _status_stage_xact(rhport, request);
+}
+
+// Queue a transaction in Data Stage
+// Each transaction has up to Endpoint0's max packet size.
+// This function can also transfer an zero-length packet
+static bool _data_stage_xact(uint8_t rhport)
+{
+ uint16_t const xact_len = tu_min16(_ctrl_xfer.data_len - _ctrl_xfer.total_xferred, CFG_TUD_ENDPOINT0_SIZE);
+
+ uint8_t ep_addr = EDPT_CTRL_OUT;
+
+ if ( _ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_IN )
+ {
+ ep_addr = EDPT_CTRL_IN;
+ if ( xact_len ) memcpy(_usbd_ctrl_buf, _ctrl_xfer.buffer, xact_len);
+ }
+
+ return usbd_edpt_xfer(rhport, ep_addr, xact_len ? _usbd_ctrl_buf : NULL, xact_len);
+}
+
+// Transmit data to/from the control endpoint.
+// If the request's wLength is zero, a status packet is sent instead.
+bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const * request, void* buffer, uint16_t len)
+{
+ _ctrl_xfer.request = (*request);
+ _ctrl_xfer.buffer = (uint8_t*) buffer;
+ _ctrl_xfer.total_xferred = 0U;
+ _ctrl_xfer.data_len = tu_min16(len, request->wLength);
+
+ if (request->wLength > 0U)
+ {
+ if(_ctrl_xfer.data_len > 0U)
+ {
+ TU_ASSERT(buffer);
+ }
+
+// TU_LOG2(" Control total data length is %u bytes\r\n", _ctrl_xfer.data_len);
+
+ // Data stage
+ TU_ASSERT( _data_stage_xact(rhport) );
+ }
+ else
+ {
+ // Status stage
+ TU_ASSERT( _status_stage_xact(rhport, request) );
+ }
+
+ return true;
+}
+
+//--------------------------------------------------------------------+
+// USBD API
+//--------------------------------------------------------------------+
+
+void usbd_control_reset(void);
+void usbd_control_set_request(tusb_control_request_t const *request);
+void usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp );
+bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+
+void usbd_control_reset(void)
+{
+ tu_varclr(&_ctrl_xfer);
+}
+
+// Set complete callback
+void usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp )
+{
+ _ctrl_xfer.complete_cb = fp;
+}
+
+// for dcd_set_address where DCD is responsible for status response
+void usbd_control_set_request(tusb_control_request_t const *request)
+{
+ _ctrl_xfer.request = (*request);
+ _ctrl_xfer.buffer = NULL;
+ _ctrl_xfer.total_xferred = 0;
+ _ctrl_xfer.data_len = 0;
+}
+
+// callback when a transaction complete on
+// - DATA stage of control endpoint or
+// - Status stage
+bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
+{
+ (void) result;
+
+ // Endpoint Address is opposite to direction bit, this is Status Stage complete event
+ if ( tu_edpt_dir(ep_addr) != _ctrl_xfer.request.bmRequestType_bit.direction )
+ {
+ TU_ASSERT(0 == xferred_bytes);
+
+ // invoke optional dcd hook if available
+ if (dcd_edpt0_status_complete) dcd_edpt0_status_complete(rhport, &_ctrl_xfer.request);
+
+ if (_ctrl_xfer.complete_cb)
+ {
+ // TODO refactor with usbd_driver_print_control_complete_name
+ _ctrl_xfer.complete_cb(rhport, CONTROL_STAGE_ACK, &_ctrl_xfer.request);
+ }
+
+ return true;
+ }
+
+ if ( _ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_OUT )
+ {
+ TU_VERIFY(_ctrl_xfer.buffer);
+ memcpy(_ctrl_xfer.buffer, _usbd_ctrl_buf, xferred_bytes);
+ TU_LOG_MEM(2, _usbd_ctrl_buf, xferred_bytes, 2);
+ }
+
+ _ctrl_xfer.total_xferred += (uint16_t) xferred_bytes;
+ _ctrl_xfer.buffer += xferred_bytes;
+
+ // Data Stage is complete when all request's length are transferred or
+ // a short packet is sent including zero-length packet.
+ if ( (_ctrl_xfer.request.wLength == _ctrl_xfer.total_xferred) || (xferred_bytes < CFG_TUD_ENDPOINT0_SIZE) )
+ {
+ // DATA stage is complete
+ bool is_ok = true;
+
+ // invoke complete callback if set
+ // callback can still stall control in status phase e.g out data does not make sense
+ if ( _ctrl_xfer.complete_cb )
+ {
+ #if CFG_TUSB_DEBUG >= 2
+ usbd_driver_print_control_complete_name(_ctrl_xfer.complete_cb);
+ #endif
+
+ is_ok = _ctrl_xfer.complete_cb(rhport, CONTROL_STAGE_DATA, &_ctrl_xfer.request);
+ }
+
+ if ( is_ok )
+ {
+ // Send status
+ TU_ASSERT( _status_stage_xact(rhport, &_ctrl_xfer.request) );
+ }else
+ {
+ // Stall both IN and OUT control endpoint
+ dcd_edpt_stall(rhport, EDPT_CTRL_OUT);
+ dcd_edpt_stall(rhport, EDPT_CTRL_IN);
+ }
+ }
+ else
+ {
+ // More data to transfer
+ TU_ASSERT( _data_stage_xact(rhport) );
+ }
+
+ return true;
+}
+
+#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_pvt.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_pvt.h
new file mode 100644
index 000000000..6fad46db3
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/device/usbd_pvt.h
@@ -0,0 +1,121 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef USBD_PVT_H_
+#define USBD_PVT_H_
+
+#include "osal/osal.h"
+#include "common/tusb_fifo.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// Class Driver API
+//--------------------------------------------------------------------+
+
+typedef struct
+{
+ #if CFG_TUSB_DEBUG >= 2
+ char const* name;
+ #endif
+
+ void (* init ) (void);
+ void (* reset ) (uint8_t rhport);
+ uint16_t (* open ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t max_len);
+ bool (* control_xfer_cb ) (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
+ bool (* xfer_cb ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
+ void (* sof ) (uint8_t rhport, uint32_t frame_count); // optional
+} usbd_class_driver_t;
+
+// Invoked when initializing device stack to get additional class drivers.
+// Can optionally implemented by application to extend/overwrite class driver support.
+// Note: The drivers array must be accessible at all time when stack is active
+usbd_class_driver_t const* usbd_app_driver_get_cb(uint8_t* driver_count) TU_ATTR_WEAK;
+
+typedef bool (*usbd_control_xfer_cb_t)(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
+
+void usbd_int_set(bool enabled);
+
+//--------------------------------------------------------------------+
+// USBD Endpoint API
+// Note: rhport should be 0 since device stack only support 1 rhport for now
+//--------------------------------------------------------------------+
+
+// Open an endpoint
+bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep);
+
+// Close an endpoint
+void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr);
+
+// Submit a usb transfer
+bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes);
+
+// Submit a usb ISO transfer by use of a FIFO (ring buffer) - all bytes in FIFO get transmitted
+bool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes);
+
+// Claim an endpoint before submitting a transfer.
+// If caller does not make any transfer, it must release endpoint for others.
+bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr);
+
+// Release claimed endpoint without submitting a transfer
+bool usbd_edpt_release(uint8_t rhport, uint8_t ep_addr);
+
+// Check if endpoint is busy transferring
+bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr);
+
+// Stall endpoint
+void usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr);
+
+// Clear stalled endpoint
+void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr);
+
+// Check if endpoint is stalled
+bool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr);
+
+// Check if endpoint is ready (not busy and not stalled)
+TU_ATTR_ALWAYS_INLINE static inline
+bool usbd_edpt_ready(uint8_t rhport, uint8_t ep_addr)
+{
+ return !usbd_edpt_busy(rhport, ep_addr) && !usbd_edpt_stalled(rhport, ep_addr);
+}
+
+// Enable SOF interrupt
+void usbd_sof_enable(uint8_t rhport, bool en);
+
+/*------------------------------------------------------------------*/
+/* Helper
+ *------------------------------------------------------------------*/
+
+bool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in);
+void usbd_defer_func( osal_task_func_t func, void* param, bool in_isr );
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* USBD_PVT_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal.h
new file mode 100644
index 000000000..afa3826fc
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal.h
@@ -0,0 +1,96 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_OSAL_H_
+#define _TUSB_OSAL_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "common/tusb_common.h"
+
+typedef void (*osal_task_func_t)( void * );
+
+// Timeout
+#define OSAL_TIMEOUT_NOTIMEOUT (0) // Return immediately
+#define OSAL_TIMEOUT_NORMAL (10) // Default timeout
+#define OSAL_TIMEOUT_WAIT_FOREVER (UINT32_MAX) // Wait forever
+#define OSAL_TIMEOUT_CONTROL_XFER OSAL_TIMEOUT_WAIT_FOREVER
+
+// Mutex is required when using a preempted RTOS or MCU has multiple cores
+#if (CFG_TUSB_OS == OPT_OS_NONE) && !TUP_MCU_MULTIPLE_CORE
+ #define OSAL_MUTEX_REQUIRED 0
+ #define OSAL_MUTEX_DEF(_name) uint8_t :0
+#else
+ #define OSAL_MUTEX_REQUIRED 1
+ #define OSAL_MUTEX_DEF(_name) osal_mutex_def_t _name
+#endif
+
+// OS thin implementation
+#if CFG_TUSB_OS == OPT_OS_NONE
+ #include "osal_none.h"
+#elif CFG_TUSB_OS == OPT_OS_FREERTOS
+ #include "osal_freertos.h"
+#elif CFG_TUSB_OS == OPT_OS_MYNEWT
+ #include "osal_mynewt.h"
+#elif CFG_TUSB_OS == OPT_OS_PICO
+ #include "osal_pico.h"
+#elif CFG_TUSB_OS == OPT_OS_RTTHREAD
+ #include "osal_rtthread.h"
+#elif CFG_TUSB_OS == OPT_OS_RTX4
+ #include "osal_rtx4.h"
+#elif CFG_TUSB_OS == OPT_OS_CUSTOM
+ #include "tusb_os_custom.h" // implemented by application
+#else
+ #error OS is not supported yet
+#endif
+
+//--------------------------------------------------------------------+
+// OSAL Porting API
+// Should be implemented as static inline function in osal_port.h header
+/*
+ osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef);
+ bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr);
+ bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec);
+ void osal_semaphore_reset(osal_semaphore_t sem_hdl); // TODO removed
+
+ osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef);
+ bool osal_mutex_lock (osal_mutex_t sem_hdl, uint32_t msec);
+ bool osal_mutex_unlock(osal_mutex_t mutex_hdl);
+
+ osal_queue_t osal_queue_create(osal_queue_def_t* qdef);
+ bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec);
+ bool osal_queue_send(osal_queue_t qhdl, void const * data, bool in_isr);
+ bool osal_queue_empty(osal_queue_t qhdl);
+*/
+//--------------------------------------------------------------------+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_OSAL_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal_none.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal_none.h
new file mode 100644
index 000000000..1ad130557
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/osal/osal_none.h
@@ -0,0 +1,193 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef _TUSB_OSAL_NONE_H_
+#define _TUSB_OSAL_NONE_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// TASK API
+//--------------------------------------------------------------------+
+
+
+//--------------------------------------------------------------------+
+// Binary Semaphore API
+//--------------------------------------------------------------------+
+typedef struct
+{
+ volatile uint16_t count;
+}osal_semaphore_def_t;
+
+typedef osal_semaphore_def_t* osal_semaphore_t;
+
+TU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef)
+{
+ semdef->count = 0;
+ return semdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr)
+{
+ (void) in_isr;
+ sem_hdl->count++;
+ return true;
+}
+
+// TODO blocking for now
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait (osal_semaphore_t sem_hdl, uint32_t msec)
+{
+ (void) msec;
+
+ while (sem_hdl->count == 0) { }
+ sem_hdl->count--;
+
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl)
+{
+ sem_hdl->count = 0;
+}
+
+//--------------------------------------------------------------------+
+// MUTEX API
+// Within tinyusb, mutex is never used in ISR context
+//--------------------------------------------------------------------+
+typedef osal_semaphore_def_t osal_mutex_def_t;
+typedef osal_semaphore_t osal_mutex_t;
+
+#if OSAL_MUTEX_REQUIRED
+// Note: multiple cores MCUs usually do provide IPC API for mutex
+// or we can use std atomic function
+
+TU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef)
+{
+ mdef->count = 1;
+ return mdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock (osal_mutex_t mutex_hdl, uint32_t msec)
+{
+ return osal_semaphore_wait(mutex_hdl, msec);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl)
+{
+ return osal_semaphore_post(mutex_hdl, false);
+}
+
+#else
+
+#define osal_mutex_create(_mdef) (NULL)
+#define osal_mutex_lock(_mutex_hdl, _ms) (true)
+#define osal_mutex_unlock(_mutex_hdl) (true)
+
+#endif
+
+//--------------------------------------------------------------------+
+// QUEUE API
+//--------------------------------------------------------------------+
+#include "common/tusb_fifo.h"
+
+typedef struct
+{
+ void (*interrupt_set)(bool);
+ tu_fifo_t ff;
+}osal_queue_def_t;
+
+typedef osal_queue_def_t* osal_queue_t;
+
+// _int_set is used as mutex in OS NONE (disable/enable USB ISR)
+#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) \
+ uint8_t _name##_buf[_depth*sizeof(_type)]; \
+ osal_queue_def_t _name = { \
+ .interrupt_set = _int_set, \
+ .ff = TU_FIFO_INIT(_name##_buf, _depth, _type, false) \
+ }
+
+// lock queue by disable USB interrupt
+TU_ATTR_ALWAYS_INLINE static inline void _osal_q_lock(osal_queue_t qhdl)
+{
+ // disable dcd/hcd interrupt
+ qhdl->interrupt_set(false);
+}
+
+// unlock queue
+TU_ATTR_ALWAYS_INLINE static inline void _osal_q_unlock(osal_queue_t qhdl)
+{
+ // enable dcd/hcd interrupt
+ qhdl->interrupt_set(true);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef)
+{
+ tu_fifo_clear(&qdef->ff);
+ return (osal_queue_t) qdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec)
+{
+ (void) msec; // not used, always behave as msec = 0
+
+ _osal_q_lock(qhdl);
+ bool success = tu_fifo_read(&qhdl->ff, data);
+ _osal_q_unlock(qhdl);
+
+ return success;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const * data, bool in_isr)
+{
+ if (!in_isr) {
+ _osal_q_lock(qhdl);
+ }
+
+ bool success = tu_fifo_write(&qhdl->ff, data);
+
+ if (!in_isr) {
+ _osal_q_unlock(qhdl);
+ }
+
+ TU_ASSERT(success);
+
+ return success;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl)
+{
+ // Skip queue lock/unlock since this function is primarily called
+ // with interrupt disabled before going into low power mode
+ return tu_fifo_empty(&qhdl->ff);
+}
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_OSAL_NONE_H_ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/tusb.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/tusb.c
new file mode 100644
index 000000000..44b34b0e6
--- /dev/null
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/tinyusb/src/tusb.c
@@ -0,0 +1,523 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "tusb_option.h"
+
+#if CFG_TUH_ENABLED || CFG_TUD_ENABLED
+
+#include "tusb.h"
+#include "common/tusb_private.h"
+
+#if CFG_TUD_ENABLED
+#include "device/usbd_pvt.h"
+#endif
+
+#if CFG_TUH_ENABLED
+#include "host/usbh_classdriver.h"
+#endif
+
+//--------------------------------------------------------------------+
+// Public API
+//--------------------------------------------------------------------+
+
+bool tusb_init(void)
+{
+#if CFG_TUD_ENABLED && defined(TUD_OPT_RHPORT)
+ // init device stack CFG_TUSB_RHPORTx_MODE must be defined
+ TU_ASSERT ( tud_init(TUD_OPT_RHPORT) );
+#endif
+
+#if CFG_TUH_ENABLED && defined(TUH_OPT_RHPORT)
+ // init host stack CFG_TUSB_RHPORTx_MODE must be defined
+ TU_ASSERT( tuh_init(TUH_OPT_RHPORT) );
+#endif
+
+ return true;
+}
+
+bool tusb_inited(void)
+{
+ bool ret = false;
+
+#if CFG_TUD_ENABLED
+ ret = ret || tud_inited();
+#endif
+
+#if CFG_TUH_ENABLED
+ ret = ret || tuh_inited();
+#endif
+
+ return ret;
+}
+
+//--------------------------------------------------------------------+
+// Descriptor helper
+//--------------------------------------------------------------------+
+
+uint8_t const * tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1)
+{
+ while(desc+1 < end)
+ {
+ if ( desc[1] == byte1 ) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+uint8_t const * tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2)
+{
+ while(desc+2 < end)
+ {
+ if ( desc[1] == byte1 && desc[2] == byte2) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+uint8_t const * tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3)
+{
+ while(desc+3 < end)
+ {
+ if (desc[1] == byte1 && desc[2] == byte2 && desc[3] == byte3) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------+
+// Endpoint Helper for both Host and Device stack
+//--------------------------------------------------------------------+
+
+bool tu_edpt_claim(tu_edpt_state_t* ep_state, osal_mutex_t mutex)
+{
+ (void) mutex;
+
+ // pre-check to help reducing mutex lock
+ TU_VERIFY((ep_state->busy == 0) && (ep_state->claimed == 0));
+ (void) osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);
+
+ // can only claim the endpoint if it is not busy and not claimed yet.
+ bool const available = (ep_state->busy == 0) && (ep_state->claimed == 0);
+ if (available)
+ {
+ ep_state->claimed = 1;
+ }
+
+ (void) osal_mutex_unlock(mutex);
+
+ return available;
+}
+
+bool tu_edpt_release(tu_edpt_state_t* ep_state, osal_mutex_t mutex)
+{
+ (void) mutex;
+
+ (void) osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);
+
+ // can only release the endpoint if it is claimed and not busy
+ bool const ret = (ep_state->claimed == 1) && (ep_state->busy == 0);
+ if (ret)
+ {
+ ep_state->claimed = 0;
+ }
+
+ (void) osal_mutex_unlock(mutex);
+
+ return ret;
+}
+
+bool tu_edpt_validate(tusb_desc_endpoint_t const * desc_ep, tusb_speed_t speed)
+{
+ uint16_t const max_packet_size = tu_edpt_packet_size(desc_ep);
+ TU_LOG2(" Open EP %02X with Size = %u\r\n", desc_ep->bEndpointAddress, max_packet_size);
+
+ switch (desc_ep->bmAttributes.xfer)
+ {
+ case TUSB_XFER_ISOCHRONOUS:
+ {
+ uint16_t const spec_size = (speed == TUSB_SPEED_HIGH ? 1024 : 1023);
+ TU_ASSERT(max_packet_size <= spec_size);
+ }
+ break;
+
+ case TUSB_XFER_BULK:
+ if (speed == TUSB_SPEED_HIGH)
+ {
+ // Bulk highspeed must be EXACTLY 512
+ TU_ASSERT(max_packet_size == 512);
+ }else
+ {
+ // TODO Bulk fullspeed can only be 8, 16, 32, 64
+ TU_ASSERT(max_packet_size <= 64);
+ }
+ break;
+
+ case TUSB_XFER_INTERRUPT:
+ {
+ uint16_t const spec_size = (speed == TUSB_SPEED_HIGH ? 1024 : 64);
+ TU_ASSERT(max_packet_size <= spec_size);
+ }
+ break;
+
+ default: return false;
+ }
+
+ return true;
+}
+
+void tu_edpt_bind_driver(uint8_t ep2drv[][2], tusb_desc_interface_t const* desc_itf, uint16_t desc_len, uint8_t driver_id)
+{
+ uint8_t const* p_desc = (uint8_t const*) desc_itf;
+ uint8_t const* desc_end = p_desc + desc_len;
+
+ while( p_desc < desc_end )
+ {
+ if ( TUSB_DESC_ENDPOINT == tu_desc_type(p_desc) )
+ {
+ uint8_t const ep_addr = ((tusb_desc_endpoint_t const*) p_desc)->bEndpointAddress;
+
+ TU_LOG(2, " Bind EP %02x to driver id %u\r\n", ep_addr, driver_id);
+ ep2drv[tu_edpt_number(ep_addr)][tu_edpt_dir(ep_addr)] = driver_id;
+ }
+
+ p_desc = tu_desc_next(p_desc);
+ }
+}
+
+uint16_t tu_desc_get_interface_total_len(tusb_desc_interface_t const* desc_itf, uint8_t itf_count, uint16_t max_len)
+{
+ uint8_t const* p_desc = (uint8_t const*) desc_itf;
+ uint16_t len = 0;
+
+ while (itf_count--)
+ {
+ // Next on interface desc
+ len += tu_desc_len(desc_itf);
+ p_desc = tu_desc_next(p_desc);
+
+ while (len < max_len)
+ {
+ // return on IAD regardless of itf count
+ if ( tu_desc_type(p_desc) == TUSB_DESC_INTERFACE_ASSOCIATION ) return len;
+
+ if ( (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE) &&
+ ((tusb_desc_interface_t const*) p_desc)->bAlternateSetting == 0 )
+ {
+ break;
+ }
+
+ len += tu_desc_len(p_desc);
+ p_desc = tu_desc_next(p_desc);
+ }
+ }
+
+ return len;
+}
+
+//--------------------------------------------------------------------+
+// Endpoint Stream Helper for both Host and Device stack
+//--------------------------------------------------------------------+
+
+bool tu_edpt_stream_init(tu_edpt_stream_t* s, bool is_host, bool is_tx, bool overwritable,
+ void* ff_buf, uint16_t ff_bufsize, uint8_t* ep_buf, uint16_t ep_bufsize)
+{
+ osal_mutex_t new_mutex = osal_mutex_create(&s->ff_mutex);
+ (void) new_mutex;
+ (void) is_tx;
+
+ s->is_host = is_host;
+ tu_fifo_config(&s->ff, ff_buf, ff_bufsize, 1, overwritable);
+ tu_fifo_config_mutex(&s->ff, is_tx ? new_mutex : NULL, is_tx ? NULL : new_mutex);
+
+ s->ep_buf = ep_buf;
+ s->ep_bufsize = ep_bufsize;
+
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline
+bool stream_claim(tu_edpt_stream_t* s)
+{
+ if (s->is_host)
+ {
+ #if CFG_TUH_ENABLED
+ return usbh_edpt_claim(s->daddr, s->ep_addr);
+ #endif
+ }else
+ {
+ #if CFG_TUD_ENABLED
+ return usbd_edpt_claim(s->rhport, s->ep_addr);
+ #endif
+ }
+
+ return false;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline
+bool stream_xfer(tu_edpt_stream_t* s, uint16_t count)
+{
+ if (s->is_host)
+ {
+ #if CFG_TUH_ENABLED
+ return usbh_edpt_xfer(s->daddr, s->ep_addr, count ? s->ep_buf : NULL, count);
+ #endif
+ }else
+ {
+ #if CFG_TUD_ENABLED
+ return usbd_edpt_xfer(s->rhport, s->ep_addr, count ? s->ep_buf : NULL, count);
+ #endif
+ }
+
+ return false;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline
+bool stream_release(tu_edpt_stream_t* s)
+{
+ if (s->is_host)
+ {
+ #if CFG_TUH_ENABLED
+ return usbh_edpt_release(s->daddr, s->ep_addr);
+ #endif
+ }else
+ {
+ #if CFG_TUD_ENABLED
+ return usbd_edpt_release(s->rhport, s->ep_addr);
+ #endif
+ }
+
+ return false;
+}
+
+//--------------------------------------------------------------------+
+// Stream Write
+//--------------------------------------------------------------------+
+
+bool tu_edpt_stream_write_zlp_if_needed(tu_edpt_stream_t* s, uint32_t last_xferred_bytes)
+{
+ // ZLP condition: no pending data, last transferred bytes is multiple of packet size
+ TU_VERIFY( !tu_fifo_count(&s->ff) && last_xferred_bytes && (0 == (last_xferred_bytes & (s->ep_packetsize-1))) );
+
+ TU_VERIFY( stream_claim(s) );
+ TU_ASSERT( stream_xfer(s, 0) );
+
+ return true;
+}
+
+uint32_t tu_edpt_stream_write_xfer(tu_edpt_stream_t* s)
+{
+ // skip if no data
+ TU_VERIFY( tu_fifo_count(&s->ff), 0 );
+
+ // Claim the endpoint
+ TU_VERIFY( stream_claim(s), 0 );
+
+ // Pull data from FIFO -> EP buf
+ uint16_t const count = tu_fifo_read_n(&s->ff, s->ep_buf, s->ep_bufsize);
+
+ if ( count )
+ {
+ TU_ASSERT( stream_xfer(s, count), 0 );
+ return count;
+ }else
+ {
+ // Release endpoint since we don't make any transfer
+ // Note: data is dropped if terminal is not connected
+ stream_release(s);
+ return 0;
+ }
+}
+
+uint32_t tu_edpt_stream_write(tu_edpt_stream_t* s, void const *buffer, uint32_t bufsize)
+{
+ TU_VERIFY(bufsize); // TODO support ZLP
+
+ uint16_t ret = tu_fifo_write_n(&s->ff, buffer, (uint16_t) bufsize);
+
+ // flush if fifo has more than packet size or
+ // in rare case: fifo depth is configured too small (which never reach packet size)
+ if ( (tu_fifo_count(&s->ff) >= s->ep_packetsize) || (tu_fifo_depth(&s->ff) < s->ep_packetsize) )
+ {
+ tu_edpt_stream_write_xfer(s);
+ }
+
+ return ret;
+}
+
+//--------------------------------------------------------------------+
+// Stream Read
+//--------------------------------------------------------------------+
+
+uint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t* s)
+{
+ uint16_t available = tu_fifo_remaining(&s->ff);
+
+ // Prepare for incoming data but only allow what we can store in the ring buffer.
+ // TODO Actually we can still carry out the transfer, keeping count of received bytes
+ // and slowly move it to the FIFO when read().
+ // This pre-check reduces endpoint claiming
+ TU_VERIFY(available >= s->ep_packetsize);
+
+ // claim endpoint
+ TU_VERIFY(stream_claim(s), 0);
+
+ // get available again since fifo can be changed before endpoint is claimed
+ available = tu_fifo_remaining(&s->ff);
+
+ if ( available >= s->ep_packetsize )
+ {
+ // multiple of packet size limit by ep bufsize
+ uint16_t count = (uint16_t) (available & ~(s->ep_packetsize -1));
+ count = tu_min16(count, s->ep_bufsize);
+
+ TU_ASSERT( stream_xfer(s, count), 0 );
+
+ return count;
+ }else
+ {
+ // Release endpoint since we don't make any transfer
+ stream_release(s);
+ return 0;
+ }
+}
+
+uint32_t tu_edpt_stream_read(tu_edpt_stream_t* s, void* buffer, uint32_t bufsize)
+{
+ uint32_t num_read = tu_fifo_read_n(&s->ff, buffer, (uint16_t) bufsize);
+ tu_edpt_stream_read_xfer(s);
+ return num_read;
+}
+
+//--------------------------------------------------------------------+
+// Debug
+//--------------------------------------------------------------------+
+
+#if CFG_TUSB_DEBUG
+#include
+
+#if CFG_TUSB_DEBUG >= 2
+
+char const* const tu_str_speed[] = { "Full", "Low", "High" };
+char const* const tu_str_std_request[] =
+{
+ "Get Status" ,
+ "Clear Feature" ,
+ "Reserved" ,
+ "Set Feature" ,
+ "Reserved" ,
+ "Set Address" ,
+ "Get Descriptor" ,
+ "Set Descriptor" ,
+ "Get Configuration" ,
+ "Set Configuration" ,
+ "Get Interface" ,
+ "Set Interface" ,
+ "Synch Frame"
+};
+
+#endif
+
+static void dump_str_line(uint8_t const* buf, uint16_t count)
+{
+ tu_printf(" |");
+
+ // each line is 16 bytes
+ for(uint16_t i=0; i 64
+ #error Control Endpoint Max Packet Size cannot be larger than 64
+#endif
+
+// To avoid GCC compiler warnings when -pedantic option is used (strict ISO C)
+typedef int make_iso_compilers_happy;
+
+#endif /* _TUSB_OPTION_H_ */
+
+/** @} */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.c
deleted file mode 100644
index cc1f57571..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.c
+++ /dev/null
@@ -1,200 +0,0 @@
-//*****************************************************************************
-//
-// usb_bulk_structs.c - Data structures defining this bulk USB device.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the DK-TM4C123G Firmware Package.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usb-ids.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdbulk.h"
-#include "usb_bulk_structs.h"
-
-//*****************************************************************************
-//
-// The languages supported by this device.
-//
-//*****************************************************************************
-const uint8_t g_pui8LangDescriptor[] =
-{
- 4,
- USB_DTYPE_STRING,
- USBShort(USB_LANG_EN_US)
-};
-
-//*****************************************************************************
-//
-// The manufacturer string.
-//
-//*****************************************************************************
-const uint8_t g_pui8ManufacturerString[] =
-{
- (12 + 1) * 2,
- USB_DTYPE_STRING,
- 'O', 0, 'p', 0, 'e', 0, 'n', 0, 'B', 0, 'L', 0, 'T', 0,
- ' ', 0, 'U', 0, 's', 0, 'e', 0, 'r', 0
-};
-
-//*****************************************************************************
-//
-// The product string.
-//
-//*****************************************************************************
-const uint8_t g_pui8ProductString[] =
-{
- (18 + 1) * 2,
- USB_DTYPE_STRING,
- 'W', 0, 'i', 0, 'n', 0, 'U', 0, 'S', 0, 'B', 0, ' ', 0,
- 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0,
- 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0
-};
-
-//*****************************************************************************
-//
-// The serial number string.
-//
-//*****************************************************************************
-const uint8_t g_pui8SerialNumberString[] =
-{
- (8 + 1) * 2,
- USB_DTYPE_STRING,
- '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0
-};
-
-//*****************************************************************************
-//
-// The data interface description string.
-//
-//*****************************************************************************
-const uint8_t g_pui8DataInterfaceString[] =
-{
- (21 + 1) * 2,
- USB_DTYPE_STRING,
- 'W', 0, 'i', 0, 'n', 0, 'U', 0, 'S', 0, 'B', 0, ' ', 0,
- 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0,
- 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0
-};
-
-//*****************************************************************************
-//
-// The configuration description string.
-//
-//*****************************************************************************
-const uint8_t g_pui8ConfigString[] =
-{
- (23 + 1) * 2,
- USB_DTYPE_STRING,
- 'B', 0, 'u', 0, 'l', 0, 'k', 0, ' ', 0, 'D', 0, 'a', 0, 't', 0,
- 'a', 0, ' ', 0, 'C', 0, 'o', 0, 'n', 0, 'f', 0, 'i', 0, 'g', 0,
- 'u', 0, 'r', 0, 'a', 0, 't', 0, 'i', 0, 'o', 0, 'n', 0
-};
-
-//*****************************************************************************
-//
-// The descriptor string table.
-//
-//*****************************************************************************
-const uint8_t *const g_ppui8StringDescriptors[] =
-{
- g_pui8LangDescriptor,
- g_pui8ManufacturerString,
- g_pui8ProductString,
- g_pui8SerialNumberString,
- g_pui8DataInterfaceString,
- g_pui8ConfigString
-};
-
-#define NUM_STRING_DESCRIPTORS (sizeof(g_ppui8StringDescriptors) / \
- sizeof(uint8_t *))
-
-//*****************************************************************************
-//
-// The bulk device initialization and customization structures. In this case,
-// we are using USBBuffers between the bulk device class driver and the
-// application code. The function pointers and callback data values are set
-// to insert a buffer in each of the data channels, transmit and receive.
-//
-// With the buffer in place, the bulk channel callback is set to the relevant
-// channel function and the callback data is set to point to the channel
-// instance data. The buffer, in turn, has its callback set to the application
-// function and the callback data set to our bulk instance structure.
-//
-//*****************************************************************************
-extern const tUSBBuffer g_sTxBuffer;
-extern const tUSBBuffer g_sRxBuffer;
-
-tUSBDBulkDevice g_sBulkDevice =
-{
- 0x1d50,
- 0x60ac,
- 500,
- USB_CONF_ATTR_SELF_PWR,
- USBBufferEventCallback,
- (void *)&g_sRxBuffer,
- USBBufferEventCallback,
- (void *)&g_sTxBuffer,
- g_ppui8StringDescriptors,
- NUM_STRING_DESCRIPTORS
-};
-
-//*****************************************************************************
-//
-// Receive buffer (from the USB perspective).
-//
-//*****************************************************************************
-uint8_t g_pui8USBRxBuffer[BULK_BUFFER_SIZE];
-uint8_t g_pui8RxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE];
-const tUSBBuffer g_sRxBuffer =
-{
- false, // This is a receive buffer.
- UsbBulkRxHandler, // pfnCallback
- (void *)&g_sBulkDevice, // Callback data is our device pointer.
- USBDBulkPacketRead, // pfnTransfer
- USBDBulkRxPacketAvailable, // pfnAvailable
- (void *)&g_sBulkDevice, // pvHandle
- g_pui8USBRxBuffer, // pi8Buffer
- BULK_BUFFER_SIZE, // ui32BufferSize
- g_pui8RxBufferWorkspace // pvWorkspace
-};
-
-//*****************************************************************************
-//
-// Transmit buffer (from the USB perspective).
-//
-//*****************************************************************************
-uint8_t g_pui8USBTxBuffer[BULK_BUFFER_SIZE];
-uint8_t g_pui8TxBufferWorkspace[USB_BUFFER_WORKSPACE_SIZE];
-const tUSBBuffer g_sTxBuffer =
-{
- true, // This is a transmit buffer.
- UsbBulkTxHandler, // pfnCallback
- (void *)&g_sBulkDevice, // Callback data is our device pointer.
- USBDBulkPacketWrite, // pfnTransfer
- USBDBulkTxPacketAvailable, // pfnAvailable
- (void *)&g_sBulkDevice, // pvHandle
- g_pui8USBTxBuffer, // pi8Buffer
- BULK_BUFFER_SIZE, // ui32BufferSize
- g_pui8TxBufferWorkspace // pvWorkspace
-};
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.h
deleted file mode 100644
index 689b851e6..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/config/usb_bulk_structs.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//*****************************************************************************
-//
-// usb_bulk_structs.h - Data structures defining this bulk USB device.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the DK-TM4C123G Firmware Package.
-//
-//*****************************************************************************
-
-#ifndef _USB_BULK_STRUCTS_H_
-#define _USB_BULK_STRUCTS_H_
-
-//*****************************************************************************
-//
-// The size of the transmit and receive buffers used. 256 is chosen pretty
-// much at random though the buffer should be at least twice the size of
-// a maximum-sized USB packet.
-//
-//*****************************************************************************
-#define BULK_BUFFER_SIZE 64
-
-extern uint32_t UsbBulkRxHandler(void *pvCBData, uint32_t ui32Event,
- uint32_t ui32MsgValue, void *pvMsgData);
-extern uint32_t UsbBulkTxHandler(void *pvi32CBData, uint32_t ui32Event,
- uint32_t ui32MsgValue, void *pvMsgData);
-
-extern const tUSBBuffer g_sTxBuffer;
-extern const tUSBBuffer g_sRxBuffer;
-extern tUSBDBulkDevice g_sBulkDevice;
-extern uint8_t g_pui8USBTxBuffer[];
-extern uint8_t g_pui8USBRxBuffer[];
-
-#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.c
deleted file mode 100644
index 5a95cc718..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.c
+++ /dev/null
@@ -1,1474 +0,0 @@
-//*****************************************************************************
-//
-// usbdaudio.c - USB audio device class driver.
-//
-// Copyright (c) 2009-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbaudio.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdaudio.h"
-
-//*****************************************************************************
-//
-//! \addtogroup audio_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// The following are the USB audio descriptor identifiers.
-//
-//*****************************************************************************
-#define AUDIO_IN_TERMINAL_ID 1
-#define AUDIO_OUT_TERMINAL_ID 2
-#define AUDIO_CONTROL_ID 3
-
-//*****************************************************************************
-//
-// The following are the USB interface numbers for this audio device.
-//
-//*****************************************************************************
-#define AUDIO_INTERFACE_CONTROL 0
-#define AUDIO_INTERFACE_OUTPUT 1
-
-//*****************************************************************************
-//
-// Endpoints to use for each of the required endpoints in the driver.
-//
-//*****************************************************************************
-#define ISOC_OUT_ENDPOINT USB_EP_1
-
-//*****************************************************************************
-//
-// Max size is (48000 samples/sec * 4 bytes/sample) * 0.001 seconds/frame.
-//
-//*****************************************************************************
-#define ISOC_OUT_EP_MAX_SIZE ((48000*4)/1000)
-
-//*****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//*****************************************************************************
-static uint8_t g_pui8AudioDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- 0, // USB Device Class (spec 5.1.1)
- 0, // USB Device Sub-class (spec 5.1.1)
- 0, // USB Device protocol (spec 5.1.1)
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (filled in during USBDAudioInit).
- USBShort(0), // Product ID (filled in during USBDAudioInit).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// Audio class device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-static uint8_t g_pui8AudioDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(32), // The total size of this full structure.
- 2, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 0, // The string identifier that describes this
- // configuration.
- USB_CONF_ATTR_BUS_PWR, // Bus Powered, Self Powered, remote wake up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// This is the Interface Association Descriptor for the serial device used in
-// composite devices.
-//
-//*****************************************************************************
-uint8_t g_pui8IADAudioDescriptor[AUDIODESCRIPTOR_SIZE] =
-{
-
- 8, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE_ASC, // Interface Association Type.
- 0x0, // Default starting interface is 0.
- 0x2, // Number of interfaces in this association.
- USB_CLASS_AUDIO, // The device class for this association.
- USB_SUBCLASS_UNDEFINED, // The device subclass for this association.
- USB_PROTOCOL_UNDEFINED, // The protocol for this association.
- 0 // The string index for this association.
-};
-
-const tConfigSection g_sIADAudioConfigSection =
-{
- sizeof(g_pui8IADAudioDescriptor),
- g_pui8IADAudioDescriptor
-};
-
-//*****************************************************************************
-//
-// The remainder of the configuration descriptor is stored in flash since we
-// don't need to modify anything in it at runtime.
-//
-//*****************************************************************************
-const uint8_t g_pui8AudioControlInterface[CONTROLINTERFACE_SIZE] =
-{
- //
- // Vendor-specific Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- AUDIO_INTERFACE_CONTROL, // The index for this interface.
- 0, // The alternate setting for this interface.
- 0, // The number of endpoints used by this
- // interface.
- USB_CLASS_AUDIO, // The interface class
- USB_ASC_AUDIO_CONTROL, // The interface sub-class.
- 0, // The interface protocol for the sub-class
- // specified above.
- 0, // The string index for this interface.
-
- //
- // Audio Header Descriptor.
- //
- 9, // The size of this descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ACDSTYPE_HEADER, // Descriptor sub-type is HEADER.
- USBShort(0x0100), // Audio Device Class Specification Release
- // Number in Binary-Coded Decimal.
- // Total number of bytes in
- // g_pui8AudioControlInterface
- USBShort((9 + 9 + 12 + 13 + 9)),
- 1, // Number of streaming interfaces.
- 1, // Index of the first and only streaming
- // interface.
-
- //
- // Audio Input Terminal Descriptor.
- //
- 12, // The size of this descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ACDSTYPE_IN_TERMINAL, // Descriptor sub-type is INPUT_TERMINAL.
- AUDIO_IN_TERMINAL_ID, // Terminal ID for this interface.
- // USB streaming interface.
- USBShort(USB_TTYPE_STREAMING),
- 0, // ID of the Output Terminal to which this
- // Input Terminal is associated.
- 2, // Number of logical output channels in the
- // Terminal's output audio channel cluster.
- USBShort((USB_CHANNEL_L | // Describes the spatial location of the
- USB_CHANNEL_R)), // logical channels.
- 0, // Channel Name string index.
- 0, // Terminal Name string index.
-
- //
- // Audio Feature Unit Descriptor
- //
- 13, // The size of this descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ACDSTYPE_FEATURE_UNIT, // Descriptor sub-type is FEATURE_UNIT.
- AUDIO_CONTROL_ID, // Unit ID for this interface.
- AUDIO_IN_TERMINAL_ID, // ID of the Unit or Terminal to which this
- // Feature Unit is connected.
- 2, // Size in bytes of an element of the
- // bmaControls() array that follows.
- // Master Mute control.
- USBShort(USB_ACONTROL_MUTE),
- // Left channel volume control.
- USBShort(USB_ACONTROL_VOLUME),
- // Right channel volume control.
- USBShort(USB_ACONTROL_VOLUME),
- 0, // Feature unit string index.
-
- //
- // Audio Output Terminal Descriptor.
- //
- 9, // The size of this descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ACDSTYPE_OUT_TERMINAL, // Descriptor sub-type is INPUT_TERMINAL.
- AUDIO_OUT_TERMINAL_ID, // Terminal ID for this interface.
- // Output type is a generic speaker.
- USBShort(USB_ATTYPE_SPEAKER),
- AUDIO_IN_TERMINAL_ID, // ID of the input terminal to which this
- // output terminal is connected.
- AUDIO_CONTROL_ID, // ID of the feature unit that this output
- // terminal is connected to.
- 0, // Output terminal string index.
-
-};
-
-//*****************************************************************************
-//
-// The audio streaming interface descriptor. This describes the two valid
-// interfaces for this class. The first interface has no endpoints and is used
-// by host operating systems to put the device in idle mode, while the second
-// is used when the audio device is active.
-//
-//*****************************************************************************
-const uint8_t g_pui8AudioStreamInterface[STREAMINTERFACE_SIZE] =
-{
- //
- // Vendor-specific Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- AUDIO_INTERFACE_OUTPUT, // The index for this interface.
- 0, // The alternate setting for this interface.
- 0, // The number of endpoints used by this
- // interface.
- USB_CLASS_AUDIO, // The interface class
- USB_ASC_AUDIO_STREAMING, // The interface sub-class.
- 0, // Unused must be 0.
- 0, // The string index for this interface.
-
- //
- // Vendor-specific Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- 1, // The index for this interface.
- 1, // The alternate setting for this interface.
- 1, // The number of endpoints used by this
- // interface.
- USB_CLASS_AUDIO, // The interface class
- USB_ASC_AUDIO_STREAMING, // The interface sub-class.
- 0, // Unused must be 0.
- 0, // The string index for this interface.
-
- //
- // Class specific Audio Streaming Interface descriptor.
- //
- 7, // Size of the interface descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ASDSTYPE_GENERAL, // General information.
- AUDIO_IN_TERMINAL_ID, // ID of the terminal to which this streaming
- // interface is connected.
- 1, // One frame delay.
- USBShort(USB_ADF_PCM), //
-
- //
- // Format type Audio Streaming descriptor.
- //
- 11, // Size of the interface descriptor.
- USB_DTYPE_CS_INTERFACE, // Interface descriptor is class specific.
- USB_ASDSTYPE_FORMAT_TYPE, // Audio Streaming format type.
- USB_AF_TYPE_TYPE_I, // Type I audio format type.
- 2, // Two audio channels.
- 2, // Two bytes per audio sub-frame.
- 16, // 16 bits per sample.
- 1, // One sample rate provided.
- USB3Byte(48000), // Only 48000 sample rate supported.
-
- //
- // Endpoint Descriptor
- //
- 9, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- // OUT endpoint with address
- // ISOC_OUT_ENDPOINT.
- USB_EP_DESC_OUT | USBEPToIndex(ISOC_OUT_ENDPOINT),
- USB_EP_ATTR_ISOC | // Endpoint is an adaptive isochronous data
- USB_EP_ATTR_ISOC_ADAPT | // endpoint.
- USB_EP_ATTR_USAGE_DATA,
- USBShort(ISOC_OUT_EP_MAX_SIZE), // The maximum packet size.
- 1, // The polling interval for this endpoint.
- 0, // Refresh is unused.
- 0, // Synch endpoint address.
-
- //
- // Audio Streaming Isochronous Audio Data Endpoint Descriptor
- //
- 7, // The size of the descriptor.
- USB_ACSDT_ENDPOINT, // Audio Class Specific Endpoint
- // Descriptor.
- USB_ASDSTYPE_GENERAL, // This is a general descriptor.
- USB_EP_ATTR_ACG_SAMPLING, // Sampling frequency is supported.
- USB_EP_LOCKDELAY_UNDEF, // Undefined lock delay units.
- USBShort(0), // No lock delay.
-};
-
-//*****************************************************************************
-//
-// The audio device configuration descriptor is defined as three sections,
-// one containing just the 9 byte USB configuration descriptor. The second
-// holds the audio streaming interface and the third holds the audio control
-// interface.
-//
-//*****************************************************************************
-const tConfigSection g_sAudioConfigSection =
-{
- sizeof(g_pui8AudioDescriptor),
- g_pui8AudioDescriptor
-};
-
-const tConfigSection g_sAudioStreamInterfaceSection =
-{
- sizeof(g_pui8AudioStreamInterface),
- g_pui8AudioStreamInterface
-};
-
-const tConfigSection g_sAudioControlInterfaceSection =
-{
- sizeof(g_pui8AudioControlInterface),
- g_pui8AudioControlInterface
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete audio device configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psAudioSections[] =
-{
- &g_sAudioConfigSection,
- &g_sIADAudioConfigSection,
- &g_sAudioControlInterfaceSection,
- &g_sAudioStreamInterfaceSection
-};
-
-#define NUM_AUDIO_SECTIONS (sizeof(g_psAudioSections) / \
- sizeof(g_psAudioSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor.
-//
-//*****************************************************************************
-const tConfigHeader g_sAudioConfigHeader =
-{
- NUM_AUDIO_SECTIONS,
- g_psAudioSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppAudioConfigDescriptors[] =
-{
- &g_sAudioConfigHeader
-};
-
-//*****************************************************************************
-//
-// Various internal handlers needed by this class.
-//
-//*****************************************************************************
-static void HandleDisconnect(void *pvAudioDevice);
-static void InterfaceChange(void *pvAudioDevice, uint8_t ui8Interface,
- uint8_t ui8AlternateSetting);
-static void ConfigChangeHandler(void *pvAudioDevice, uint32_t ui32Value);
-static void DataReceived(void *pvAudioDevice, uint32_t ui32Info);
-static void HandleEndpoints(void *pvAudioDevice, uint32_t ui32Status);
-static void HandleRequests(void *pvAudioDevice, tUSBRequest *psUSBRequest);
-static void HandleDevice(void *pvAudioDevice, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// The device information structure for the USB Audio device.
-//
-//*****************************************************************************
-static const tCustomHandlers g_sAudioHandlers =
-{
- //
- // GetDescriptor
- //
- 0,
-
- //
- // RequestHandler
- //
- HandleRequests,
-
- //
- // InterfaceChange
- //
- InterfaceChange,
-
- //
- // ConfigChange
- //
- ConfigChangeHandler,
-
- //
- // DataReceived
- //
- DataReceived,
-
- //
- // DataSentCallback
- //
- 0,
-
- //
- // ResetHandler
- //
- 0,
-
- //
- // SuspendHandler
- //
- 0,
-
- //
- // ResumeHandler
- //
- 0,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // Device handler
- //
- HandleDevice
-};
-
-//*****************************************************************************
-//
-// This function is called to handle data being received back from the host so
-// that the application callback can be called when the new data is ready.
-//
-//*****************************************************************************
-static void
-DataReceived(void *pvAudioDevice, uint32_t ui32Info)
-{
- tAudioInstance *psInst;
- tUSBDAudioDevice *psAudioDevice;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // Create the instance pointer.
- //
- psAudioDevice = (tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Make a copy of this pointer for ease of use in this function.
- //
- psInst = &psAudioDevice->sPrivateData;
-
- //
- // If there is an update pending and the request was to set a current
- // value then check which value was set.
- //
- if(psInst->ui16Update && (psInst->ui8Request == USB_AC_SET_CUR))
- {
- //
- // Only handling interface requests.
- //
- if((psInst->ui16RequestType & USB_RTYPE_RECIPIENT_M) ==
- USB_RTYPE_INTERFACE)
- {
- if(psInst->ui16Update == VOLUME_CONTROL)
- {
- //
- // Inform the callback of the new volume.
- //
- psAudioDevice->pfnCallback(0, USBD_AUDIO_EVENT_VOLUME,
- psInst->i16Volume, 0);
- }
- else if(psAudioDevice->sPrivateData.ui16Update == MUTE_CONTROL)
- {
- //
- // Inform the callback of the new data.
- //
- psAudioDevice->pfnCallback(0, USBD_AUDIO_EVENT_MUTE,
- psInst->ui8Mute, 0);
- }
- }
- psInst->ui16Update = 0;
- }
-}
-
-//*****************************************************************************
-//
-// This function is called to handle the interrupts on the isochronous endpoint
-// for the audio device class.
-//
-//*****************************************************************************
-static void
-HandleEndpoints(void *pvAudioDevice, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus;
- tAudioInstance *psInst;
- tUSBDAudioDevice *psAudioDevice;
- uint32_t ui32Size;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Create a pointer to the audio instance data.
- //
- psInst = &psAudioDevice->sPrivateData;
-
- //
- // Read out the current endpoint status.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, psInst->ui8OUTEndpoint);
-
- //
- // See if there is a receive interrupt pending.
- //
- if(ui32Status & (0x10000 << USBEPToIndex(psInst->ui8OUTEndpoint)))
- {
- //
- // Get the amount of data available in the FIFO.
- //
- ui32Size = USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(USB0_BASE, psInst->ui8OUTEndpoint,
- ui32EPStatus);
-
- //
- // Configure the next DMA transfer.
- //
- USBLibDMATransfer(psInst->psDMAInstance, psInst->ui8OUTDMA,
- psInst->sBuffer.pvData, ui32Size);
- }
- else if((USBLibDMAChannelStatus(psInst->psDMAInstance,
- psInst->ui8OUTDMA) ==
- USBLIBSTATUS_DMA_COMPLETE))
- {
- USBEndpointDMADisable(USB0_BASE,
- psInst->ui8OUTEndpoint, USB_EP_DEV_OUT);
-
- //
- // Acknowledge that the data was read, this will not cause a bus
- // acknowledgment.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, psInst->ui8OUTEndpoint, 0);
-
- //
- // Inform the callback of the new data.
- //
- psInst->sBuffer.pfnCallback(psInst->sBuffer.pvData,
- psInst->sBuffer.ui32Size,
- USBD_AUDIO_EVENT_DATAOUT);
- }
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvAudioDevice, uint32_t ui32Request, void *pvRequestData)
-{
- tAudioInstance *psInst;
- uint8_t *pui8Data;
- tUSBDAudioDevice *psAudioDevice;
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Create a pointer to the audio instance data.
- //
- psInst = &psAudioDevice->sPrivateData;
-
- //
- // Create the 8-bit array used by the events supported by the USB CDC
- // serial class.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- //
- // Save the change to the appropriate interface number.
- //
- if(pui8Data[0] == AUDIO_INTERFACE_CONTROL)
- {
- psInst->ui8InterfaceControl = pui8Data[1];
- }
- else if(pui8Data[0] == AUDIO_INTERFACE_OUTPUT)
- {
- psInst->ui8InterfaceAudio = pui8Data[1];
- }
- break;
- }
-
- //
- // This was an endpoint change event.
- //
- case USB_EVENT_COMP_EP_CHANGE:
- {
- //
- // Determine if this is an IN or OUT endpoint that has changed.
- //
- if((pui8Data[0] & USB_EP_DESC_IN) == 0)
- {
- //
- // Extract the new endpoint number without the DIR bit.
- //
- psInst->ui8OUTEndpoint = IndexToUSBEP(pui8Data[1] & 0x7f);
-
- //
- // If the DMA channel has already been allocated then clear
- // that channel and prepare to possibly use a new one.
- //
- if(psInst->ui8OUTDMA != 0)
- {
- USBLibDMAChannelRelease(psInst->psDMAInstance,
- psInst->ui8OUTDMA);
- }
-
- //
- // Allocate a DMA channel to the endpoint.
- //
- psInst->ui8OUTDMA =
- USBLibDMAChannelAllocate(psInst->psDMAInstance,
- psInst->ui8OUTEndpoint,
- ISOC_OUT_EP_MAX_SIZE,
- (USB_DMA_EP_RX |
- USB_DMA_EP_TYPE_ISOC |
- USB_DMA_EP_DEVICE));
-
- //
- // Set the DMA individual transfer size.
- //
- USBLibDMAUnitSizeSet(psInst->psDMAInstance, psInst->ui8OUTDMA,
- 32);
-
- //
- // Set the DMA arbitration size.
- //
- USBLibDMAArbSizeSet(psInst->psDMAInstance, psInst->ui8OUTDMA,
- 16);
- }
- break;
- }
-
- //
- // Handle class specific reconfiguring of the configuration descriptor
- // once the composite class has built the full descriptor.
- //
- case USB_EVENT_COMP_CONFIG:
- {
- //
- // This sets the bFirstInterface of the Interface Association
- // descriptor to the first interface which is the control
- // interface used by this instance.
- //
- pui8Data[2] = psInst->ui8InterfaceControl;
-
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//*****************************************************************************
-static void
-HandleDisconnect(void *pvAudioDevice)
-{
- const tUSBDAudioDevice *psAudioDevice;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (const tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Inform the application that the device has been disconnected.
- //
- psAudioDevice->pfnCallback(0, USB_EVENT_DISCONNECTED, 0, 0);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device
-// interface changes. This occurs when the audio device transitions between
-// being active and inactive. Interface AUDIO_INTERFACE_CONTROL is the
-// inactive interface that has no endpoints, while interface
-// AUDIO_INTERFACE_AUDIO has the single Isochronous OUT endpoint.
-//
-//*****************************************************************************
-static void
-InterfaceChange(void *pvAudioDevice, uint8_t ui8Interface,
- uint8_t ui8AlternateSetting)
-{
- const tUSBDAudioDevice *psAudioDevice;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (const tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Check which interface to change into.
- //
- if(ui8AlternateSetting == 0)
- {
- //
- // Alternate setting 0 is an inactive state.
- //
- if(psAudioDevice->pfnCallback)
- {
- psAudioDevice->pfnCallback(0, USBD_AUDIO_EVENT_IDLE, 0, 0);
- }
- }
- else
- {
- //
- // Alternate setting 1 is the active state.
- //
- if(psAudioDevice->pfnCallback)
- {
- psAudioDevice->pfnCallback(0, USBD_AUDIO_EVENT_ACTIVE, 0, 0);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device
-// configuration changes.
-//
-//*****************************************************************************
-static void
-ConfigChangeHandler(void *pvAudioDevice, uint32_t ui32Value)
-{
- const tUSBDAudioDevice *psAudioDevice;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (const tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // If we have a control callback, let the client know we are open for
- // business.
- //
- if(psAudioDevice->pfnCallback)
- {
- //
- // Pass the connected event to the client.
- //
- psAudioDevice->pfnCallback(pvAudioDevice, USB_EVENT_CONNECTED, 0, 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function should be called once for the audio class device to
-//! initialized basic operation and prepare for enumeration.
-//!
-//! \param ui32Index is the index of the USB controller to initialize for
-//! audio class device operation.
-//! \param psAudioDevice points to a structure containing parameters
-//! customizing the operation of the audio device.
-//!
-//! In order for an application to initialize the USB audio device class, it
-//! must first call this function with the a valid audio device class structure
-//! in the \e psAudioDevice parameter. This allows this function to initialize
-//! the USB controller and device code to be prepared to enumerate and function
-//! as a USB audio device.
-//!
-//! This function returns a void pointer that must be passed in to all other
-//! APIs used by the audio class.
-//!
-//! See the documentation on the tUSBDAudioDevice structure for more
-//! information on how to properly fill the structure members.
-//!
-//! \return Returns 0 on failure or a non-zero void pointer on success.
-//
-//*****************************************************************************
-void *
-USBDAudioInit(uint32_t ui32Index, tUSBDAudioDevice *psAudioDevice)
-{
- tConfigDescriptor *psConfigDesc;
- tDeviceDescriptor *psDevDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psAudioDevice);
- ASSERT(psAudioDevice->ppui8StringDescriptors);
-
- //
- // Composite Init handles all initialization that is not specific to a
- // multiple instance device.
- //
- USBDAudioCompositeInit(ui32Index, psAudioDevice, 0);
-
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- psDevDesc = (tDeviceDescriptor *)g_pui8AudioDeviceDescriptor;
- psDevDesc->idVendor = psAudioDevice->ui16VID;
- psDevDesc->idProduct = psAudioDevice->ui16PID;
-
- //
- // Fix up the configuration descriptor with client-supplied values.
- //
- psConfigDesc = (tConfigDescriptor *)g_pui8AudioDescriptor;
- psConfigDesc->bmAttributes = psAudioDevice->ui8PwrAttributes;
- psConfigDesc->bMaxPower = (uint8_t)(psAudioDevice->ui16MaxPowermA / 2);
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the bulk device on the bus.
- //
- USBDCDInit(ui32Index, &psAudioDevice->sPrivateData.sDevInfo,
- (void *)psAudioDevice);
-
- //
- // Configure the DMA for the OUT endpoint.
- //
- psAudioDevice->sPrivateData.ui8OUTDMA =
- USBLibDMAChannelAllocate(psAudioDevice->sPrivateData.psDMAInstance,
- psAudioDevice->sPrivateData.ui8OUTEndpoint,
- ISOC_OUT_EP_MAX_SIZE,
- USB_DMA_EP_RX | USB_DMA_EP_TYPE_ISOC |
- USB_DMA_EP_DEVICE);
-
- USBLibDMAUnitSizeSet(psAudioDevice->sPrivateData.psDMAInstance,
- psAudioDevice->sPrivateData.ui8OUTDMA, 32);
- USBLibDMAArbSizeSet(psAudioDevice->sPrivateData.psDMAInstance,
- psAudioDevice->sPrivateData.ui8OUTDMA, 16);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psAudioDevice);
-}
-
-//*****************************************************************************
-//
-//! This function should be called once for the audio class device to
-//! initialized basic operation and prepare for enumeration.
-//!
-//! \param ui32Index is the index of the USB controller to initialize for
-//! audio class device operation.
-//! \param psAudioDevice points to a structure containing parameters
-//! customizing the operation of the audio device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! In order for an application to initialize the USB audio device class, it
-//! must first call this function with the a valid audio device class structure
-//! in the \e psAudioDevice parameter. This allows this function to initialize
-//! the USB controller and device code to be prepared to enumerate and function
-//! as a USB audio device. When this audio device is part of a composite
-//! device, then the \e psCompEntry should point to the composite device entry
-//! to initialize. This is part of the array that is passed to the
-//! USBDCompositeInit() function.
-//!
-//! This function returns a void pointer that must be passed in to all other
-//! APIs used by the audio class.
-//!
-//! See the documentation on the tUSBDAudioDevice structure for more
-//! information on how to properly fill the structure members.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB audio APIs.
-//
-//*****************************************************************************
-void *
-USBDAudioCompositeInit(uint32_t ui32Index, tUSBDAudioDevice *psAudioDevice,
- tCompositeEntry *psCompEntry)
-{
- tAudioInstance *psInst;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psAudioDevice);
- ASSERT(psAudioDevice->ppui8StringDescriptors);
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst = &psAudioDevice->sPrivateData;
- psInst->ui32USBBase = USB0_BASE;
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psAudioDevice;
- }
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sAudioHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8AudioDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors = g_ppAudioConfigDescriptors;
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- //
- // Initialize the device info structure for the HID device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // The Control interface is at index 0.
- //
- psInst->ui8InterfaceControl = AUDIO_INTERFACE_CONTROL;
-
- //
- // The Audio interface is at index 1.
- //
- psInst->ui8InterfaceAudio = AUDIO_INTERFACE_OUTPUT;
-
- //
- // Set the default Isochronous OUT endpoint.
- //
- psInst->ui8OUTEndpoint = ISOC_OUT_ENDPOINT;
- psInst->ui8OUTDMA = 0;
-
- //
- // Set the initial buffer to null.
- //
- psInst->sBuffer.pvData = 0;
-
- //
- // Save the volume settings.
- //
- psInst->i16VolumeMax = psAudioDevice->i16VolumeMax;
- psInst->i16VolumeMin = psAudioDevice->i16VolumeMin;
- psInst->i16VolumeStep = psAudioDevice->i16VolumeStep;
-
- //
- // No update pending to any command.
- //
- psInst->ui16Update = 0;
-
- //
- // Plug in the client's string stable to the device information
- // structure.
- //
- psInst->sDevInfo.ppui8StringDescriptors =
- psAudioDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psAudioDevice->ui32NumStringDescriptors;
-
- //
- // Get the DMA instance pointer.
- //
- psInst->psDMAInstance = USBLibDMAInit(0);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psAudioDevice);
-}
-
-//*****************************************************************************
-//
-//! Shuts down the audio device.
-//!
-//! \param pvAudioDevice is the pointer to the device instance structure as
-//! returned by USBDAudioInit().
-//!
-//! This function terminates audio interface for the instance supplied. This
-//! function should not be called if the audio device is part of a composite
-//! device and instead the USBDCompositeTerm() function should be called for
-//! the full composite device.
-//! Following this call, the \e pvAudioDevice instance should not me used in
-//! any other calls.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDAudioTerm(void *pvAudioDevice)
-{
- ASSERT(pvAudioDevice != 0);
-
- //
- // Cleanly exit device mode.
- //
- USBDCDTerm(0);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a non-standard
-// request is received.
-//
-// \param pvAudioDevice is the instance data for this request.
-// \param psUSBRequest points to the request received.
-//
-// This call parses the provided request structure to the type of request and
-// will respond to all commands that are understood by the class.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-HandleRequests(void *pvAudioDevice, tUSBRequest *psUSBRequest)
-{
- uint32_t ui32Control, ui32Recipient, ui32Stall;
- tAudioInstance *psInst;
- tUSBDAudioDevice *psAudioDevice;
-
- ASSERT(pvAudioDevice != 0);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Create a pointer to the audio instance data.
- //
- psInst = &psAudioDevice->sPrivateData;
-
- //
- // Make sure to acknowledge that the data was read, this will not send and
- // ACK that has already been done at this point. This just tells the
- // hardware that the data was read.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // Don't stall by default.
- //
- ui32Stall = 0;
-
- //
- // Get the request type.
- //
- ui32Recipient = psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M;
-
- //
- // Save the request type and request value.
- //
- psInst->ui16RequestType = psUSBRequest->bmRequestType;
- psInst->ui8Request = psUSBRequest->bRequest;
-
- //
- // Check if this is an endpoint request to the audio streaming endpoint.
- //
- if((ui32Recipient == USB_RTYPE_ENDPOINT) &&
- (psUSBRequest->wIndex == USBEPToIndex(psInst->ui8OUTEndpoint)))
- {
- //
- // Determine the type of request.
- //
- switch(psInst->ui8Request)
- {
- case USB_AC_SET_CUR:
- {
- //
- // Handle retrieving the sample rate.
- //
- if(psUSBRequest->wValue == SAMPLING_FREQ_CONTROL)
- {
- //
- // Retrieve the requested sample rate.
- //
- USBDCDRequestDataEP0(0,
- (uint8_t *)&psInst->ui32SampleRate,
- 3);
-
- //
- // Save what we are updating.
- //
- psInst->ui16Update = SAMPLING_FREQ_CONTROL;
- }
- break;
- }
- case USB_AC_GET_CUR:
- {
- //
- // Handle retrieving the sample rate.
- //
- if(psUSBRequest->wValue == SAMPLING_FREQ_CONTROL)
- {
- //
- // Send back the current sample rate.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->ui32SampleRate,
- 3);
- }
- break;
- }
- default:
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- break;
- }
- }
- }
- else if(ui32Recipient == USB_RTYPE_INTERFACE)
- {
- //
- // Make sure the request was for the control interface.
- //
- if((uint8_t)psUSBRequest->wIndex != psInst->ui8InterfaceControl)
- {
- return;
- }
-
- //
- // Extract the control value from the message.
- //
- ui32Control = psUSBRequest->wValue & USB_CS_CONTROL_M;
-
- //
- // Handle an audio control request to the feature control unit.
- //
- if((AUDIO_CONTROL_ID << 8) ==
- (psUSBRequest->wIndex & USB_CS_CONTROL_M))
- {
- //
- // Determine the type of request.
- //
- switch(psInst->ui8Request)
- {
- case USB_AC_GET_MAX:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Return the maximum volume setting.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->i16VolumeMax,
- 2);
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- case USB_AC_GET_MIN:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Return the minimum volume setting.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->i16VolumeMin,
- 2);
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- case USB_AC_GET_RES:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Return the volume step setting.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->i16VolumeStep,
- 2);
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- case USB_AC_GET_CUR:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Send back the current volume level.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->i16Volume,
- 2);
- }
- else if(ui32Control == MUTE_CONTROL)
- {
- //
- // Send back the current mute value.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)&psInst->ui8Mute, 1);
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- case USB_AC_SET_CUR:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Read the new volume level.
- //
- USBDCDRequestDataEP0(0,
- (uint8_t *)&psInst->i16Volume,
- 2);
-
- //
- // Save what we are updating.
- //
- psInst->ui16Update = VOLUME_CONTROL;
- }
- else if(ui32Control == MUTE_CONTROL)
- {
- //
- // Read the new mute setting.
- //
- USBDCDRequestDataEP0(0,
- (uint8_t *)&psInst->ui8Mute,
- 1);
-
- //
- // Save what we are updating.
- //
- psInst->ui16Update = MUTE_CONTROL;
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- case USB_AC_SET_RES:
- {
- if(ui32Control == VOLUME_CONTROL)
- {
- //
- // Read the new volume step setting.
- //
- USBDCDRequestDataEP0(0,
- (uint8_t *)&psInst->i16VolumeStep, 2);
-
- //
- // Save what we are updating.
- //
- psInst->ui16Update = VOLUME_CONTROL;
- }
- else
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- }
- break;
- }
- default:
- {
- //
- // Stall on unknown commands.
- //
- ui32Stall = 1;
- break;
- }
- }
- }
- }
-
- //
- // Stall on all unknown commands.
- //
- if(ui32Stall)
- {
- USBDCDStallEP0(0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function is used to supply buffers to the audio class to be filled
-//! from the USB host device.
-//!
-//! \param pvAudioDevice is the pointer to the device instance structure as
-//! returned by USBDAudioInit() or USBDAudioCompositeInit().
-//! \param pvBuffer is a pointer to the buffer to fill with audio data.
-//! \param ui32Size is the size in bytes of the buffer pointed to by the
-//! \e pvBuffer
-//! parameter.
-//! \param pfnCallback is a callback that will provide notification when this
-//! buffer has valid data.
-//!
-//! This function fills the buffer pointed to by the \e pvBuffer parameter with
-//! at most \e ui32Size one packet of data from the host controller. The
-//! \e ui32Size has a minimum value of \b ISOC_OUT_EP_MAX_SIZE since each USB
-//! packet can be at most \b ISOC_OUT_EP_MAX_SIZE bytes in size. Since the
-//! audio data may not be received in amounts that evenly fit in the buffer
-//! provided, the buffer may not be completely filled. The \e pfnCallback
-//! function will provide the amount of valid data that was actually stored in
-//! the buffer provided. The function will return zero if the buffer could be
-//! scheduled to be filled, otherwise the function will return a non-zero value
-//! if there was some reason that the buffer could not be added.
-//!
-//! \return Returns 0 to indicate success any other value indicates that the
-//! buffer will not be filled.
-//
-//*****************************************************************************
-int32_t
-USBAudioBufferOut(void *pvAudioDevice, void *pvBuffer, uint32_t ui32Size,
- tUSBAudioBufferCallback pfnCallback)
-{
- tAudioInstance *psInst;
- tUSBDAudioDevice *psAudioDevice;
-
- //
- // Make sure we were not passed NULL pointers.
- //
- ASSERT(pvAudioDevice != 0);
- ASSERT(pvBuffer != 0);
-
- //
- // Buffer must be at least one packet in size.
- //
- ASSERT(ui32Size >= ISOC_OUT_EP_MAX_SIZE);
- ASSERT(pfnCallback);
-
- //
- // The audio device structure pointer.
- //
- psAudioDevice = (tUSBDAudioDevice *)pvAudioDevice;
-
- //
- // Create a pointer to the audio instance data.
- //
- psInst = &psAudioDevice->sPrivateData;
-
- //
- // Initialize the buffer instance.
- //
- psInst->sBuffer.pvData = pvBuffer;
- psInst->sBuffer.ui32Size = ui32Size;
- psInst->sBuffer.ui32NumBytes = 0;
- psInst->sBuffer.pfnCallback = pfnCallback;
-
- return(0);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.h
deleted file mode 100644
index b672c4a90..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdaudio.h
+++ /dev/null
@@ -1,382 +0,0 @@
-//*****************************************************************************
-//
-// usbdaudio.h - USB audio device class driver.
-//
-// Copyright (c) 2009-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDAUDIO_H__
-#define __USBDAUDIO_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup audio_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-typedef void (* tUSBAudioBufferCallback)(void *pvBuffer, uint32_t ui32Param,
- uint32_t ui32Event);
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for the
-// audio device class. The memory for this structure is pointed to by
-// the pi16PrivateData field in the tUSBDAudioDevice structure passed on
-// USBDAudioInit() and should not be modified by any code outside of the audio
-// device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // The maximum volume expressed as an 8.8 signed value.
- //
- int16_t i16VolumeMax;
-
- //
- // The minimum volume expressed as an 8.8 signed value.
- //
- int16_t i16VolumeMin;
-
- //
- // The minimum volume step expressed as an 8.8 signed value.
- //
- int16_t i16VolumeStep;
-
- struct
- {
- //
- // Pointer to a buffer provided by caller.
- //
- void *pvData;
-
- //
- // Size of the data area provided in pvData in bytes.
- //
- uint32_t ui32Size;
-
- //
- // Number of valid bytes copied into the pvData area.
- //
- uint32_t ui32NumBytes;
-
- //
- // The buffer callback for this function.
- //
- tUSBAudioBufferCallback pfnCallback;
- }
- sBuffer;
-
- //
- // Pending request type.
- //
- uint16_t ui16RequestType;
-
- //
- // Pending request.
- //
- uint8_t ui8Request;
-
- //
- // Pending update value.
- //
- uint16_t ui16Update;
-
- //
- // Current Volume setting.
- //
- int16_t i16Volume;
-
- //
- // Current Mute setting.
- //
- uint8_t ui8Mute;
-
- //
- // Current Sample rate, this is not writable but the host will try.
- //
- uint32_t ui32SampleRate;
-
- //
- // The OUT endpoint in use by this instance.
- //
- uint8_t ui8OUTEndpoint;
-
- //
- // The OUT endpoint DMA channel in use by this instance.
- //
- uint8_t ui8OUTDMA;
-
- //
- // The control interface number associated with this instance.
- //
- uint8_t ui8InterfaceControl;
-
- //
- // The audio interface number associated with this instance.
- //
- uint8_t ui8InterfaceAudio;
-
- //
- // A copy of the DMA instance data used with calls to USBLibDMA functions.
- //
- tUSBDMAInstance *psDMAInstance;
-}
-tAudioInstance;
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8IADAudioDescriptor array in bytes.
-//
-//*****************************************************************************
-#define AUDIODESCRIPTOR_SIZE (8)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8AudioControlInterface array in bytes.
-//
-//*****************************************************************************
-#define CONTROLINTERFACE_SIZE (52)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8AudioStreamInterface array in bytes.
-//
-//*****************************************************************************
-#define STREAMINTERFACE_SIZE (52)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the USB Audio Device.
-//! This does not include the configuration descriptor which is automatically
-//! ignored by the composite device class.
-//
-//*****************************************************************************
-#define COMPOSITE_DAUDIO_SIZE (AUDIODESCRIPTOR_SIZE + \
- CONTROLINTERFACE_SIZE + STREAMINTERFACE_SIZE)
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the device audio class.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! 8 byte vendor string.
- //
- const char pcVendor[8];
-
- //
- //! 16 byte vendor string.
- //
- const char pcProduct[16];
-
- //
- //! 4 byte vendor string.
- //
- const char pcVersion[4];
-
- //
- //! The maximum power consumption of the device, expressed in mA.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self or bus-powered and whether or not
- //! it supports remote wake up. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events relating to the operation of the audio
- //! device.
- //
- const tUSBCallback pfnCallback;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1), Audio
- //! Interface description string (language 1), Configuration description
- //! string (language 1).
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //!
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + ((5 + (number of strings)) *
- //! (number of languages)).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The maximum volume expressed as an 8.8 signed value.
- //
- const int16_t i16VolumeMax;
-
- //
- //! The minimum volume expressed as an 8.8 signed value.
- //
- const int16_t i16VolumeMin;
-
- //
- //! The minimum volume step expressed as an 8.8 signed value.
- //
- const int16_t i16VolumeStep;
-
- //
- //! The private instance data for the audio device.
- //
- tAudioInstance sPrivateData;
-}
-tUSBDAudioDevice;
-
-//*****************************************************************************
-//
-// Audio specific device class driver events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This USB audio event indicates that the device is connected but not active.
-//
-//*****************************************************************************
-#define USBD_AUDIO_EVENT_IDLE (USBD_AUDIO_EVENT_BASE + 0)
-
-//*****************************************************************************
-//
-//! This USB audio event indicates that the device is connected and is now
-//! active.
-//
-//*****************************************************************************
-#define USBD_AUDIO_EVENT_ACTIVE (USBD_AUDIO_EVENT_BASE + 1)
-
-//*****************************************************************************
-//
-//! This USB audio event indicates that the device is returning a data buffer
-//! provided by the USBAudioBufferOut() function back to the application with
-//! valid audio data received from the USB host controller. The \e pvBuffer
-//! parameter holds the pointer to the buffer with the new audio data and
-//! the \e ui32Param value holds the amount of valid data in bytes that are
-//! contained in the \e pvBuffer parameter.
-//
-//*****************************************************************************
-#define USBD_AUDIO_EVENT_DATAOUT (USBD_AUDIO_EVENT_BASE + 2)
-
-//*****************************************************************************
-//
-//! This USB audio event indicates that a volume change has occurred. The
-//! \e ui32Param value contains a signed 8.8 fixed point value that represents
-//! the current volume gain/attenuation in decibels(dB). The provided message
-//! handler should be prepared to handle negative and positive values with the
-//! value 0x8000 indicating maximum attenuation. The \e pvBuffer parameter
-//! should be ignored.
-//
-//*****************************************************************************
-#define USBD_AUDIO_EVENT_VOLUME (USBD_AUDIO_EVENT_BASE + 4)
-
-//*****************************************************************************
-//
-//! This USB audio event indicates that a mute request has occurred. The
-//! \e ui32Param value will either be a 1 to indicate that the audio is now
-//! muted, and a value of 0 indicates that the audio has been unmuted.
-//
-//*****************************************************************************
-#define USBD_AUDIO_EVENT_MUTE (USBD_AUDIO_EVENT_BASE + 5)
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDAudioInit(uint32_t ui32Index,
- tUSBDAudioDevice *psAudioDevice);
-extern void *USBDAudioCompositeInit(uint32_t ui32Index,
- tUSBDAudioDevice *psAudioDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDAudioTerm(void *pvAudioDevice);
-extern int32_t USBAudioBufferOut(void *pvAudioDevice, void *pvBuffer,
- uint32_t ui32Size,
- tUSBAudioBufferCallback pfnCallback);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.c
deleted file mode 100644
index 30845ae82..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.c
+++ /dev/null
@@ -1,1524 +0,0 @@
-//*****************************************************************************
-//
-// usbdbulk.c - USB bulk device class driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdbulk.h"
-#include "usblib/device/usbdcomp.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup bulk_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// The subset of endpoint status flags that we consider to be reception
-// errors. These are passed to the client via USB_EVENT_ERROR if seen.
-//
-//*****************************************************************************
-#define USB_RX_ERROR_FLAGS (USBERR_DEV_RX_DATA_ERROR | \
- USBERR_DEV_RX_OVERRUN | \
- USBERR_DEV_RX_FIFO_FULL)
-
-//*****************************************************************************
-//
-// Flags that may appear in ui16DeferredOpFlags to indicate some operation that
-// has been requested but could not be processed at the time it was received.
-// Each deferred operation is defined as the bit number that should be set in
-// tBulkInstance->ui16DeferredOpFlags to indicate that the operation is
-// pending.
-//
-//*****************************************************************************
-#define BULK_DO_PACKET_RX 5
-
-//*****************************************************************************
-//
-// Endpoints to use for each of the required endpoints in the driver.'
-//
-//*****************************************************************************
-#define DATA_IN_ENDPOINT USB_EP_1
-#define DATA_OUT_ENDPOINT USB_EP_1
-
-//*****************************************************************************
-//
-// Maximum packet size for the bulk endpoints used for bulk data
-// transmission and reception and the associated FIFO sizes to set aside
-// for each endpoint.
-//
-//*****************************************************************************
-#define DATA_IN_EP_FIFO_SIZE USB_FIFO_SZ_64
-#define DATA_OUT_EP_FIFO_SIZE USB_FIFO_SZ_64
-
-#define DATA_IN_EP_MAX_SIZE USBFIFOSizeToBytes(DATA_IN_EP_FIFO_SIZE)
-#define DATA_OUT_EP_MAX_SIZE USBFIFOSizeToBytes(DATA_OUT_EP_FIFO_SIZE)
-
-//*****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8BulkDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- USB_CLASS_VEND_SPECIFIC, // USB Device Class
- 0, // USB Device Sub-class
- 0, // USB Device protocol
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (VID).
- USBShort(0), // Product ID (PID).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// Bulk device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8BulkDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(32), // The total size of this full structure.
- 1, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 5, // The string identifier that describes this
- // configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// The remainder of the configuration descriptor is stored in flash since we
-// don't need to modify anything in it at runtime.
-//
-//*****************************************************************************
-const uint8_t g_pui8BulkInterface[BULKINTERFACE_SIZE] =
-{
- //
- // Vendor-specific Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- 0, // The index for this interface.
- 0, // The alternate setting for this
- // interface.
- 2, // The number of endpoints used by this
- // interface.
- USB_CLASS_VEND_SPECIFIC, // The interface class
- 0, // The interface sub-class.
- 0, // The interface protocol for the sub-class
- // specified above.
- 4, // The string index for this interface.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(DATA_IN_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_IN_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_OUT | USBEPToIndex(DATA_OUT_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_OUT_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-};
-
-//*****************************************************************************
-//
-// The bulk configuration descriptor is defined as two sections, one
-// containing just the 9 byte USB configuration descriptor and the other
-// containing everything else that is sent to the host along with it.
-//
-//*****************************************************************************
-const tConfigSection g_sBulkConfigSection =
-{
- sizeof(g_pui8BulkDescriptor),
- g_pui8BulkDescriptor
-};
-
-const tConfigSection g_sBulkInterfaceSection =
-{
- sizeof(g_pui8BulkInterface),
- g_pui8BulkInterface
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete bulk device configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psBulkSections[] =
-{
- &g_sBulkConfigSection,
- &g_sBulkInterfaceSection
-};
-
-#define NUM_BULK_SECTIONS (sizeof(g_psBulkSections) / \
- sizeof(g_psBulkSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor.
-//
-//*****************************************************************************
-const tConfigHeader g_sBulkConfigHeader =
-{
- NUM_BULK_SECTIONS,
- g_psBulkSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppBulkConfigDescriptors[] =
-{
- &g_sBulkConfigHeader
-};
-
-//*****************************************************************************
-//
-// Forward references for device handler callbacks
-//
-//*****************************************************************************
-static void HandleConfigChange(void *pvBulkDevice, uint32_t ui32Info);
-static void HandleDisconnect(void *pvBulkDevice);
-static void HandleEndpoints(void *pvBulkDevice, uint32_t ui32Status);
-static void HandleSuspend(void *pvBulkDevice);
-static void HandleResume(void *pvBulkDevice);
-static void HandleDevice(void *pvBulkDevice, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// Device event handler callbacks.
-//
-//*****************************************************************************
-const tCustomHandlers g_sBulkHandlers =
-{
- //
- // GetDescriptor
- //
- 0,
-
- //
- // RequestHandler
- //
- 0,
-
- //
- // InterfaceChange
- //
- 0,
-
- //
- // ConfigChange
- //
- HandleConfigChange,
-
- //
- // DataReceived
- //
- 0,
-
- //
- // DataSentCallback
- //
- 0,
-
- //
- // ResetHandler
- //
- 0,
-
- //
- // SuspendHandler
- //
- HandleSuspend,
-
- //
- // ResumeHandler
- //
- HandleResume,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // Device handler
- //
- HandleDevice
-};
-
-//*****************************************************************************
-//
-// Set or clear deferred operation flags in an "atomic" manner.
-//
-// \param pui16DeferredOp points to the flags variable which is to be modified.
-// \param ui16Bit indicates which bit number is to be set or cleared.
-// \param bSet indicates the state that the flag must be set to. If \b true,
-// the flag is set, if \b false, the flag is cleared.
-//
-// This function safely sets or clears a bit in a flag variable. The operation
-// makes use of bitbanding to ensure that the operation is atomic (no read-
-// modify-write is required).
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-SetDeferredOpFlag(volatile uint16_t *pui16DeferredOp, uint16_t ui16Bit,
- bool bSet)
-{
- //
- // Set the flag bit to 1 or 0 using a bitband access.
- //
- HWREGBITH(pui16DeferredOp, ui16Bit) = bSet ? 1 : 0;
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data received from the host.
-//
-// \param psBulkDevice is the device instance whose endpoint is to be
-// processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts signaling
-// the arrival of data on the bulk OUT endpoint (in other words, whenever the
-// host has sent us a packet of data). We inform the client that a packet
-// is available and, on return, check to see if the packet has been read. If
-// not, we schedule another notification to the client for a later time.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-ProcessDataFromHost(tUSBDBulkDevice *psBulkDevice, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus;
- uint32_t ui32Size;
- tBulkInstance *psInst;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, psInst->ui8OUTEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(USB0_BASE, psInst->ui8OUTEndpoint,
- ui32EPStatus);
-
- //
- // Has a packet been received?
- //
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Set the flag we use to indicate that a packet read is pending. This
- // will be cleared if the packet is read. If the client does not read
- // the packet in the context of the USB_EVENT_RX_AVAILABLE callback,
- // the event will be signaled later during tick processing.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, BULK_DO_PACKET_RX,
- true);
-
- //
- // How big is the packet we have just received?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // The receive channel is not blocked so let the caller know
- // that a packet is waiting. The parameters are set to indicate
- // that the packet has not been read from the hardware FIFO yet.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE,
- ui32Size, (void *)0);
- }
- else
- {
- //
- // No packet was received. Some error must have been reported. Check
- // and pass this on to the client if necessary.
- //
- if(ui32EPStatus & USB_RX_ERROR_FLAGS)
- {
- //
- // This is an error we report to the client so allow the callback
- // to handle it.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData,
- USB_EVENT_ERROR,
- (ui32EPStatus & USB_RX_ERROR_FLAGS),
- (void *)0);
- }
- return(false);
- }
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data sent to the host.
-//
-// \param psBulkDevice is the device instance whose endpoint is to be
-// processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts originating
-// from the bulk IN endpoint (in other words, whenever data has been
-// transmitted to the USB host). We examine the cause of the interrupt and,
-// if due to completion of a transmission, notify the client.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-ProcessDataToHost(tUSBDBulkDevice *psBulkDevice, uint32_t ui32Status)
-{
- tBulkInstance *psInst;
- uint32_t ui32EPStatus, ui32Size;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8INEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase, psInst->ui8INEndpoint,
- ui32EPStatus);
-
- //
- // Our last transmission completed. Clear our state back to idle and
- // see if we need to send any more data.
- //
- psInst->iBulkTxState = eBulkStateIdle;
-
- //
- // Notify the client that the last transmission completed.
- //
- ui32Size = psInst->ui16LastTxSize;
- psInst->ui16LastTxSize = 0;
- psBulkDevice->pfnTxCallback(psBulkDevice->pvTxCBData,
- USB_EVENT_TX_COMPLETE, ui32Size, (void *)0);
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack for any activity involving one of our endpoints
-// other than EP0. This function is a fan out that merely directs the call to
-// the correct handler depending upon the endpoint and transaction direction
-// signaled in ui32Status.
-//
-//*****************************************************************************
-static void
-HandleEndpoints(void *pvBulkDevice, uint32_t ui32Status)
-{
- tUSBDBulkDevice *psBulkDevice;
- tBulkInstance *psInst;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Handler for the bulk OUT data endpoint.
- //
- if(ui32Status & (0x10000 << USBEPToIndex(psInst->ui8OUTEndpoint)))
- {
- //
- // Data is being sent to us from the host.
- //
- ProcessDataFromHost(psBulkDevice, ui32Status);
- }
-
- //
- // Handler for the bulk IN data endpoint.
- //
- if(ui32Status & (1 << USBEPToIndex(psInst->ui8INEndpoint)))
- {
- ProcessDataToHost(psBulkDevice, ui32Status);
- }
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack whenever a configuration change occurs.
-//
-//*****************************************************************************
-static void
-HandleConfigChange(void *pvBulkDevice, uint32_t ui32Info)
-{
- tBulkInstance *psInst;
- tUSBDBulkDevice *psBulkDevice;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Set all our endpoints to idle state.
- //
- psInst->iBulkRxState = eBulkStateIdle;
- psInst->iBulkTxState = eBulkStateIdle;
-
- //
- // If we have a control callback, let the client know we are open for
- // business.
- //
- if(psBulkDevice->pfnRxCallback)
- {
- //
- // Pass the connected event to the client.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData,
- USB_EVENT_CONNECTED, 0, (void *)0);
- }
-
- //
- // Remember that we are connected.
- //
- psInst->bConnected = true;
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvBulkDevice, uint32_t ui32Request, void *pvRequestData)
-{
- tBulkInstance *psInst;
- uint8_t *pui8Data;
- tUSBDBulkDevice *psBulkDevice;
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Create the 8-bit array used by the events supported by the USB Bulk
- // class.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- psInst->ui8Interface = pui8Data[1];
- break;
- }
-
- //
- // This was an endpoint change event.
- //
- case USB_EVENT_COMP_EP_CHANGE:
- {
- //
- // Determine if this is an IN or OUT endpoint that has changed.
- //
- if(pui8Data[0] & USB_EP_DESC_IN)
- {
- psInst->ui8INEndpoint = IndexToUSBEP((pui8Data[1] & 0x7f));
- }
- else
- {
- //
- // Extract the new endpoint number.
- //
- psInst->ui8OUTEndpoint = IndexToUSBEP(pui8Data[1] & 0x7f);
- }
- break;
- }
-
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//*****************************************************************************
-static void
-HandleDisconnect(void *pvBulkDevice)
-{
- tUSBDBulkDevice *psBulkDevice;
- tBulkInstance *psInst;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // If we are not currently connected so let the client know we are open
- // for business.
- //
- if(psInst->bConnected)
- {
- //
- // Pass the disconnected event to the client.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData,
- USB_EVENT_DISCONNECTED, 0, (void *)0);
- }
-
- //
- // Remember that we are no longer connected.
- //
- psInst->bConnected = false;
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is put into
-// suspend state.
-//
-//*****************************************************************************
-static void
-HandleSuspend(void *pvBulkDevice)
-{
- const tUSBDBulkDevice *psBulkDevice;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (const tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Pass the event on to the client.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData, USB_EVENT_SUSPEND, 0,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is taken
-// out of suspend state.
-//
-//*****************************************************************************
-static void
-HandleResume(void *pvBulkDevice)
-{
- const tUSBDBulkDevice *psBulkDevice;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (const tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Pass the event on to the client.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData, USB_EVENT_RESUME, 0,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called periodically and provides us with a time reference
-// and method of implementing delayed or time-dependent operations.
-//
-// \param ui32Index is the index of the USB controller for which this tick
-// is being generated.
-// \param ui32TimemS is the elapsed time in milliseconds since the last call
-// to this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-BulkTickHandler(void *pvBulkDevice, uint32_t ui32TimemS)
-{
- tBulkInstance *psInst;
- uint32_t ui32Size;
- tUSBDBulkDevice *psBulkDevice;
-
- ASSERT(pvBulkDevice != 0);
-
- //
- // The bulk device structure pointer.
- //
- psBulkDevice = (tUSBDBulkDevice *)pvBulkDevice;
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Do we have a deferred receive waiting
- //
- if(psInst->ui16DeferredOpFlags & (1 << BULK_DO_PACKET_RX))
- {
- //
- // Yes - how big is the waiting packet?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // Tell the client that there is a packet waiting for it.
- //
- psBulkDevice->pfnRxCallback(psBulkDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE, ui32Size,
- (void *)0);
- }
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Initializes bulk device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for bulk device operation.
-//! \param psBulkDevice points to a structure containing parameters customizing
-//! the operation of the bulk device.
-//!
-//! An application wishing to make use of a USB bulk communication channel
-//! must call this function to initialize the USB controller and attach the
-//! device to the USB bus. This function performs all required USB
-//! initialization.
-//!
-//! On successful completion, this function will return the \e psBulkDevice
-//! pointer passed to it. This must be passed on all future calls to the
-//! device driver related to this device.
-//!
-//! The USBDBulk interface offers packet-based transmit and receive operation.
-//! If the application would rather use block based communication with
-//! transmit and receive buffers, USB buffers may be used above the bulk
-//! transmit and receive channels to offer this functionality.
-//!
-//! Transmit Operation:
-//!
-//! Calls to USBDBulkPacketWrite must send no more than 64 bytes of data at a
-//! time and may only be made when no other transmission is currently
-//! outstanding.
-//!
-//! Once a packet of data has been acknowledged by the USB host, a
-//! \b USB_EVENT_TX_COMPLETE event is sent to the application callback to
-//! inform it that another packet may be transmitted.
-//!
-//! Receive Operation:
-//!
-//! An incoming USB data packet will result in a call to the application
-//! callback with event \b USBD_EVENT_RX_AVAILABLE. The application must then
-//! call USBDBulkPacketRead(), passing a buffer capable of holding 64 bytes, to
-//! retrieve the data and acknowledge reception to the USB host.
-//!
-//! \note The application must not make any calls to the low level USB Device
-//! API if interacting with USB via the USB bulk device class API. Doing so
-//! will cause unpredictable (though almost certainly unpleasant) behavior.
-//!
-//! \return Returns NULL on failure or void pointer that should be used with
-//! the remaining USB bulk class APSs.
-//
-//*****************************************************************************
-void *
-USBDBulkInit(uint32_t ui32Index, tUSBDBulkDevice *psBulkDevice)
-{
- void *pvBulkDevice;
- tDeviceDescriptor *psDevDesc;
- tConfigDescriptor *psConfigDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psBulkDevice);
-
- pvBulkDevice = USBDBulkCompositeInit(ui32Index, psBulkDevice, 0);
-
- if(pvBulkDevice)
- {
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- psDevDesc = (tDeviceDescriptor *)g_pui8BulkDeviceDescriptor;
- psDevDesc->idVendor = psBulkDevice->ui16VID;
- psDevDesc->idProduct = psBulkDevice->ui16PID;
-
- //
- // Fix up the configuration descriptor with client-supplied values.
- //
- psConfigDesc = (tConfigDescriptor *)g_pui8BulkDescriptor;
- psConfigDesc->bmAttributes = psBulkDevice->ui8PwrAttributes;
- psConfigDesc->bMaxPower = (uint8_t)(psBulkDevice->ui16MaxPowermA / 2);
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the bulk device on the bus.
- //
- USBDCDInit(ui32Index, &psBulkDevice->sPrivateData.sDevInfo,
- (void *)psBulkDevice);
- }
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return(pvBulkDevice);
-}
-
-//*****************************************************************************
-//
-//! Initializes bulk device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for bulk device operation.
-//! \param psBulkDevice points to a structure containing parameters customizing
-//! the operation of the bulk device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! This call is very similar to USBDBulkInit() except that it is used for
-//! initializing an instance of the bulk device for use in a composite device.
-//! When this bulk device is part of a composite device, then the
-//! \e psCompEntry should point to the composite device entry to initialize.
-//! This is part of the array that is passed to the USBDCompositeInit()
-//! function.
-//!
-//! \return Returns zero on failure or a non-zero value that should be
-//! used with the remaining USB Bulk APIs.
-//
-//*****************************************************************************
-void *
-USBDBulkCompositeInit(uint32_t ui32Index, tUSBDBulkDevice *psBulkDevice,
- tCompositeEntry *psCompEntry)
-{
- tBulkInstance *psInst;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psBulkDevice);
- ASSERT(psBulkDevice->ppui8StringDescriptors);
- ASSERT(psBulkDevice->pfnRxCallback);
- ASSERT(psBulkDevice->pfnTxCallback);
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst = &psBulkDevice->sPrivateData;
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psBulkDevice;
- }
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sBulkHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8BulkDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors = g_ppBulkConfigDescriptors;
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- //
- // Set the basic state information for the class.
- //
- psInst->ui32USBBase = USB0_BASE;
- psInst->iBulkRxState = eBulkStateUnconfigured;
- psInst->iBulkTxState = eBulkStateUnconfigured;
- psInst->ui16DeferredOpFlags = 0;
- psInst->bConnected = false;
-
- //
- // Initialize the device info structure for the Bulk device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // Set the default endpoint and interface assignments.
- //
- psInst->ui8INEndpoint = DATA_IN_ENDPOINT;
- psInst->ui8OUTEndpoint = DATA_OUT_ENDPOINT;
- psInst->ui8Interface = 0;
-
- //
- // Plug in the client's string stable to the device information
- // structure.
- //
- psInst->sDevInfo.ppui8StringDescriptors =
- psBulkDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psBulkDevice->ui32NumStringDescriptors;
-
- //
- // Initialize the USB tick module, this will prevent it from being
- // initialized later in the call to USBDCDInit();
- //
- InternalUSBTickInit();
-
- //
- // Register our tick handler (this must be done after USBDCDInit).
- //
- InternalUSBRegisterTickHandler(BulkTickHandler, (void *)psBulkDevice);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psBulkDevice);
-}
-
-//*****************************************************************************
-//
-//! Shut down the bulk device.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//!
-//! This function terminates device operation for the instance supplied and
-//! removes the device from the USB bus. This function should not be called
-//! if the bulk device is part of a composite device and instead the
-//! USBDCompositeTerm() function should be called for the full composite
-//! device.
-//!
-//! Following this call, the \e pvBulkDevice instance should not me used in any
-//! other calls.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDBulkTerm(void *pvBulkDevice)
-{
- tBulkInstance *psInst;
-
- ASSERT(pvBulkDevice);
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &((tUSBDBulkDevice *)pvBulkDevice)->sPrivateData;
-
- //
- // Terminate the requested instance.
- //
- USBDCDTerm(USBBaseToIndex(psInst->ui32USBBase));
-
- psInst->ui32USBBase = 0;
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer parameter for the receive channel
-//! callback.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the receive channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnRxCallback function
-//! passed on USBDBulkInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the \e pvBulkDevice structure passed to USBDBulkInit() resides
-//! in RAM. If this structure is in flash, callback pointer changes are not
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's receive callback.
-//
-//*****************************************************************************
-void *
-USBDBulkSetRxCBData(void *pvBulkDevice, void *pvCBData)
-{
- void *pvOldValue;
-
- ASSERT(pvBulkDevice);
-
- //
- // Set the callback data for the receive channel after remembering the
- // previous value.
- //
- pvOldValue = ((tUSBDBulkDevice *)pvBulkDevice)->pvRxCBData;
- ((tUSBDBulkDevice *)pvBulkDevice)->pvRxCBData = pvCBData;
-
- //
- // Return the previous callback pointer.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer parameter for the transmit callback.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the transmit channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnTxCallback function
-//! passed on USBDBulkInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the \e pvBulkDevice structure passed to USBDBulkInit() resides
-//! in RAM. If this structure is in flash, callback pointer changes are not
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's transmit callback.
-//
-//*****************************************************************************
-void *
-USBDBulkSetTxCBData(void *pvBulkDevice, void *pvCBData)
-{
- void *pvOldValue;
-
- ASSERT(pvBulkDevice);
-
- //
- // Set the callback pointer for the transmit channel after remembering the
- // previous value.
- //
- pvOldValue = ((tUSBDBulkDevice *)pvBulkDevice)->pvTxCBData;
- ((tUSBDBulkDevice *)pvBulkDevice)->pvTxCBData = pvCBData;
-
- //
- // Return the previous callback pointer value.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Transmits a packet of data to the USB host via the bulk data interface.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//! \param pi8Data points to the first byte of data which is to be transmitted.
-//! \param ui32Length is the number of bytes of data to transmit.
-//! \param bLast indicates whether more data is to be written before a packet
-//! should be scheduled for transmission. If \b true, the client will make
-//! a further call to this function. If \b false, no further call will be
-//! made and the driver should schedule transmission of a short packet.
-//!
-//! This function schedules the supplied data for transmission to the USB
-//! host in a single USB packet. If no transmission is currently ongoing,
-//! the data is immediately copied to the relevant USB endpoint FIFO for
-//! transmission. Whenever a USB packet is acknowledged by the host, a
-//! \b USB_EVENT_TX_COMPLETE event will be sent to the transmit channel
-//! callback indicating that more data can now be transmitted.
-//!
-//! The maximum value for \e ui32Length is 64 bytes (the maximum USB packet
-//! size for the bulk endpoints in use by the device). Attempts to send more
-//! data than this will result in a return code of 0 indicating that the data
-//! cannot be sent.
-//!
-//! The \e bLast parameter allows a client to make multiple calls to this
-//! function before scheduling transmission of the packet to the host. This
-//! can be helpful if, for example, constructing a packet on the fly or
-//! writing a packet which spans the wrap point in a ring buffer.
-//!
-//! \return Returns the number of bytes actually sent. At this level, this
-//! will either be the number of bytes passed (if less than or equal to the
-//! maximum packet size for the USB endpoint in use and no outstanding
-//! transmission ongoing) or 0 to indicate a failure.
-//
-//*****************************************************************************
-uint32_t
-USBDBulkPacketWrite(void *pvBulkDevice, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- tBulkInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvBulkDevice);
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &((tUSBDBulkDevice *)pvBulkDevice)->sPrivateData;
-
- //
- // Can we send the data provided?
- //
- if((ui32Length > DATA_IN_EP_MAX_SIZE) ||
- (psInst->iBulkTxState != eBulkStateIdle))
- {
- //
- // Either the packet was too big or we are in the middle of sending
- // another packet. Return 0 to indicate that we can't send this data.
- //
- return(0);
- }
-
- //
- // Copy the data into the USB endpoint FIFO.
- //
- i32Retcode = MAP_USBEndpointDataPut(psInst->ui32USBBase,
- psInst->ui8INEndpoint,
- pi8Data, ui32Length);
-
- //
- // Did we copy the data successfully?
- //
- if(i32Retcode != -1)
- {
- //
- // Remember how many bytes we sent.
- //
- psInst->ui16LastTxSize += (uint16_t)ui32Length;
-
- //
- // If this is the last call for this packet, schedule transmission.
- //
- if(bLast)
- {
- //
- // Send the packet to the host if we have received all the data we
- // can expect for this packet.
- //
- psInst->iBulkTxState = eBulkStateWaitData;
- i32Retcode = MAP_USBEndpointDataSend(psInst->ui32USBBase,
- psInst->ui8INEndpoint,
- USB_TRANS_IN);
- }
- }
-
- //
- // Did an error occur while trying to send the data?
- //
- if(i32Retcode != -1)
- {
- //
- // No - tell the caller we sent all the bytes provided.
- //
- return(ui32Length);
- }
- else
- {
- //
- // Yes - tell the caller we could not send the data.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Reads a packet of data received from the USB host via the bulk data
-//! interface.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//! \param pi8Data points to a buffer into which the received data will be
-//! written.
-//! \param ui32Length is the size of the buffer pointed to by pi8Data.
-//! \param bLast indicates whether the client will make a further call to
-//! read additional data from the packet.
-//!
-//! This function reads up to \e ui32Length bytes of data received from the USB
-//! host into the supplied application buffer. If the driver detects that the
-//! entire packet has been read, it is acknowledged to the host.
-//!
-//! The \e bLast parameter is ignored in this implementation since the end of
-//! a packet can be determined without relying upon the client to provide
-//! this information.
-//!
-//! \return Returns the number of bytes of data read.
-//
-//*****************************************************************************
-uint32_t
-USBDBulkPacketRead(void *pvBulkDevice, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- uint32_t ui32EPStatus, ui32Count, ui32Pkt;
- tBulkInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvBulkDevice);
-
- //
- // Get our instance data pointer
- //
- psInst = &((tUSBDBulkDevice *)pvBulkDevice)->sPrivateData;
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // How many bytes are available for us to receive?
- //
- ui32Pkt = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // Get as much data as we can.
- //
- ui32Count = ui32Length;
- i32Retcode = MAP_USBEndpointDataGet(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint,
- pi8Data, &ui32Count);
-
- //
- // Did we read the last of the packet data?
- //
- if(ui32Count == ui32Pkt)
- {
- //
- // Clear the endpoint status so that we know no packet is
- // waiting.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint,
- ui32EPStatus);
-
- //
- // Acknowledge the data, thus freeing the host to send the
- // next packet.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint, true);
-
- //
- // Clear the flag we set to indicate that a packet read is
- // pending.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, BULK_DO_PACKET_RX,
- false);
- }
-
- //
- // If all went well, tell the caller how many bytes they got.
- //
- if(i32Retcode != -1)
- {
- return(ui32Count);
- }
- }
-
- //
- // No packet was available or an error occurred while reading so tell
- // the caller no bytes were returned.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! Returns the number of free bytes in the transmit buffer.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//!
-//! This function returns the maximum number of bytes that can be passed on a
-//! call to USBDBulkPacketWrite and accepted for transmission. The value
-//! returned will be the maximum USB packet size (64) if no transmission is
-//! currently outstanding or 0 if a transmission is in progress.
-//!
-//! \return Returns the number of bytes available in the transmit buffer.
-//
-//*****************************************************************************
-uint32_t
-USBDBulkTxPacketAvailable(void *pvBulkDevice)
-{
- tBulkInstance *psInst;
-
- ASSERT(pvBulkDevice);
-
- //
- // Get our instance data pointer.
- //
- psInst = &((tUSBDBulkDevice *)pvBulkDevice)->sPrivateData;
-
- //
- // Do we have a packet transmission currently ongoing?
- //
- if(psInst->iBulkTxState != eBulkStateIdle)
- {
- //
- // We are not ready to receive a new packet so return 0.
- //
- return(0);
- }
- else
- {
- //
- // We can receive a packet so return the max packet size for the
- // relevant endpoint.
- //
- return(DATA_IN_EP_MAX_SIZE);
- }
-}
-
-//*****************************************************************************
-//
-//! Determines whether a packet is available and, if so, the size of the
-//! buffer required to read it.
-//!
-//! \param pvBulkDevice is the pointer to the device instance structure as
-//! returned by USBDBulkInit().
-//!
-//! This function may be used to determine if a received packet remains to be
-//! read and allows the application to determine the buffer size needed to
-//! read the data.
-//!
-//! \return Returns 0 if no received packet remains unprocessed or the
-//! size of the packet if a packet is waiting to be read.
-//
-//*****************************************************************************
-uint32_t
-USBDBulkRxPacketAvailable(void *pvBulkDevice)
-{
- uint32_t ui32EPStatus, ui32Size;
- tBulkInstance *psInst;
-
- ASSERT(pvBulkDevice);
-
- //
- // Get a pointer to the bulk device instance data pointer
- //
- psInst = &((tUSBDBulkDevice *)pvBulkDevice)->sPrivateData;
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Yes - a packet is waiting. How big is it?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- return(ui32Size);
- }
- else
- {
- //
- // There is no packet waiting to be received.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus- or self-powered) to the USB library.
-//!
-//! \param pvBulkDevice is the pointer to the bulk device instance structure.
-//! \param ui8Power indicates the current power status, either
-//! \b USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus- or self-powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the USB library to allow correct responses to be provided
-//! when the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDBulkPowerStatusSet(void *pvBulkDevice, uint8_t ui8Power)
-{
- ASSERT(pvBulkDevice);
-
- //
- // Pass the request through to the lower layer.
- //
- USBDCDPowerStatusSet(0, ui8Power);
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wake up to resume communication when in suspended state.
-//!
-//! \param pvBulkDevice is the pointer to the bulk device instance structure.
-//!
-//! When the bus is suspended, an application which supports remote wake up
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wake up signaling to the host. If the remote
-//! wake up feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wake up,
-//! \b false will be returned to indicate that the wake up request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wake up is not disabled and the
-//! signaling was started or \b false if remote wake up is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDBulkRemoteWakeupRequest(void *pvBulkDevice)
-{
- ASSERT(pvBulkDevice);
-
- //
- // Pass the request through to the lower layer.
- //
- return(USBDCDRemoteWakeupRequest(0));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.h
deleted file mode 100644
index 2b5c64a7c..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdbulk.h
+++ /dev/null
@@ -1,292 +0,0 @@
-//*****************************************************************************
-//
-// usbdcdc.h - USBLib support for a generic bulk device.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDBULK_H__
-#define __USBDBULK_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup bulk_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The first few sections of this header are private defines that are used by
-// the USB Bulk example code and are here only to help with the application
-// allocating the correct amount of memory for the Bulk example device code.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This enumeration holds the various states that the device can be in during
-// normal operation.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // Not configured.
- //
- eBulkStateUnconfigured,
-
- //
- // No outstanding transaction remains to be completed.
- //
- eBulkStateIdle,
-
- //
- // Waiting on completion of a send or receive transaction.
- //
- eBulkStateWaitData,
-
- //
- // Waiting for client to process data.
- //
- eBulkStateWaitClient
-}
-tBulkState;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for the
-// Bulk only example device. The memory for this structure is inlcluded in
-// the sPrivateData field in the tUSBDBulkDevice structure passed on
-// USBDBulkInit().
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // The state of the bulk receive channel.
- //
- volatile tBulkState iBulkRxState;
-
- //
- // The state of the bulk transmit channel.
- //
- volatile tBulkState iBulkTxState;
-
- //
- // State of any pending operations that could not be handled immediately
- // upon receipt.
- //
- volatile uint16_t ui16DeferredOpFlags;
-
- //
- // Size of the last transmit.
- //
- uint16_t ui16LastTxSize;
-
- //
- // The connection status of the device.
- //
- volatile bool bConnected;
-
- //
- // The IN endpoint number, this is modified in composite devices.
- //
- uint8_t ui8INEndpoint;
-
- //
- // The OUT endpoint number, this is modified in composite devices.
- //
- uint8_t ui8OUTEndpoint;
-
- //
- // The bulk class interface number, this is modified in composite devices.
- //
- uint8_t ui8Interface;
-}
-tBulkInstance;
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8BulkInterface array in bytes.
-//
-//*****************************************************************************
-#define BULKINTERFACE_SIZE (23)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the USB Bulk Device.
-//! This does not include the configuration descriptor which is automatically
-//! ignored by the composite device class.
-//
-//*****************************************************************************
-#define COMPOSITE_DBULK_SIZE (BULKINTERFACE_SIZE)
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the bulk device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to the device's data receive channel.
- //
- const tUSBCallback pfnRxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the receive channel callback,
- //! pfnRxCallback.
- //
- void *pvRxCBData;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to the device's data transmit
- //! channel.
- //
- const tUSBCallback pfnTxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the transmit channel callback,
- //! pfnTxCallback.
- //
- void *pvTxCBData;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain pointers to the following string descriptors in this
- //! order. Language descriptor, Manufacturer name string (language 1),
- //! Product name string (language 1), Serial number string (language 1),
- //! Interface description string (language 1) and Configuration description
- //! string (language 1).
- //!
- //! If supporting more than 1 language, the strings for indices 1 through 5
- //! must be repeated for each of the other languages defined in the
- //! language descriptor.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors array.
- //! This must be 1 + (5 * number of supported languages).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The private instance data for this device. This memory must
- //! not be modified by any code outside the bulk class driver.
- //
- tBulkInstance sPrivateData;
-}
-tUSBDBulkDevice;
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDBulkInit(uint32_t ui32Index, tUSBDBulkDevice *psBulkDevice);
-extern void *USBDBulkCompositeInit(uint32_t ui32Index,
- tUSBDBulkDevice *psBulkDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDBulkTerm(void *pvBulkInstance);
-extern void *USBDBulkSetRxCBData(void *pvBulkInstance, void *pvCBData);
-extern void *USBDBulkSetTxCBData(void *pvBulkInstance, void *pvCBData);
-extern uint32_t USBDBulkPacketWrite(void *pvBulkInstance, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDBulkPacketRead(void *pvBulkInstance, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDBulkTxPacketAvailable(void *pvBulkInstance);
-extern uint32_t USBDBulkRxPacketAvailable(void *pvBulkInstance);
-extern void USBDBulkPowerStatusSet(void *pvBulkInstance, uint8_t ui8Power);
-extern bool USBDBulkRemoteWakeupRequest(void *pvBulkInstance);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDBULK_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.c
deleted file mode 100644
index 3c56a63e1..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.c
+++ /dev/null
@@ -1,3002 +0,0 @@
-//*****************************************************************************
-//
-// usbdcdc.c - USB CDC ACM (serial) device class driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usbcdc.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdcomp.h"
-#include "usblib/device/usbdcdc.h"
-
-//*****************************************************************************
-//
-//! \addtogroup cdc_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Some assumptions and deviations from the CDC specification
-// ----------------------------------------------------------
-//
-// 1. Although the CDC specification indicates that the following requests
-// should be supported by ACM CDC devices, these don't seem relevant to a
-// virtual COM port implementation and are never seen when connecting to a
-// Windows host and running either Hyperterminal or TeraTerm. As a result,
-// this implementation does not support them and stalls endpoint 0 if they are
-// received.
-// - SEND_ENCAPSULATED_COMMAND
-// - GET_ENCAPSULATED_RESPONSE
-// - SET_COMM_FEATURE
-// - GET_COMM_FEATURE
-// - CLEAR_COMM_FEATURE
-//
-// 2. The CDC specification is very clear on the fact that an ACM device
-// should offer two interfaces - a control interface offering an interrupt IN
-// endpoint and a data interface offering bulk IN and OUT endpoints. Using
-// this descriptor configuration, however, Windows insists on enumerating the
-// device as two separate entities resulting in two virtual COM ports or one
-// COM port and an Unknown Device (depending upon INF contents) appearing
-// in Device Manager. This implementation, derived by experimentation and
-// examination of other virtual COM and CDC solutions, uses only a single
-// interface combining all three endpoints. This appears to satisfy
-// Windows2000, XP and Vista and operates as intended using the Hyperterminal
-// and TeraTerm terminal emulators. Your mileage may vary with other
-// (untested) operating systems!
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// The subset of endpoint status flags that we consider to be reception
-// errors. These are passed to the client via USB_EVENT_ERROR if seen.
-//
-//*****************************************************************************
-#define USB_RX_ERROR_FLAGS (USBERR_DEV_RX_DATA_ERROR | \
- USBERR_DEV_RX_OVERRUN | \
- USBERR_DEV_RX_FIFO_FULL)
-
-//*****************************************************************************
-//
-// Size of the buffer to hold request-specific data read from the host. This
-// must be sized to accommodate the largest request structure that we intend
-// processing.
-//
-//*****************************************************************************
-#define MAX_REQUEST_DATA_SIZE sizeof(tLineCoding)
-
-//*****************************************************************************
-//
-// Flags that may appear in ui16DeferredOpFlags to indicate some operation that
-// has been requested but could not be processed at the time it was received.
-//
-//*****************************************************************************
-#define CDC_DO_SERIAL_STATE_CHANGE \
- 0
-#define CDC_DO_SEND_BREAK 1
-#define CDC_DO_CLEAR_BREAK 2
-#define CDC_DO_LINE_CODING_CHANGE \
- 3
-#define CDC_DO_LINE_STATE_CHANGE \
- 4
-#define CDC_DO_PACKET_RX 5
-
-//*****************************************************************************
-//
-// The subset of deferred operations which result in the receive channel
-// being blocked.
-//
-//*****************************************************************************
-#define RX_BLOCK_OPS ((1 << CDC_DO_SEND_BREAK) | \
- (1 << CDC_DO_LINE_CODING_CHANGE) | \
- (1 << CDC_DO_LINE_STATE_CHANGE))
-
-//*****************************************************************************
-//
-// Endpoints to use for each of the required endpoints in the driver.
-//
-//*****************************************************************************
-#define CONTROL_ENDPOINT USB_EP_1
-#define DATA_IN_ENDPOINT USB_EP_2
-#define DATA_OUT_ENDPOINT USB_EP_1
-
-//*****************************************************************************
-//
-// The following are the USB interface numbers for the CDC serial device.
-//
-//*****************************************************************************
-#define SERIAL_INTERFACE_CONTROL \
- 0
-#define SERIAL_INTERFACE_DATA 1
-
-//*****************************************************************************
-//
-// Maximum packet size for the bulk endpoints used for serial data
-// transmission and reception and the associated FIFO sizes to set aside
-// for each endpoint.
-//
-//*****************************************************************************
-#define DATA_IN_EP_FIFO_SIZE USB_FIFO_SZ_64
-#define DATA_OUT_EP_FIFO_SIZE USB_FIFO_SZ_64
-#define CTL_IN_EP_FIFO_SIZE USB_FIFO_SZ_16
-
-#define DATA_IN_EP_MAX_SIZE USBFIFOSizeToBytes(DATA_IN_EP_FIFO_SIZE)
-#define DATA_OUT_EP_MAX_SIZE USBFIFOSizeToBytes(DATA_IN_EP_FIFO_SIZE)
-#define CTL_IN_EP_MAX_SIZE USBFIFOSizeToBytes(CTL_IN_EP_FIFO_SIZE)
-
-//*****************************************************************************
-//
-// The collection of serial state flags indicating character errors.
-//
-//*****************************************************************************
-#define USB_CDC_SERIAL_ERRORS (USB_CDC_SERIAL_STATE_OVERRUN | \
- USB_CDC_SERIAL_STATE_PARITY | \
- USB_CDC_SERIAL_STATE_FRAMING)
-
-//*****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8CDCSerDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts
- // assume high-speed - see USB 2.0 spec
- // 9.2.6.6)
- USB_CLASS_CDC, // USB Device Class (spec 5.1.1)
- 0, // USB Device Sub-class (spec 5.1.1)
- USB_CDC_PROTOCOL_NONE, // USB Device protocol (spec 5.1.1)
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (filled in during
- // USBDCDCInit).
- USBShort(0), // Product ID (filled in during
- // USBDCDCInit).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// CDC Serial configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8CDCSerDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(9), // The total size of this full structure,
- // this will be patched so it is just set
- // to the size of this structure.
- 2, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 5, // The string identifier that describes
- // this configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake
- // up.
- 250, // The maximum power in 2mA increments.
-};
-
-const tConfigSection g_sCDCSerConfigSection =
-{
- sizeof(g_pui8CDCSerDescriptor),
- g_pui8CDCSerDescriptor
-};
-
-//*****************************************************************************
-//
-// This is the Interface Association Descriptor for the serial device used in
-// composite devices.
-//
-//*****************************************************************************
-uint8_t g_pui8IADSerDescriptor[SERDESCRIPTOR_SIZE] =
-{
-
- 8, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE_ASC, // Interface Association Type.
- 0x0, // Default starting interface is 0.
- 0x2, // Number of interfaces in this
- // association.
- USB_CLASS_CDC, // The device class for this association.
- USB_CDC_SUBCLASS_ABSTRACT_MODEL,
- // The device subclass for this
- // association.
- USB_CDC_PROTOCOL_V25TER, // The protocol for this association.
- 0 // The string index for this association.
-};
-
-const tConfigSection g_sIADSerConfigSection =
-{
- sizeof(g_pui8IADSerDescriptor),
- g_pui8IADSerDescriptor
-};
-
-//*****************************************************************************
-//
-// This is the control interface for the serial device.
-//
-//*****************************************************************************
-const uint8_t g_pui8CDCSerCommInterface[SERCOMMINTERFACE_SIZE] =
-{
- //
- // Communication Class Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- SERIAL_INTERFACE_CONTROL, // The index for this interface.
- 0, // The alternate setting for this
- // interface.
- 1, // The number of endpoints used by this
- // interface.
- USB_CLASS_CDC, // The interface class constant defined by
- // USB-IF (spec 5.1.3).
- USB_CDC_SUBCLASS_ABSTRACT_MODEL,
- // The interface sub-class constant
- // defined by USB-IF (spec 5.1.3).
- USB_CDC_PROTOCOL_V25TER, // The interface protocol for the sub-class
- // specified above.
- 4, // The string index for this interface.
-
- //
- // Communication Class Interface Functional Descriptor - Header
- //
- 5, // Size of the functional descriptor.
- USB_CDC_CS_INTERFACE, // CDC interface descriptor
- USB_CDC_FD_SUBTYPE_HEADER, // Header functional descriptor
- USBShort(0x110), // Complies with CDC version 1.1
-
- //
- // Communication Class Interface Functional Descriptor - ACM
- //
- 4, // Size of the functional descriptor.
- USB_CDC_CS_INTERFACE, // CDC interface descriptor
- USB_CDC_FD_SUBTYPE_ABSTRACT_CTL_MGMT,
- USB_CDC_ACM_SUPPORTS_LINE_PARAMS | USB_CDC_ACM_SUPPORTS_SEND_BREAK,
-
- //
- // Communication Class Interface Functional Descriptor - Unions
- //
- 5, // Size of the functional descriptor.
- USB_CDC_CS_INTERFACE, // CDC interface descriptor
- USB_CDC_FD_SUBTYPE_UNION,
- SERIAL_INTERFACE_CONTROL,
- SERIAL_INTERFACE_DATA, // Data interface number
-
- //
- // Communication Class Interface Functional Descriptor - Call Management
- //
- 5, // Size of the functional descriptor.
- USB_CDC_CS_INTERFACE, // CDC interface descriptor
- USB_CDC_FD_SUBTYPE_CALL_MGMT,
- USB_CDC_CALL_MGMT_HANDLED,
- SERIAL_INTERFACE_DATA, // Data interface number
-
- //
- // Endpoint Descriptor (interrupt, IN)
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(CONTROL_ENDPOINT),
- USB_EP_ATTR_INT, // Endpoint is an interrupt endpoint.
- USBShort(CTL_IN_EP_MAX_SIZE), // The maximum packet size.
- 1 // The polling interval for this endpoint.
-};
-
-const tConfigSection g_sCDCSerCommInterfaceSection =
-{
- sizeof(g_pui8CDCSerCommInterface),
- g_pui8CDCSerCommInterface
-};
-
-//*****************************************************************************
-//
-// This is the Data interface for the serial device.
-//
-//*****************************************************************************
-const uint8_t g_pui8CDCSerDataInterface[SERDATAINTERFACE_SIZE] =
-{
- //
- // Communication Class Data Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- SERIAL_INTERFACE_DATA, // The index for this interface.
- 0, // The alternate setting for this
- // interface.
- 2, // The number of endpoints used by this
- // interface.
- USB_CLASS_CDC_DATA, // The interface class constant defined by
- // USB-IF (spec 5.1.3).
- 0, // The interface sub-class constant
- // defined by USB-IF (spec 5.1.3).
- USB_CDC_PROTOCOL_NONE, // The interface protocol for the sub-class
- // specified above.
- 0, // The string index for this interface.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(DATA_IN_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_IN_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_OUT | USBEPToIndex(DATA_OUT_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_OUT_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-};
-
-const tConfigSection g_sCDCSerDataInterfaceSection =
-{
- sizeof(g_pui8CDCSerDataInterface),
- g_pui8CDCSerDataInterface
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete CDC ACM configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psCDCSerSections[] =
-{
- &g_sCDCSerConfigSection,
- &g_sCDCSerCommInterfaceSection,
- &g_sCDCSerDataInterfaceSection,
-};
-
-#define NUM_CDCSER_SECTIONS (sizeof(g_psCDCSerSections) / \
- sizeof(g_psCDCSerSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration. This is the root of the data
-// structure that defines all the bits and pieces that are pulled together to
-// generate the configuration descriptor.
-//
-//*****************************************************************************
-const tConfigHeader g_sCDCSerConfigHeader =
-{
- NUM_CDCSER_SECTIONS,
- g_psCDCSerSections
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete CDC ACM configuration descriptor used in composite devices.
-// The only addition is the g_sIADSerConfigSection.
-//
-//*****************************************************************************
-const tConfigSection *g_psCDCCompSerSections[] =
-{
- &g_sCDCSerConfigSection,
- &g_sIADSerConfigSection,
- &g_sCDCSerCommInterfaceSection,
- &g_sCDCSerDataInterfaceSection,
-};
-
-#define NUM_COMP_CDCSER_SECTIONS (sizeof(g_psCDCCompSerSections) / \
- sizeof(g_psCDCCompSerSections[0]))
-
-//*****************************************************************************
-//
-// The header for the composite configuration. This is the root of the data
-// structure that defines all the bits and pieces that are pulled together to
-// generate the configuration descriptor.
-//
-//*****************************************************************************
-const tConfigHeader g_sCDCCompSerConfigHeader =
-{
- NUM_COMP_CDCSER_SECTIONS,
- g_psCDCCompSerSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor for the CDC serial class device.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppCDCSerConfigDescriptors[] =
-{
- &g_sCDCSerConfigHeader
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor for the CDC serial class device used in a composite
-// device.
-//
-//*****************************************************************************
-const tConfigHeader * const g_pCDCCompSerConfigDescriptors[] =
-{
- &g_sCDCCompSerConfigHeader
-};
-
-//*****************************************************************************
-//
-// Forward references for device handler callbacks
-//
-//*****************************************************************************
-static void HandleRequests(void *pvCDCDevice, tUSBRequest *pUSBRequest);
-static void HandleConfigChange(void *pvCDCDevice, uint32_t ui32Info);
-static void HandleEP0Data(void *pvCDCDevice, uint32_t ui32DataSize);
-static void HandleDisconnect(void *pvCDCDevice);
-static void HandleEndpoints(void *pvCDCDevice, uint32_t ui32Status);
-static void HandleSuspend(void *pvCDCDevice);
-static void HandleResume(void *pvCDCDevice);
-static void HandleDevice(void *pvCDCDevice, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// The device information structure for the USB serial device.
-//
-//*****************************************************************************
-const tCustomHandlers g_sCDCHandlers =
-{
- //
- // GetDescriptor
- //
- 0,
-
- //
- // RequestHandler
- //
- HandleRequests,
-
- //
- // InterfaceChange
- //
- 0,
-
- //
- // ConfigChange
- //
- HandleConfigChange,
-
- //
- // DataReceived
- //
- HandleEP0Data,
-
- //
- // DataSentCallback
- //
- 0,
-
- //
- // ResetHandler
- //
- 0,
-
- //
- // SuspendHandler
- //
- HandleSuspend,
-
- //
- // ResumeHandler
- //
- HandleResume,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // Device handler.
- //
- HandleDevice
-};
-
-//*****************************************************************************
-//
-// Set or clear deferred operation flags in an "atomic" manner.
-//
-// \param pui16DeferredOp points to the flags variable which is to be modified.
-// \param ui16Bit indicates which bit number is to be set or cleared.
-// \param bSet indicates the state that the flag must be set to. If \b true,
-// the flag is set, if \b false, the flag is cleared.
-//
-// This function safely sets or clears a bit in a flag variable. The operation
-// makes use of bitbanding to ensure that the operation is atomic (no read-
-// modify-write is required).
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-SetDeferredOpFlag(volatile uint16_t *pui16DeferredOp, uint16_t ui16Bit,
- bool bSet)
-{
- //
- // Set the flag bit to 1 or 0 using a bitband access.
- //
- HWREGBITH(pui16DeferredOp, ui16Bit) = bSet ? 1 : 0;
-}
-
-//*****************************************************************************
-//
-// Determines whether or not a client has consumed all received data previously
-// passed to it.
-//
-//! \param psCDCDevice is the pointer to the device instance structure as returned
-//! by USBDCDCInit().
-//
-// This function is called to determine whether or not a device has consumed
-// all data previously passed to it via its receive callback.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-DeviceConsumedAllData(const tUSBDCDCDevice *psCDCDevice)
-{
- uint32_t ui32Remaining;
-
- //
- // Send the device an event requesting that it tell us how many bytes
- // of data it still has to process.
- //
- ui32Remaining = psCDCDevice->pfnRxCallback(psCDCDevice->pvRxCBData,
- USB_EVENT_DATA_REMAINING, 0, (void *)0);
-
- //
- // If any data remains to be processed, return false, else return true.
- //
- return(ui32Remaining ? false : true);
-}
-
-//*****************************************************************************
-//
-// Notifies the client that it should set or clear a break condition.
-//
-// \param psCDCDevice is the pointer to the device instance structure as returned
-// by USBDCDCInit().
-// \param bSend is \b true if a break condition is to be set or \b false if
-// it is to be cleared.
-//
-// This function is called to instruct the client to start or stop sending a
-// break condition on its serial transmit line.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static void
-SendBreak(tUSBDCDCDevice *psCDCDevice, bool bSend)
-{
- tCDCSerInstance *psInst;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Set the break state flags as necessary. If we are turning the break on,
- // set the flag to tell ourselves that we need to notify the client when
- // it is time to turn it off again.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_SEND_BREAK, false);
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_CLEAR_BREAK, bSend);
-
- //
- // Tell the client to start or stop sending the break.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- (bSend ? USBD_CDC_EVENT_SEND_BREAK :
- USBD_CDC_EVENT_CLEAR_BREAK), 0,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a host request to set the serial communication
-// parameters.
-//
-// \param psCDCDevice is the device instance whose communication parameters are to
-// be set.
-//
-// This function is called to notify the client when the host requests a change
-// in the serial communication parameters (baud rate, parity, number of bits
-// per character and number of stop bits) to use.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-SendLineCodingChange(tUSBDCDCDevice *psCDCDevice)
-{
- tCDCSerInstance *psInst;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Clear the flag we use to tell ourselves that the line coding change has
- // yet to be notified to the client.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_LINE_CODING_CHANGE,
- false);
-
- //
- // Tell the client to update their serial line coding parameters.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USBD_CDC_EVENT_SET_LINE_CODING, 0,
- &(psInst->sLineCoding));
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a host request to set the RTS and DTR handshake line
-// states.
-//
-// \param psCDCDevice is the device instance whose break condition is to be set or
-// cleared.
-//
-// This function is called to notify the client when the host requests a change
-// in the state of one or other of the RTS and DTR handshake lines.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-SendLineStateChange(tUSBDCDCDevice *psCDCDevice)
-{
- tCDCSerInstance *psInst;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Clear the flag we use to tell ourselves that the line coding change has
- // yet to be notified to the client.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_LINE_STATE_CHANGE,
- false);
-
- //
- // Tell the client to update their serial line coding parameters.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USBD_CDC_EVENT_SET_CONTROL_LINE_STATE,
- psInst->ui16ControlLineState,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a break request if no data remains to be processed.
-//
-// \param psCDCDevice is the device instance that is to be commanded to send a
-// break condition.
-//
-// This function is called when the host requests that the device set a break
-// condition on the serial transmit line. If no data received from the host
-// remains to be processed, the break request is passed to the control
-// callback. If data is outstanding, the call is ignored (with the operation
-// being retried on the next timer tick).
-//
-// \return Returns \b true if the break notification was sent, \b false
-// otherwise.
-//
-//*****************************************************************************
-static bool
-CheckAndSendBreak(tUSBDCDCDevice *psCDCDevice, uint16_t ui16Duration)
-{
- bool bCanSend;
-
- //
- // Has the client consumed all data received from the host yet?
- //
- bCanSend = DeviceConsumedAllData(psCDCDevice);
-
- //
- // Can we send the break request?
- //
- if(bCanSend)
- {
- //
- // Pass the break request on to the client since no data remains to be
- // consumed.
- //
- SendBreak(psCDCDevice, (ui16Duration ? true : false));
- }
-
- //
- // Tell the caller whether or not we sent the notification.
- //
- return(bCanSend);
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a request to change the serial line parameters if no
-// data remains to be processed.
-//
-// \param psCDCDevice is the device instance whose line coding parameters are to
-// be changed.
-//
-// This function is called when the host requests that the device change the
-// serial line coding parameters. If no data received from the host remains
-// to be processed, the request is passed to the control callback. If data is
-// outstanding, the call is ignored (with the operation being retried on the
-// next timer tick).
-//
-// \return Returns \b true if the notification was sent, \b false otherwise.
-//
-//*****************************************************************************
-static bool
-CheckAndSendLineCodingChange(tUSBDCDCDevice *psCDCDevice)
-{
- bool bCanSend;
-
- //
- // Has the client consumed all data received from the host yet?
- //
- bCanSend = DeviceConsumedAllData(psCDCDevice);
-
- //
- // Can we send the break request?
- //
- if(bCanSend)
- {
- //
- // Pass the request on to the client since no data remains to be
- // consumed.
- //
- SendLineCodingChange(psCDCDevice);
- }
-
- //
- // Tell the caller whether or not we sent the notification.
- //
- return(bCanSend);
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a request to change the handshake line states if no
-// data remains to be processed.
-//
-// \param psCDCDevice is the device instance whose handshake line states are to
-// be changed.
-//
-// This function is called when the host requests that the device change the
-// state of one or other of the RTS or DTR handshake lines. If no data
-// received from the host remains to be processed, the request is passed to
-// the control callback. If data is outstanding, the call is ignored (with
-// the operation being retried on the next timer tick).
-//
-// \return Returns \b true if the notification was sent, \b false otherwise.
-//
-//*****************************************************************************
-static bool
-CheckAndSendLineStateChange(tUSBDCDCDevice *psCDCDevice)
-{
- bool bCanSend;
-
- //
- // Has the client consumed all data received from the host yet?
- //
- bCanSend = DeviceConsumedAllData(psCDCDevice);
-
- //
- // Can we send the break request?
- //
- if(bCanSend)
- {
- //
- // Pass the request on to the client since no data remains to be
- // consumed.
- //
- SendLineStateChange(psCDCDevice);
- }
-
- //
- // Tell the caller whether or not we sent the notification.
- //
- return(bCanSend);
-}
-
-//*****************************************************************************
-//
-// Notifies the client of a change in the serial line state.
-//
-// \param psInst is the instance whose serial state is to be reported.
-//
-// This function is called to send the current serial state information to
-// the host via the the interrupt IN endpoint. This notification informs the
-// host of problems or conditions such as parity errors, breaks received,
-// framing errors, etc.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-SendSerialState(tUSBDCDCDevice *psCDCDevice)
-{
- tUSBRequest sRequest;
- uint16_t ui16SerialState;
- tCDCSerInstance *psInst;
- int32_t i32Retcode;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Remember that we are in the middle of sending a notification.
- //
- psInst->iCDCInterruptState = eCDCStateWaitData;
-
- //
- // Clear the flag we use to indicate that a send is required.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_SERIAL_STATE_CHANGE,
- false);
- //
- // Take a snapshot of the serial state.
- //
- ui16SerialState = psInst->ui16SerialState;
-
- //
- // Build the request we will use to send the notification.
- //
- sRequest.bmRequestType = (USB_RTYPE_DIR_IN | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE);
- sRequest.bRequest = USB_CDC_NOTIFY_SERIAL_STATE;
- sRequest.wValue = 0;
- sRequest.wIndex = 0;
- sRequest.wLength = USB_CDC_NOTIFY_SERIAL_STATE_SIZE;
-
- //
- // Write the request structure to the USB FIFO.
- //
- i32Retcode = MAP_USBEndpointDataPut(psInst->ui32USBBase,
- psInst->ui8ControlEndpoint,
- (uint8_t *)&sRequest,
- sizeof(tUSBRequest));
- i32Retcode = MAP_USBEndpointDataPut(psInst->ui32USBBase,
- psInst->ui8ControlEndpoint,
- (uint8_t *)&ui16SerialState,
- USB_CDC_NOTIFY_SERIAL_STATE_SIZE);
-
- //
- // Did we correctly write the data to the endpoint FIFO?
- //
- if(i32Retcode != -1)
- {
- //
- // We put the data into the FIFO so now schedule it to be
- // sent.
- //
- i32Retcode = MAP_USBEndpointDataSend(psInst->ui32USBBase,
- psInst->ui8ControlEndpoint,
- USB_TRANS_IN);
- }
-
- //
- // If an error occurred, mark the endpoint as idle (to prevent possible
- // lockup) and return an error.
- //
- if(i32Retcode == -1)
- {
- psInst->iCDCInterruptState = eCDCStateIdle;
- return(false);
- }
- else
- {
- //
- // Everything went fine. Clear the error bits that we just notified
- // and return true.
- //
- psInst->ui16SerialState &= ~(ui16SerialState & USB_CDC_SERIAL_ERRORS);
- return(true);
- }
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data received from the host.
-//
-// \param psCDCDevice is the device instance whose endpoint is to be processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts signaling
-// the arrival of data on the bulk OUT endpoint (in other words, whenever the
-// host has sent us a packet of data). We inform the client that a packet
-// is available and, on return, check to see if the packet has been read. If
-// not, we schedule another notification to the client for a later time.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-bool
-ProcessDataFromHost(tUSBDCDCDevice *psCDCDevice, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus, ui32Size;
- tCDCSerInstance *psInst;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint,
- ui32EPStatus);
-
- //
- // Has a packet been received?
- //
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Set the flag we use to indicate that a packet read is pending. This
- // will be cleared if the packet is read. If the client doesn't read
- // the packet in the context of the USB_EVENT_RX_AVAILABLE callback,
- // the event will be notified later during tick processing.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_PACKET_RX,
- true);
-
- //
- // Is the receive channel currently blocked?
- //
- if(!psInst->bControlBlocked && !psInst->bRxBlocked)
- {
- //
- // How big is the packet we have just been received?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- //
- // The receive channel is not blocked so let the caller know
- // that a packet is waiting. The parameters are set to indicate
- // that the packet has not been read from the hardware FIFO yet.
- //
- psCDCDevice->pfnRxCallback(psCDCDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE, ui32Size,
- (void *)0);
- }
- }
- else
- {
- //
- // No packet was received. Some error must have been reported. Check
- // and pass this on to the client if necessary.
- //
- if(ui32EPStatus & USB_RX_ERROR_FLAGS)
- {
- //
- // This is an error we report to the client so...
- //
- psCDCDevice->pfnRxCallback(psCDCDevice->pvRxCBData, USB_EVENT_ERROR,
- (ui32EPStatus & USB_RX_ERROR_FLAGS),
- (void *)0);
- }
-
- return(false);
- }
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to interrupt messages sent to the host.
-//
-// \param psCDCDevice is the device instance whose endpoint is to be processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts originating
-// from the interrupt IN endpoint (in other words, whenever a notification has
-// been transmitted to the USB host).
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-bool
-ProcessNotificationToHost(tUSBDCDCDevice *psCDCDevice, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus;
- tCDCSerInstance *psInst;
- bool bRetcode;
-
- //
- // Assume all will go well until we have reason to believe otherwise.
- //
- bRetcode = true;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8ControlEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8ControlEndpoint, ui32EPStatus);
-
- //
- // Did the state change while we were waiting for the previous notification
- // to complete?
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_SERIAL_STATE_CHANGE))
- {
- //
- // The state changed while we were waiting so we need to schedule
- // another notification immediately.
- //
- bRetcode = SendSerialState(psCDCDevice);
- }
- else
- {
- //
- // Our last notification completed and we did not have any new
- // notifications to make so the interrupt channel is now idle again.
- //
- psInst->iCDCInterruptState = eCDCStateIdle;
- }
-
- //
- // Tell the caller how things went.
- //
- return(bRetcode);
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data sent to the host.
-//
-// \param psCDCDevice is the device instance whose endpoint is to be processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts originating
-// from the bulk IN endpoint (in other words, whenever data has been
-// transmitted to the USB host). We examine the cause of the interrupt and,
-// if due to completion of a transmission, notify the client.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-bool
-ProcessDataToHost(tUSBDCDCDevice *psCDCDevice, uint32_t ui32Status)
-{
- tCDCSerInstance *psInst;
- uint32_t ui32EPStatus, ui32Size;
- bool bSentFullPacket;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8BulkINEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8BulkINEndpoint, ui32EPStatus);
-
- //
- // Our last transmission completed. Clear our state back to idle and
- // see if we need to send any more data.
- //
- psInst->iCDCTxState = eCDCStateIdle;
-
- //
- // If this notification is not as a result of sending a zero-length packet,
- // call back to the client to let it know we sent the last thing it passed
- // us.
- //
- if(psInst->ui16LastTxSize)
- {
- //
- // Have we just sent a 64 byte packet?
- //
- bSentFullPacket = (psInst->ui16LastTxSize == DATA_IN_EP_MAX_SIZE) ?
- true : false;
-
- //
- // Notify the client that the last transmission completed.
- //
- ui32Size = (uint32_t)psInst->ui16LastTxSize;
- psInst->ui16LastTxSize = 0;
- psCDCDevice->pfnTxCallback(psCDCDevice->pvTxCBData, USB_EVENT_TX_COMPLETE,
- ui32Size, (void *)0);
-
- //
- // If we had previously sent a full packet and the callback didn't
- // schedule a new transmission, send a zero length packet to indicate
- // the end of the transfer.
- //
- if(bSentFullPacket && !psInst->ui16LastTxSize)
- {
- //
- // We can expect another transmit complete notification after doing
- // this.
- //
- psInst->iCDCTxState = eCDCStateWaitData;
-
- //
- // Send the zero-length packet.
- //
- MAP_USBEndpointDataSend(psInst->ui32USBBase,
- psInst->ui8BulkINEndpoint,
- USB_TRANS_IN);
- }
- }
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack for any activity involving one of our endpoints
-// other than EP0. This function is a fan out that merely directs the call to
-// the correct handler depending upon the endpoint and transaction direction
-// signaled in ui32Status.
-//
-//*****************************************************************************
-static void
-HandleEndpoints(void *pvCDCDevice, uint32_t ui32Status)
-{
- tUSBDCDCDevice *psCDCDeviceInst;
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // Determine if the serial device is in single or composite mode because
- // the meaning of ui32Index is different in both cases.
- //
- psCDCDeviceInst = pvCDCDevice;
- psInst = &psCDCDeviceInst->sPrivateData;
-
- //
- // Handler for the interrupt IN notification endpoint.
- //
- if(ui32Status & (1 << USBEPToIndex(psInst->ui8ControlEndpoint)))
- {
- //
- // We have sent an interrupt notification to the host.
- //
- ProcessNotificationToHost(psCDCDeviceInst, ui32Status);
- }
-
- //
- // Handler for the bulk OUT data endpoint.
- //
- if(ui32Status & (0x10000 << USBEPToIndex(psInst->ui8BulkOUTEndpoint)))
- {
- //
- // Data is being sent to us from the host.
- //
- ProcessDataFromHost(psCDCDeviceInst, ui32Status);
- }
-
- //
- // Handler for the bulk IN data endpoint.
- //
- if(ui32Status & (1 << USBEPToIndex(psInst->ui8BulkINEndpoint)))
- {
- ProcessDataToHost(psCDCDeviceInst, ui32Status);
- }
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack whenever a configuration change occurs.
-//
-//*****************************************************************************
-static void
-HandleConfigChange(void *pvCDCDevice, uint32_t ui32Info)
-{
- tCDCSerInstance *psInst;
- tUSBDCDCDevice *psCDCDevice;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Set all our endpoints to idle state.
- //
- psInst->iCDCInterruptState = eCDCStateIdle;
- psInst->iCDCRequestState = eCDCStateIdle;
- psInst->iCDCRxState = eCDCStateIdle;
- psInst->iCDCTxState = eCDCStateIdle;
-
- //
- // If we are not currently connected so let the client know we are open
- // for business.
- //
- if(!psInst->bConnected)
- {
- //
- // Pass the connected event to the client.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USB_EVENT_CONNECTED, 0, (void *)0);
- }
-
- //
- // Remember that we are connected.
- //
- psInst->bConnected = true;
-}
-
-//*****************************************************************************
-//
-// USB data received callback.
-//
-// This function is called by the USB stack whenever any data requested from
-// EP0 is received.
-//
-//*****************************************************************************
-static void
-HandleEP0Data(void *pvCDCDevice, uint32_t ui32DataSize)
-{
- tUSBDCDCDevice *psCDCDevice;
- tCDCSerInstance *psInst;
- bool bRetcode;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // If we were not passed any data, just return.
- //
- if(ui32DataSize == 0)
- {
- return;
- }
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Make sure we are actually expecting something.
- //
- if(psInst->iCDCRequestState != eCDCStateWaitData)
- {
- return;
- }
-
- //
- // Process the data received. This will be a request-specific data
- // block associated with the last request received.
- //
- switch (psInst->ui8PendingRequest)
- {
- //
- // We just got the line coding structure. Make sure the client has
- // read all outstanding data then pass it back to initiate a change
- // in the line state.
- //
- case USB_CDC_SET_LINE_CODING:
- {
- if(ui32DataSize != sizeof(tLineCoding))
- {
- USBDCDStallEP0(0);
- }
- else
- {
- //
- // Set the flag telling us that we need to send a line coding
- // notification to the client.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags,
- CDC_DO_LINE_CODING_CHANGE, true);
-
- //
- // See if we can send the notification immediately.
- //
- bRetcode = CheckAndSendLineCodingChange(psCDCDevice);
-
- //
- // If we could not send the line coding change request to the
- // client, block reception of more data from the host until
- // previous data is processed and we send the change request.
- //
- if(!bRetcode)
- {
- psInst->bRxBlocked = true;
- }
- }
- break;
- }
-
- //
- // Oops - we seem to be waiting on a request which has not yet been
- // coded here. Flag the error and stall EP0 anyway (even though
- // this would indicate a coding error).
- //
- default:
- {
- USBDCDStallEP0(0);
- ASSERT(0);
- break;
- }
- }
-
- //
- // All is well. Set the state back to IDLE.
- //
- psInst->iCDCRequestState = eCDCStateIdle;
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvCDCDevice, uint32_t ui32Request, void *pvRequestData)
-{
- tCDCSerInstance *psInst;
- uint8_t *pui8Data;
- tUSBDCDCDevice *psCDCDevice;
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Create the 8-bit array used by the events supported by the USB CDC
- // serial class.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- //
- // Save the change to the appropriate interface number.
- //
- if(pui8Data[0] == SERIAL_INTERFACE_CONTROL)
- {
- psInst->ui8InterfaceControl = pui8Data[1];
- }
- else if(pui8Data[0] == SERIAL_INTERFACE_DATA)
- {
- psInst->ui8InterfaceData = pui8Data[1];
- }
- break;
- }
-
- //
- // This was an endpoint change event.
- //
- case USB_EVENT_COMP_EP_CHANGE:
- {
- //
- // Determine if this is an IN or OUT endpoint that has changed.
- //
- if(pui8Data[0] & USB_EP_DESC_IN)
- {
- //
- // Determine which IN endpoint to modify.
- //
- if((pui8Data[0] & 0x7f) == USBEPToIndex(CONTROL_ENDPOINT))
- {
- psInst->ui8ControlEndpoint =
- IndexToUSBEP((pui8Data[1] & 0x7f));
- }
- else
- {
- psInst->ui8BulkINEndpoint =
- IndexToUSBEP((pui8Data[1] & 0x7f));
- }
- }
- else
- {
- //
- // Extract the new endpoint number.
- //
- psInst->ui8BulkOUTEndpoint =
- IndexToUSBEP(pui8Data[1] & 0x7f);
- }
- break;
- }
-
- //
- // Handle class specific reconfiguring of the configuration descriptor
- // once the composite class has built the full descriptor.
- //
- case USB_EVENT_COMP_CONFIG:
- {
- //
- // This sets the bFirstInterface of the Interface Association
- // descriptor to the first interface which is the control
- // interface used by this instance.
- //
- pui8Data[2] = psInst->ui8InterfaceControl;
-
- //
- // This sets the bMasterInterface of the Union descriptor to the
- // Control interface and the bSlaveInterface of the Union
- // Descriptor to the Data interface used by this instance.
- //
- pui8Data[29] = psInst->ui8InterfaceControl;
- pui8Data[30] = psInst->ui8InterfaceData;
-
- //
- // This sets the bDataInterface of the Union descriptor to the
- // Data interface used by this instance.
- pui8Data[35] = psInst->ui8InterfaceData;
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// USB non-standard request callback.
-//
-// This function is called by the USB stack whenever any non-standard request
-// is made to the device. The handler should process any requests that it
-// supports or stall EP0 in any unsupported cases.
-//
-//*****************************************************************************
-static void
-HandleRequests(void *pvCDCDevice, tUSBRequest *pUSBRequest)
-{
- tUSBDCDCDevice *psCDCDevice;
- tCDCSerInstance *psInst;
- bool bRetcode;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Only handle requests meant for this interface.
- //
- if(pUSBRequest->wIndex != psInst->ui8InterfaceControl)
- {
- return;
- }
-
- //
- // Handle each of the requests that we expect from the host.
- //
- switch(pUSBRequest->bRequest)
- {
- case USB_CDC_SEND_ENCAPSULATED_COMMAND:
- {
- //
- // This implementation makes use of no communication protocol so
- // this request is meaningless. We stall endpoint 0 if we receive
- // it.
- //
- USBDCDStallEP0(0);
- break;
- }
-
- case USB_CDC_GET_ENCAPSULATED_RESPONSE:
- {
- //
- // This implementation makes use of no communication protocol so
- // this request is meaningless. We stall endpoint 0 if we receive
- // it.
- //
- USBDCDStallEP0(0);
- break;
- }
-
- case USB_CDC_SET_COMM_FEATURE:
- {
- //
- // This request is apparently required by an ACM device but does
- // not appear relevant to a virtual COM port and is never used by
- // Windows (or, at least, is not seen when using Hyperterminal or
- // TeraTerm via a Windows virtual COM port). We stall endpoint 0
- // to indicate that we do not support the request.
- //
- USBDCDStallEP0(0);
- break;
- }
-
- case USB_CDC_GET_COMM_FEATURE:
- {
- //
- // This request is apparently required by an ACM device but does
- // not appear relevant to a virtual COM port and is never used by
- // Windows (or, at least, is not seen when using Hyperterminal or
- // TeraTerm via a Windows virtual COM port). We stall endpoint 0
- // to indicate that we do not support the request.
- //
- USBDCDStallEP0(0);
- break;
- }
-
- case USB_CDC_CLEAR_COMM_FEATURE:
- {
- //
- // This request is apparently required by an ACM device but does
- // not appear relevant to a virtual COM port and is never used by
- // Windows (or, at least, is not seen when using Hyperterminal or
- // TeraTerm via a Windows virtual COM port). We stall endpoint 0
- // to indicate that we do not support the request.
- //
- USBDCDStallEP0(0);
- break;
- }
-
- //
- // Set the serial communication parameters.
- //
- case USB_CDC_SET_LINE_CODING:
- {
- //
- // Remember the request we are processing.
- //
- psInst->ui8PendingRequest = USB_CDC_SET_LINE_CODING;
-
- //
- // Set the state to indicate we are waiting for data.
- //
- psInst->iCDCRequestState = eCDCStateWaitData;
-
- //
- // Now read the payload of the request. We handle the actual
- // operation in the data callback once this data is received.
- //
- USBDCDRequestDataEP0(0, (uint8_t *)&psInst->sLineCoding,
- sizeof(tLineCoding));
-
- //
- // ACK what we have already received. We must do this after
- // requesting the data or we get into a race condition where the
- // data may return before we have set the stack state appropriately
- // to receive it.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, false);
-
- break;
- }
-
- //
- // Return the serial communication parameters.
- //
- case USB_CDC_GET_LINE_CODING:
- {
- tLineCoding sLineCoding;
-
- //
- // ACK what we have already received
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, false);
-
- //
- // Ask the client for the current line coding.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USBD_CDC_EVENT_GET_LINE_CODING, 0,
- &sLineCoding);
-
- //
- // Send the line coding information back to the host.
- //
- USBDCDSendDataEP0(0, (uint8_t *)&sLineCoding, sizeof(tLineCoding));
-
- break;
- }
-
- case USB_CDC_SET_CONTROL_LINE_STATE:
- {
- //
- // ACK what we have already received
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, false);
-
- //
- // Set the handshake lines as required.
- //
- psInst->ui16ControlLineState = pUSBRequest->wValue;
-
- //
- // Remember that we are due to notify the client of a line
- // state change.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags,
- CDC_DO_LINE_STATE_CHANGE, true);
-
- //
- // See if we can notify now.
- //
- bRetcode = CheckAndSendLineStateChange(psCDCDevice);
-
- //
- // If we could not send the line state change request to the
- // client, block reception of more data from the host until
- // previous data is processed and we send the change request.
- //
- if(!bRetcode)
- {
- psInst->bRxBlocked = true;
- }
-
- break;
- }
-
- case USB_CDC_SEND_BREAK:
- {
- //
- // ACK what we have already received
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, false);
-
- //
- // Keep a copy of the requested break duration.
- //
- psInst->ui16BreakDuration = pUSBRequest->wValue;
-
- //
- // Remember that we need to send a break request.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags,
- CDC_DO_SEND_BREAK, true);
-
- //
- // Send the break request if all outstanding receive data has been
- // processed.
- //
- bRetcode = CheckAndSendBreak(psCDCDevice, pUSBRequest->wValue);
-
- //
- // If we could not send the line coding change request to the
- // client, block reception of more data from the host until
- // previous data is processed and we send the change request.
- //
- if(!bRetcode)
- {
- psInst->bRxBlocked = true;
- }
-
- break;
- }
-
- //
- // These are valid CDC requests but not ones that an ACM device should
- // receive.
- //
- case USB_CDC_SET_AUX_LINE_STATE:
- case USB_CDC_SET_HOOK_STATE:
- case USB_CDC_PULSE_SETUP:
- case USB_CDC_SEND_PULSE:
- case USB_CDC_SET_PULSE_TIME:
- case USB_CDC_RING_AUX_JACK:
- case USB_CDC_SET_RINGER_PARMS:
- case USB_CDC_GET_RINGER_PARMS:
- case USB_CDC_SET_OPERATION_PARMS:
- case USB_CDC_GET_OPERATION_PARMS:
- case USB_CDC_SET_LINE_PARMS:
- case USB_CDC_GET_LINE_PARMS:
- case USB_CDC_DIAL_DIGITS:
- case USB_CDC_SET_UNIT_PARAMETER:
- case USB_CDC_GET_UNIT_PARAMETER:
- case USB_CDC_CLEAR_UNIT_PARAMETER:
- case USB_CDC_GET_PROFILE:
- case USB_CDC_SET_ETHERNET_MULTICAST_FILTERS:
- case USB_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER:
- case USB_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER:
- case USB_CDC_SET_ETHERNET_PACKET_FILTER:
- case USB_CDC_GET_ETHERNET_STATISTIC:
- case USB_CDC_SET_ATM_DATA_FORMAT:
- case USB_CDC_GET_ATM_DEVICE_STATISTICS:
- case USB_CDC_SET_ATM_DEFAULT_VC:
- case USB_CDC_GET_ATM_VC_STATISTICS:
- {
- USBDCDStallEP0(0);
- break;
- }
-
- default:
- {
- //
- // This request is not part of the CDC specification.
- //
- USBDCDStallEP0(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//*****************************************************************************
-static void
-HandleDisconnect(void *pvCDCDevice)
-{
- tUSBDCDCDevice *psCDCDevice;
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // If we are not currently connected and we have a control callback,
- // let the client know we are open for business.
- //
- if(psInst->bConnected)
- {
- //
- // Pass the disconnected event to the client.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USB_EVENT_DISCONNECTED, 0, (void *)0);
- }
-
- //
- // Remember that we are no longer connected.
- //
- psInst->bConnected = false;
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is put into
-// suspend state.
-//
-//*****************************************************************************
-static void
-HandleSuspend(void *pvCDCDevice)
-{
- const tUSBDCDCDevice *psCDCDevice;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (const tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Pass the event on to the client.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USB_EVENT_SUSPEND, 0, (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is taken
-// out of suspend state.
-//
-//*****************************************************************************
-static void
-HandleResume(void *pvCDCDevice)
-{
- tUSBDCDCDevice *psCDCDevice;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Pass the event on to the client.
- //
- psCDCDevice->pfnControlCallback(psCDCDevice->pvControlCBData,
- USB_EVENT_RESUME, 0, (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called periodically and provides us with a time reference
-// and method of implementing delayed or time-dependent operations.
-//
-// \param ui32Index is the index of the USB controller for which this tick
-// is being generated.
-// \param ui32TimemS is the elapsed time in milliseconds since the last call
-// to this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-CDCTickHandler(void *pvCDCDevice, uint32_t ui32TimemS)
-{
- bool bCanSend;
- tUSBDCDCDevice *psCDCDevice;
- tCDCSerInstance *psInst;
- uint32_t ui32Size;
-
- ASSERT(pvCDCDevice != 0);
-
- //
- // The CDC device structure pointer.
- //
- psCDCDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Is there any outstanding operation that we should try to perform?
- //
- if(psInst->ui16DeferredOpFlags)
- {
- //
- // Yes - we have at least one deferred operation pending. First check
- // to see if it is time to turn off a break condition.
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_CLEAR_BREAK))
- {
- //
- // Will our break timer expire this time?
- //
- if(psInst->ui16BreakDuration <= ui32TimemS)
- {
- //
- // Yes - turn off the break condition.
- //
- SendBreak(psCDCDevice, false);
- }
- else
- {
- //
- // We have not timed out yet. Decrement the break timer.
- //
- psInst->ui16BreakDuration -= (uint16_t)ui32TimemS;
- }
- }
-
- // Now check to see if the client has any data remaining to be
- // processed. This information is needed by the remaining deferred
- // operations which are waiting for the receive pipe to be emptied
- // before they can be carried out.
- //
- bCanSend = DeviceConsumedAllData(psCDCDevice);
-
- //
- // Has all outstanding data been consumed?
- //
- if(bCanSend)
- {
- //
- // Yes - go ahead and notify the client of the various things
- // it has been asked to do while we waited for data to be
- // consumed.
- //
-
- //
- // Do we need to start sending a break condition?
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_SEND_BREAK))
- {
- SendBreak(psCDCDevice, true);
- }
-
- //
- // Do we need to set the RTS/DTR states?
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_LINE_STATE_CHANGE))
- {
- SendLineStateChange(psCDCDevice);
- }
-
- //
- // Do we need to change the line coding parameters?
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_LINE_CODING_CHANGE))
- {
- SendLineCodingChange(psCDCDevice);
- }
-
- //
- // NOTE: We do not need to handle CDC_DO_SERIAL_STATE_CHANGE here
- // since this is handled in the transmission complete notification
- // for the control IN endpoint (ProcessNotificationToHost()).
- //
-
- //
- // If all the deferred operations which caused the receive channel
- // to be blocked are now handled, we can unblock receive and handle
- // any packet that is currently waiting to be received.
- //
- if(!(psInst->ui16DeferredOpFlags & RX_BLOCK_OPS))
- {
- //
- // We can remove the receive block.
- //
- psInst->bRxBlocked = false;
- }
- }
-
- //
- // Is the receive channel unblocked?
- //
- if(!psInst->bRxBlocked)
- {
- //
- // Do we have a deferred receive waiting
- //
- if(psInst->ui16DeferredOpFlags & (1 << CDC_DO_PACKET_RX))
- {
- //
- // Yes - how big is the waiting packet?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- // Tell the client that there is a packet waiting for it.
- //
- psCDCDevice->pfnRxCallback(psCDCDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE, ui32Size,
- (void *)0);
- }
- }
- }
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Initializes CDC device operation when used with a composite device.
-//!
-//! \param ui32Index is the index of the USB controller in use.
-//! \param psCDCDevice points to a structure containing parameters customizing
-//! the operation of the CDC device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! This call is very similar to USBDCDCInit() except that it is used for
-//! initializing an instance of the serial device for use in a composite
-//! device. When this CDC serial device is part of a composite device, then
-//! the \e psCompEntry should point to the composite device entry to
-//! initialize. This is part of the array that is passed to the
-//! USBDCompositeInit() function.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB CDC APIs.
-//
-//*****************************************************************************
-void *
-USBDCDCCompositeInit(uint32_t ui32Index, tUSBDCDCDevice *psCDCDevice,
- tCompositeEntry *psCompEntry)
-{
- tCDCSerInstance *psInst;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psCDCDevice);
- ASSERT(psCDCDevice->pfnControlCallback);
- ASSERT(psCDCDevice->pfnRxCallback);
- ASSERT(psCDCDevice->pfnTxCallback);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psCDCDevice;
- }
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sCDCHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8CDCSerDeviceDescriptor;
-
- //
- // The CDC serial configuration is different for composite devices and
- // stand alone devices.
- //
- if(psCompEntry == 0)
- {
- psInst->sDevInfo.ppsConfigDescriptors = g_ppCDCSerConfigDescriptors;
- }
- else
- {
- psInst->sDevInfo.ppsConfigDescriptors = g_pCDCCompSerConfigDescriptors;
- }
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- //
- // Set the default endpoint and interface assignments.
- //
- psInst->ui8BulkINEndpoint = DATA_IN_ENDPOINT;
- psInst->ui8BulkOUTEndpoint = DATA_OUT_ENDPOINT;
- psInst->ui8InterfaceControl = SERIAL_INTERFACE_CONTROL;
- psInst->ui8InterfaceData = SERIAL_INTERFACE_DATA;
-
- //
- // By default do not use the interrupt control endpoint. The single
- // instance CDC serial device will turn this on in USBDCDCInit();
- //
- psInst->ui8ControlEndpoint = CONTROL_ENDPOINT;
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst->ui32USBBase = USB0_BASE;
- psInst->iCDCRxState = eCDCStateUnconfigured;
- psInst->iCDCTxState = eCDCStateUnconfigured;
- psInst->iCDCInterruptState = eCDCStateUnconfigured;
- psInst->iCDCRequestState = eCDCStateUnconfigured;
- psInst->ui8PendingRequest = 0;
- psInst->ui16BreakDuration = 0;
- psInst->ui16SerialState = 0;
- psInst->ui16DeferredOpFlags = 0;
- psInst->ui16ControlLineState = 0;
- psInst->bRxBlocked = false;
- psInst->bControlBlocked = false;
- psInst->bConnected = false;
-
- //
- // Initialize the device info structure for the serial device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // Plug in the client's string stable to the device information
- // structure.
- //
- psInst->sDevInfo.ppui8StringDescriptors =
- psCDCDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psCDCDevice->ui32NumStringDescriptors;
-
- //
- // Initialize the USB tick module, this will prevent it from being
- // initialized later in the call to USBDCDInit();
- //
- InternalUSBTickInit();
-
- //
- // Register our tick handler (this must be done after USBDCDInit).
- //
- InternalUSBRegisterTickHandler(CDCTickHandler, (void *)psCDCDevice);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psCDCDevice);
-}
-
-//*****************************************************************************
-//
-//! Initializes CDC device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for CDC device operation.
-//! \param psCDCDevice points to a structure containing parameters customizing
-//! the operation of the CDC device.
-//!
-//! An application wishing to make use of a USB CDC communication channel and
-//! appear as a virtual serial port on the host system must call this function
-//! to initialize the USB controller and attach the device to the USB bus.
-//! This function performs all required USB initialization.
-//!
-//! The value returned by this function is the \e psCDCDevice pointer passed
-//! to it if successful. This pointer must be passed to all later calls to the
-//! CDC class driver to identify the device instance.
-//!
-//! The USB CDC device class driver offers packet-based transmit and receive
-//! operation. If the application would rather use block based communication
-//! with transmit and receive buffers, USB buffers on the transmit and receive
-//! channels may be used to offer this functionality.
-//!
-//! Transmit Operation:
-//!
-//! Calls to USBDCDCPacketWrite() must send no more than 64 bytes of data at a
-//! time and may only be made when no other transmission is currently
-//! outstanding.
-//!
-//! Once a packet of data has been acknowledged by the USB host, a
-//! \b USB_EVENT_TX_COMPLETE event is sent to the application callback to
-//! inform it that another packet may be transmitted.
-//!
-//! Receive Operation:
-//!
-//! An incoming USB data packet will result in a call to the application
-//! callback with event \b USB_EVENT_RX_AVAILABLE. The application must then
-//! call USBDCDCPacketRead(), passing a buffer capable of holding the received
-//! packet to retrieve the data and acknowledge reception to the USB host. The
-//! size of the received packet may be queried by calling
-//! USBDCDCRxPacketAvailable().
-//!
-//! \note The application must not make any calls to the low level USB Device
-//! API if interacting with USB via the CDC device class API. Doing so
-//! will cause unpredictable (though almost certainly unpleasant) behavior.
-//!
-//! \return Returns NULL on failure or the psCDCDevice pointer on success.
-//
-//*****************************************************************************
-void *
-USBDCDCInit(uint32_t ui32Index, tUSBDCDCDevice *psCDCDevice)
-{
- void *pvRet;
- tCDCSerInstance *psInst;
- tDeviceDescriptor *psDevDesc;
- tConfigDescriptor *psConfigDesc;
-
- //
- // Initialize the internal state for this class.
- //
- pvRet = USBDCDCCompositeInit(ui32Index, psCDCDevice, 0);
-
- if(pvRet)
- {
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- psDevDesc = (tDeviceDescriptor *)g_pui8CDCSerDeviceDescriptor;
- psDevDesc->idVendor = psCDCDevice->ui16VID;
- psDevDesc->idProduct = psCDCDevice->ui16PID;
-
- //
- // Fix up the configuration descriptor with client-supplied values.
- //
- psConfigDesc = (tConfigDescriptor *)g_pui8CDCSerDescriptor;
- psConfigDesc->bmAttributes = psCDCDevice->ui8PwrAttributes;
- psConfigDesc->bMaxPower = (uint8_t)(psCDCDevice->ui16MaxPowermA / 2);
-
- //
- // Create an instance pointer to the private data area.
- //
- psInst = &psCDCDevice->sPrivateData;
-
- //
- // Enable the default interrupt control endpoint if this class is not
- // being used in a composite device.
- //
- psInst->ui8ControlEndpoint = CONTROL_ENDPOINT;
-
- //
- // Use the configuration descriptor with the interrupt control
- // endpoint.
- //
- psInst->sDevInfo.ppsConfigDescriptors = g_ppCDCSerConfigDescriptors;
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the CDC device on the bus.
- //
- USBDCDInit(ui32Index, &psInst->sDevInfo, (void *)psCDCDevice);
- }
-
- return(pvRet);
-}
-
-//*****************************************************************************
-//
-//! Shuts down the CDC device instance.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//!
-//! This function terminates CDC operation for the instance supplied and
-//! removes the device from the USB bus. This function should not be called
-//! if the CDC device is part of a composite device and instead the
-//! USBDCompositeTerm() function should be called for the full composite
-//! device.
-//!
-//! Following this call, the \e pvCDCDevice instance should not me used in
-//! any other calls.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDCTerm(void *pvCDCDevice)
-{
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // Terminate the requested instance.
- //
- USBDCDTerm(USBBaseToIndex(psInst->ui32USBBase));
-
- psInst->ui32USBBase = 0;
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer for the control callback.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the control channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnControlCallback function
-//! passed on USBDCDCInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the psCDCDevice structure passed to USBDCDCInit() resides in
-//! RAM. If this structure is in flash, callback pointer changes will not be
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's control callback.
-//
-//*****************************************************************************
-void *
-USBDCDCSetControlCBData(void *pvCDCDevice, void *pvCBData)
-{
- tUSBDCDCDevice *psBulkDevice;
- void *pvOldValue;
-
- ASSERT(pvCDCDevice);
-
- //
- // The CDC device structure pointer.
- //
- psBulkDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Set the callback pointer for the control channel after remembering the
- // previous value.
- //
- pvOldValue = psBulkDevice->pvControlCBData;
- psBulkDevice->pvControlCBData = pvCBData;
-
- //
- // Return the previous callback data value.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific data parameter for the receive channel callback.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the receive channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnRxCallback function
-//! passed on USBDCDCInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the psCDCDevice structure passed to USBDCDCInit() resides in
-//! RAM. If this structure is in flash, callback data changes will not be
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's receive callback.
-//
-//*****************************************************************************
-void *
-USBDCDCSetRxCBData(void *pvCDCDevice, void *pvCBData)
-{
- tUSBDCDCDevice *psBulkDevice;
- void *pvOldValue;
-
- ASSERT(pvCDCDevice);
-
- //
- // The CDC device structure pointer.
- //
- psBulkDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Set the callback data for the receive channel after remembering the
- // previous value.
- //
- pvOldValue = psBulkDevice->pvRxCBData;
- psBulkDevice->pvRxCBData = pvCBData;
-
- //
- // Return the previous callback pointer.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific data parameter for the transmit callback.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the transmit channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnTxCallback function
-//! passed on USBDCDCInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the psCDCDevice structure passed to USBDCDCInit() resides in
-//! RAM. If this structure is in flash, callback data changes will not be
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's transmit callback.
-//
-//*****************************************************************************
-void *
-USBDCDCSetTxCBData(void *pvCDCDevice, void *pvCBData)
-{
- tUSBDCDCDevice *psBulkDevice;
- void *pvOldValue;
-
- ASSERT(pvCDCDevice);
-
- //
- // The CDC device structure pointer.
- //
- psBulkDevice = (tUSBDCDCDevice *)pvCDCDevice;
-
- //
- // Set the callback data for the transmit channel after remembering the
- // previous value.
- //
- pvOldValue = psBulkDevice->pvTxCBData;
- psBulkDevice->pvTxCBData = pvCBData;
-
- //
- // Return the previous callback pointer.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Transmits a packet of data to the USB host via the CDC data interface.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param pi8Data points to the first byte of data which is to be transmitted.
-//! \param ui32Length is the number of bytes of data to transmit.
-//! \param bLast indicates whether more data is to be written before a packet
-//! should be scheduled for transmission. If \b true, the client will make
-//! a further call to this function. If \b false, no further call will be
-//! made and the driver should schedule transmission of a short packet.
-//!
-//! This function schedules the supplied data for transmission to the USB
-//! host in a single USB packet. If no transmission is currently ongoing
-//! the data is immediately copied to the relevant USB endpoint FIFO. If the
-//! \e bLast parameter is \b true, the newly written packet is then scheduled
-//! for transmission. Whenever a USB packet is acknowledged by the host, a
-//! \b USB_EVENT_TX_COMPLETE event will be sent to the application transmit
-//! callback indicating that more data can now be transmitted.
-//!
-//! The maximum value for \e ui32Length is 64 bytes (the maximum USB packet
-//! size for the bulk endpoints in use by CDC). Attempts to send more data
-//! than this will result in a return code of 0 indicating that the data cannot
-//! be sent.
-//!
-//! \return Returns the number of bytes actually sent. At this level, this
-//! will either be the number of bytes passed (if less than or equal to the
-//! maximum packet size for the USB endpoint in use and no outstanding
-//! transmission ongoing) or 0 to indicate a failure.
-//
-//*****************************************************************************
-uint32_t
-USBDCDCPacketWrite(void *pvCDCDevice, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- tCDCSerInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // Can we send the data provided?
- //
- if((ui32Length > DATA_IN_EP_MAX_SIZE) ||
- (psInst->iCDCTxState != eCDCStateIdle))
- {
- //
- // Either the packet was too big or we are in the middle of sending
- // another packet. Return 0 to indicate that we can't send this data.
- //
- return(0);
- }
-
- //
- // Copy the data into the USB endpoint FIFO.
- //
- i32Retcode = MAP_USBEndpointDataPut(psInst->ui32USBBase,
- psInst->ui8BulkINEndpoint, pi8Data,
- ui32Length);
-
- //
- // Did we copy the data successfully?
- //
- if(i32Retcode != -1)
- {
- //
- // Remember how many bytes we sent.
- //
- psInst->ui16LastTxSize += (uint16_t)ui32Length;
-
- //
- // If this is the last call for this packet, schedule transmission.
- //
- if(bLast)
- {
- //
- // Send the packet to the host if we have received all the data we
- // can expect for this packet.
- //
- psInst->iCDCTxState = eCDCStateWaitData;
- i32Retcode = MAP_USBEndpointDataSend(psInst->ui32USBBase,
- psInst->ui8BulkINEndpoint,
- USB_TRANS_IN);
- }
- }
-
- //
- // Did an error occur while trying to send the data?
- //
- if(i32Retcode != -1)
- {
- //
- // No - tell the caller we sent all the bytes provided.
- //
- return(ui32Length);
- }
- else
- {
- //
- // Yes - tell the caller we could not send the data.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Reads a packet of data received from the USB host via the CDC data
-//! interface.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param pi8Data points to a buffer into which the received data will be
-//! written.
-//! \param ui32Length is the size of the buffer pointed to by \e pi8Data.
-//! \param bLast indicates whether the client will make a further call to
-//! read additional data from the packet.
-//!
-//! This function reads up to ui32Length bytes of data received from the USB
-//! host into the supplied application buffer.
-//!
-//! \note The \e bLast parameter is ignored in this implementation since the
-//! end of a packet can be determined without relying upon the client to
-//! provide this information.
-//!
-//! \return Returns the number of bytes of data read.
-//
-//*****************************************************************************
-uint32_t
-USBDCDCPacketRead(void *pvCDCDevice, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- uint32_t ui32EPStatus, ui32Count, ui32Pkt;
- tCDCSerInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // If receive is currently blocked or the buffer we were passed is
- // (potentially) too small, set the flag telling us that we have a
- // packet waiting but return 0.
- //
- if(psInst->bRxBlocked || psInst->bControlBlocked)
- {
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_PACKET_RX,
- true);
- return(0);
- }
- else
- {
- //
- // It is OK to receive the new packet. How many bytes are
- // available for us to receive?
- //
- ui32Pkt = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- //
- // Get as much data as we can.
- //
- ui32Count = ui32Length;
- i32Retcode = MAP_USBEndpointDataGet(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint,
- pi8Data, &ui32Count);
-
- //
- // Did we read the last of the packet data?
- //
- if(ui32Count == ui32Pkt)
- {
- //
- // Clear the endpoint status so that we know no packet is
- // waiting.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint,
- ui32EPStatus);
-
- //
- // Acknowledge the data, thus freeing the host to send the
- // next packet.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint,
- true);
-
- //
- // Clear the flag we set to indicate that a packet read is
- // pending.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags,
- CDC_DO_PACKET_RX, false);
-
- }
-
- //
- // If all went well, tell the caller how many bytes they got.
- //
- if(i32Retcode != -1)
- {
- return(ui32Count);
- }
- }
- }
-
- //
- // No packet was available or an error occurred while reading so tell
- // the caller no bytes were returned.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! Returns the number of free bytes in the transmit buffer.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//!
-//! This function returns the maximum number of bytes that can be passed on a
-//! call to USBDCDCPacketWrite() and accepted for transmission. The value
-//! returned will be the maximum USB packet size if no transmission is
-//! currently outstanding or 0 if a transmission is in progress.
-//!
-//! \return Returns the number of bytes available in the transmit buffer.
-//
-//*****************************************************************************
-uint32_t
-USBDCDCTxPacketAvailable(void *pvCDCDevice)
-{
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // Do we have a packet transmission currently ongoing?
- //
- if(psInst->iCDCTxState != eCDCStateIdle)
- {
- //
- // We are not ready to receive a new packet so return 0.
- //
- return(0);
- }
- else
- {
- //
- // We can receive a packet so return the max packet size for the
- // relevant endpoint.
- //
- return(DATA_IN_EP_MAX_SIZE);
- }
-}
-
-//*****************************************************************************
-//
-//! Determines whether a packet is available and, if so, the size of the
-//! buffer required to read it.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//!
-//! This function may be used to determine if a received packet remains to be
-//! read and allows the application to determine the buffer size needed to
-//! read the data.
-//!
-//! \return Returns 0 if no received packet remains unprocessed or the
-//! size of the packet if a packet is waiting to be read.
-//
-//*****************************************************************************
-uint32_t
-USBDCDCRxPacketAvailable(void *pvCDCDevice)
-{
- uint32_t ui32EPStatus, ui32Size;
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // If receive is currently blocked, return 0.
- //
- if(psInst->bRxBlocked || psInst->bControlBlocked)
- {
- return(0);
- }
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Yes - a packet is waiting. How big is it?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8BulkOUTEndpoint);
-
- return(ui32Size);
- }
- else
- {
- //
- // There is no packet waiting to be received.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Informs the CDC module of changes in the serial control line states or
-//! receive error conditions.
-//!
-//! \param pvCDCDevice is the pointer to the device instance structure as
-//! returned by USBDCDCInit().
-//! \param ui16State indicates the states of the various control lines and
-//! any receive errors detected. Bit definitions are as for the USB CDC
-//! SerialState asynchronous notification and are defined in header file
-//! usbcdc.h.
-//!
-//! The application should call this function whenever the state of any of
-//! the incoming RS232 handshake signals changes or in response to a receive
-//! error or break condition. The \e ui16State parameter is the ORed
-//! combination of the following flags with each flag indicating the presence
-//! of that condition.
-//!
-//! - USB_CDC_SERIAL_STATE_OVERRUN
-//! - USB_CDC_SERIAL_STATE_PARITY
-//! - USB_CDC_SERIAL_STATE_FRAMING
-//! - USB_CDC_SERIAL_STATE_RING_SIGNAL
-//! - USB_CDC_SERIAL_STATE_BREAK
-//! - USB_CDC_SERIAL_STATE_TXCARRIER
-//! - USB_CDC_SERIAL_STATE_RXCARRIER
-//!
-//! This function should be called only when the state of any flag changes.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDCSerialStateChange(void *pvCDCDevice, uint16_t ui16State)
-{
- tCDCSerInstance *psInst;
-
- ASSERT(pvCDCDevice);
-
- //
- // Get a pointer to the CDC device instance data pointer
- //
- psInst = &((tUSBDCDCDevice *)pvCDCDevice)->sPrivateData;
-
- //
- // Add the newly reported state bits to the current collection. We do this
- // in case two state changes occur back-to-back before the first has been
- // notified. There are two distinct types of signals that we report here
- // and we deal with them differently:
- //
- // 1. Errors (overrun, parity, framing error) are ORed together so that
- // any reported error is sent on the next notification.
- // 2. Signal line states (RI, break, TX carrier, RX carrier) always
- // report the last state notified to us. The implementation here will
- // send an interrupt showing the last state but, if two state changes
- // occur very quickly, the host may receive a notification containing
- // the same state that was last reported (in other words, a short pulse
- // will be lost). It would be possible to reduce the likelihood of
- // this happening by building a queue of state changes and sending
- // these in order but you are left with exactly the same problem if the
- // queue fills up. For now, therefore, we run the risk of missing very
- // short pulses on the "steady-state" signal lines.
- //
- psInst->ui16SerialState |= (ui16State & USB_CDC_SERIAL_ERRORS);
- psInst->ui16SerialState &= ~USB_CDC_SERIAL_ERRORS;
- psInst->ui16SerialState |= (ui16State & ~USB_CDC_SERIAL_ERRORS);
-
- //
- // Set the flag indicating that a serial state change is to be sent.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, CDC_DO_SERIAL_STATE_CHANGE,
- true);
-
- //
- // Can we send the state change immediately?
- //
- if(psInst->iCDCInterruptState == eCDCStateIdle)
- {
- //
- // The interrupt channel is free so send the notification immediately.
- // If we can't do this, the tick timer will catch this next time
- // round.
- //
- psInst->iCDCInterruptState = eCDCStateWaitData;
- SendSerialState(pvCDCDevice);
- }
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus- or self-powered) to the USB library.
-//!
-//! \param pvCDCDevice is the pointer to the CDC device instance structure.
-//! \param ui8Power indicates the current power status, either \b
-//! USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus- or self-powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the USB library to allow correct responses to be provided
-//! when the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDCPowerStatusSet(void *pvCDCDevice, uint8_t ui8Power)
-{
- ASSERT(pvCDCDevice);
-
- //
- // Pass the request through to the lower layer.
- //
- USBDCDPowerStatusSet(0, ui8Power);
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wakeup to resume communication when in suspended state.
-//!
-//! \param pvCDCDevice is the pointer to the CDC device instance structure.
-//!
-//! When the bus is suspended, an application which supports remote wakeup
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wakeup signaling to the host. If the remote
-//! wakeup feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wakeup,
-//! \b false will be returned to indicate that the wakeup request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wakeup is not disabled and the
-//! signaling was started or \b false if remote wakeup is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDCDCRemoteWakeupRequest(void *pvCDCDevice)
-{
- ASSERT(pvCDCDevice);
-
- //
- // Pass the request through to the lower layer.
- //
- return(USBDCDRemoteWakeupRequest(0));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.h
deleted file mode 100644
index 9ea599cbc..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdc.h
+++ /dev/null
@@ -1,434 +0,0 @@
-//*****************************************************************************
-//
-// usbdcdc.h - USBLib support for generic CDC ACM (serial) device.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDCDC_H__
-#define __USBDCDC_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup cdc_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The first few sections of this header are private defines that are used by
-// the USB CDC Serial code and are here only to help with the application
-// allocating the correct amount of memory for the CDC Serial device code.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This enumeration holds the various states that the device can be in during
-// normal operation.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // Unconfigured.
- //
- eCDCStateUnconfigured,
-
- //
- // No outstanding transaction remains to be completed.
- //
- eCDCStateIdle,
-
- //
- // Waiting on completion of a send or receive transaction.
- //
- eCDCStateWaitData,
-
- //
- // Waiting for client to process data.
- //
- eCDCStateWaitClient
-}
-tCDCState;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for the
-// CDC Serial device. The memory for this structure is allocated in the
-// tUSBDCDCDevice structure passed on USBDCDCInit().
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // The state of the serial receive state.
- //
- volatile tCDCState iCDCRxState;
-
- //
- // The state of the serial transmit state.
- //
- volatile tCDCState iCDCTxState;
-
- //
- // The state of the serial request state.
- //
- volatile tCDCState iCDCRequestState;
-
- //
- // The state of the serial interrupt state.
- //
- volatile tCDCState iCDCInterruptState;
-
- //
- // The current pending request.
- //
- volatile uint8_t ui8PendingRequest;
-
- //
- // The current break duration used during send break requests.
- //
- uint16_t ui16BreakDuration;
-
- //
- // The current line control state for the serial port.
- //
- uint16_t ui16ControlLineState;
-
- //
- // The general serial state.
- //
- uint16_t ui16SerialState;
-
- //
- // State of any pending operations that could not be handled immediately
- // upon receipt.
- //
- volatile uint16_t ui16DeferredOpFlags;
-
- //
- // Size of the last transmit.
- //
- uint16_t ui16LastTxSize;
-
- //
- // The current serial line coding.
- //
- tLineCoding sLineCoding;
-
- //
- // Serial port receive is blocked.
- //
- volatile bool bRxBlocked;
-
- //
- // Serial control port is blocked.
- //
- volatile bool bControlBlocked;
-
- //
- // The connection status of the device.
- //
- volatile bool bConnected;
-
- //
- // The control endpoint number, this is modified in composite devices.
- //
- uint8_t ui8ControlEndpoint;
-
- //
- // The IN endpoint number, this is modified in composite devices.
- //
- uint8_t ui8BulkINEndpoint;
-
- //
- // The OUT endpoint number, this is modified in composite devices.
- //
- uint8_t ui8BulkOUTEndpoint;
-
- //
- // The interface number for the control interface, this is modified in
- // composite devices.
- //
- uint8_t ui8InterfaceControl;
-
- //
- // The interface number for the data interface, this is modified in
- // composite devices.
- //
- uint8_t ui8InterfaceData;
-}
-tCDCSerInstance;
-
-//*****************************************************************************
-//
-// The following defines are used when working with composite devices.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8IADSerDescriptor array in bytes.
-//
-//*****************************************************************************
-#define SERDESCRIPTOR_SIZE (8)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8CDCSerCommInterface array in bytes.
-//
-//*****************************************************************************
-#define SERCOMMINTERFACE_SIZE (35)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8CDCSerDataInterface array in bytes.
-//
-//*****************************************************************************
-#define SERDATAINTERFACE_SIZE (23)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the USB Serial CDC Device.
-//! This does not include the configuration descriptor which is automatically
-//! ignored by the composite device class.
-//
-//*****************************************************************************
-#define COMPOSITE_DCDC_SIZE (SERDESCRIPTOR_SIZE + SERCOMMINTERFACE_SIZE + \
- SERDATAINTERFACE_SIZE)
-
-//*****************************************************************************
-//
-// CDC-specific events These events are provided to the application in the
-// \e ui32Msg parameter of the tUSBCallback function.
-//
-//*****************************************************************************
-
-//
-//! The host requests that the device send a BREAK condition on its
-//! serial communication channel. The BREAK should remain active until
-//! a USBD_CDC_EVENT_CLEAR_BREAK event is received.
-//
-#define USBD_CDC_EVENT_SEND_BREAK (USBD_CDC_EVENT_BASE + 0)
-
-//
-//! The host requests that the device stop sending a BREAK condition on its
-//! serial communication channel.
-//
-#define USBD_CDC_EVENT_CLEAR_BREAK (USBD_CDC_EVENT_BASE + 1)
-
-//
-//! The host requests that the device set the RS232 signaling lines to
-//! a particular state. The ui32MsgValue parameter contains the RTS and
-//! DTR control line states as defined in table 51 of the USB CDC class
-//! definition and is a combination of the following values:
-//!
-//! (RTS) USB_CDC_DEACTIVATE_CARRIER or USB_CDC_ACTIVATE_CARRIER
-//! (DTR) USB_CDC_DTE_NOT_PRESENT or USB_CDC_DTE_PRESENT
-//
-#define USBD_CDC_EVENT_SET_CONTROL_LINE_STATE (USBD_CDC_EVENT_BASE + 2)
-
-//
-//! The host requests that the device set the RS232 communication
-//! parameters. The pvMsgData parameter points to a tLineCoding structure
-//! defining the required number of bits per character, parity mode,
-//! number of stop bits and the baud rate.
-//
-#define USBD_CDC_EVENT_SET_LINE_CODING (USBD_CDC_EVENT_BASE + 3)
-
-//
-//! The host is querying the current RS232 communication parameters. The
-//! pvMsgData parameter points to a tLineCoding structure that the
-//! application must fill with the current settings prior to returning
-//! from the callback.
-//
-#define USBD_CDC_EVENT_GET_LINE_CODING (USBD_CDC_EVENT_BASE + 4)
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the CDC device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of all asynchronous control events related to the
- //! operation of the device.
- //
- const tUSBCallback pfnControlCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the control channel callback,
- //! pfnControlCallback.
- //
- void *pvControlCBData;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to the device's data receive channel.
- //
- const tUSBCallback pfnRxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the receive channel callback,
- //! pfnRxCallback.
- //
- void *pvRxCBData;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to the device's data transmit
- //! channel.
- //
- const tUSBCallback pfnTxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the transmit channel callback,
- //! pfnTxCallback.
- //
- void *pvTxCBData;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1),
- //! Control interface description string (language 1), Configuration
- //! description string (language 1).
- //!
- //! If supporting more than 1 language, the strings for indices 1 through 5
- //! must be repeated for each of the other languages defined in the
- //! language descriptor.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + (5 * number of supported languages).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The private instance data for this device. This memory
- //! must remain accessible for as long as the CDC device is in use and
- //! must not be modified by any code outside the CDC class driver.
- //
- tCDCSerInstance sPrivateData;
-}
-tUSBDCDCDevice;
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDCDCCompositeInit(uint32_t ui32Index,
- tUSBDCDCDevice *psCDCDevice,
- tCompositeEntry *psCompEntry);
-extern void *USBDCDCInit(uint32_t ui32Index,
- tUSBDCDCDevice *psCDCDevice);
-extern void USBDCDCTerm(void *pvCDCDevice);
-extern void *USBDCDCSetControlCBData(void *pvCDCDevice, void *pvCBData);
-extern void *USBDCDCSetRxCBData(void *pvCDCDevice, void *pvCBData);
-extern void *USBDCDCSetTxCBData(void *pvCDCDevice, void *pvCBData);
-extern uint32_t USBDCDCPacketWrite(void *pvCDCDevice, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDCDCPacketRead(void *pvCDCDevice, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDCDCTxPacketAvailable(void *pvCDCDevice);
-extern uint32_t USBDCDCRxPacketAvailable(void *pvCDCDevice);
-extern void USBDCDCSerialStateChange(void *pvCDCDevice, uint16_t ui16State);
-extern void USBDCDCPowerStatusSet(void *pvCDCDevice, uint8_t ui8Power);
-extern bool USBDCDCRemoteWakeupRequest(void *pvCDCDevice);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDCDC_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdesc.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdesc.c
deleted file mode 100644
index 07acfa182..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcdesc.c
+++ /dev/null
@@ -1,643 +0,0 @@
-//*****************************************************************************
-//
-// usbcdesc.c - Config descriptor parsing functions.
-//
-// Copyright (c) 2007-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-
-//*****************************************************************************
-//
-// The functions in this file mirror the descriptor parsing APIs available
-// in usblib.h but parse configuration descriptors defined in terms of a list
-// of sections rather than as a single block of descriptor data.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Walk to the next descriptor after the supplied one within a section-based
-//! config descriptor.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor which contains \e pi16Desc.
-//! \param pui32Sec points to a variable containing the section within
-//! \e psConfig which contains \e pi16Desc.
-//! \param pi16Desc points to the descriptor that we want to step past.
-//!
-//! This function walks forward one descriptor within a configuration
-//! descriptor. The value returned is a pointer to the header of the next
-//! descriptor after the descriptor supplied in \e pi16Desc. If the next
-//! descriptor is in the next section, \e *pui32Sec will be incremented
-//! accordingly.
-//!
-//! \return Returns a pointer to the next descriptor in the configuration
-//! descriptor.
-//
-//*****************************************************************************
-static tDescriptorHeader *
-NextConfigDescGet(const tConfigHeader *psConfig, uint32_t *pui32Sec,
- tDescriptorHeader *psDesc)
-{
- //
- // Determine where the next descriptor after the supplied one should be
- // assuming it is within the current section.
- //
- psDesc = NEXT_USB_DESCRIPTOR(psDesc);
-
- //
- // Did we run off the end of the section?
- //
- if((uint8_t *)psDesc >= (psConfig->psSections[*pui32Sec]->pui8Data +
- psConfig->psSections[*pui32Sec]->ui16Size))
- {
- //
- // Yes - move to the next section.
- //
- (*pui32Sec)++;
-
- //
- // Are we still within the configuration descriptor?
- //
- if(*pui32Sec < psConfig->ui8NumSections)
- {
- //
- // Yes - the new descriptor is at the start of the new section.
- //
- psDesc =
- (tDescriptorHeader *)psConfig->psSections[*pui32Sec]->pui8Data;
- }
- else
- {
- //
- // No - we ran off the end of the descriptor so return NULL.
- //
- psDesc = (tDescriptorHeader *)0;
- }
- }
-
- //
- // Return the new descriptor pointer.
- //
- return(psDesc);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Returns a pointer to the n-th interface descriptor in a configuration
-//! descriptor with the supplied interface number.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor to search.
-//! \param ui8InterfaceNumber is the interface number of the descriptor to
-//! query.
-//! \param ui32Index is the zero based index of the descriptor.
-//! \param pui32Section points to storage which is written with the index
-//! of the section containing the returned descriptor.
-//!
-//! This function returns a pointer to the n-th interface descriptor in the
-//! supplied configuration which has the requested interface number. It may be
-//! used by a client to retrieve the descriptors for each alternate setting
-//! of a given interface within the configuration passed.
-//!
-//! \return Returns a pointer to the n-th interface descriptor with interface
-//! number as specified or NULL of this descriptor does not exist.
-//
-//*****************************************************************************
-static tInterfaceDescriptor *
-ConfigAlternateInterfaceGet(const tConfigHeader *psConfig,
- uint8_t ui8InterfaceNumber, uint32_t ui32Index,
- uint32_t *pui32Section)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32Count, ui32Sec;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = (tDescriptorHeader *)psConfig->psSections[0]->pui8Data;
- ui32Count = 0;
- ui32Sec = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(psDescCheck)
- {
- //
- // Does this descriptor match the type passed (if a specific type
- // has been specified)?
- //
- if((psDescCheck->bDescriptorType == USB_DTYPE_INTERFACE) &&
- (((tInterfaceDescriptor *)psDescCheck)->bInterfaceNumber ==
- ui8InterfaceNumber))
- {
- //
- // This is an interface descriptor for interface
- // ui8InterfaceNumber. Determine if this is the n-th one we have
- // found and, if so, return its pointer.
- //
- if(ui32Count == ui32Index)
- {
- //
- // Found it - return the pointer and section number.
- //
- *pui32Section = ui32Sec;
- return((tInterfaceDescriptor *)psDescCheck);
- }
-
- //
- // Increment our count of matching descriptors found and go back
- // to look for another since we have not yet reached the n-th
- // match.
- //
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- psDescCheck = NextConfigDescGet(psConfig, &ui32Sec, psDescCheck);
- }
-
- //
- // If we drop out the end of the loop, we did not find the requested
- // descriptor so return NULL.
- //
- return((tInterfaceDescriptor *)0);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Determines the total length of a configuration descriptor defined in terms
-//! of a collection of concatenated sections.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor whose size is to be determined.
-//!
-//! \return Returns the number of bytes in the configuration descriptor will
-//! result from concatenating the required sections.
-//
-//*****************************************************************************
-uint32_t
-USBDCDConfigDescGetSize(const tConfigHeader *psConfig)
-{
- uint32_t ui32Loop, ui32Len;
-
- ui32Len = 0;
-
- //
- // Determine the size of the whole descriptor by adding the sizes of
- // each section which will be concatenated to produce it.
- //
- for(ui32Loop = 0; ui32Loop < psConfig->ui8NumSections; ui32Loop++)
- {
- ui32Len += psConfig->psSections[ui32Loop]->ui16Size;
- }
-
- return(ui32Len);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Determines the number of individual descriptors of a particular type within
-//! a supplied configuration descriptor.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor that is to be searched.
-//! \param ui32Type identifies the type of descriptor that is to be counted.
-//! If the value is \b USB_DESC_ANY, the function returns the total number of
-//! descriptors regardless of type.
-//!
-//! This function can be used to count the number of descriptors of a
-//! particular type within a configuration descriptor. The caller can provide
-//! a specific type value which the function matches against the second byte
-//! of each descriptor or, alternatively, can specify \b USB_DESC_ANY to have
-//! the function count all descriptors regardless of their type.
-//!
-//! The search performed by this function traverses through the list of
-//! sections comprising the configuration descriptor. Note that the similar
-//! top-level function, USBDescGetNum(), searches through a single, contiguous
-//! block of data to perform the same enumeration.
-//!
-//! \return Returns the number of descriptors found in the supplied block of
-//! data.
-//
-//*****************************************************************************
-uint32_t
-USBDCDConfigDescGetNum(const tConfigHeader *psConfig, uint32_t ui32Type)
-{
- uint32_t ui32Section, ui32NumDescs;
-
- //
- // Initialize our counts.
- //
- ui32NumDescs = 0;
-
- //
- // Determine the number of descriptors of the given type in each of the
- // sections comprising the configuration descriptor. Note that this
- // assumes each section contains only whole descriptors!
- //
- for(ui32Section = 0; ui32Section < (uint32_t)psConfig->ui8NumSections;
- ui32Section++)
- {
- ui32NumDescs += USBDescGetNum(
- (tDescriptorHeader *)psConfig->psSections[ui32Section]->pui8Data,
- psConfig->psSections[ui32Section]->ui16Size, ui32Type);
- }
-
- return(ui32NumDescs);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Finds the n-th descriptor of a particular type within the supplied
-//! configuration descriptor.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor that is to be searched.
-//! \param ui32Type identifies the type of descriptor that is to be found. If
-//! the value is \b USB_DESC_ANY, the function returns a pointer to the n-th
-//! descriptor regardless of type.
-//! \param ui32Index is the zero based index of the descriptor whose pointer is
-//! to be returned. For example, passing value 1 in \e ui32Index returns the
-//! second matching descriptor.
-//! \param pui32Section points to storage which will receive the section index
-//! containing the requested descriptor.
-//!
-//! Return a pointer to the n-th descriptor of a particular type found in the
-//! configuration descriptor passed.
-//!
-//! The search performed by this function traverses through the list of
-//! sections comprising the configuration descriptor. Note that the similar
-//! top-level function, USBDescGet(), searches through a single, contiguous
-//! block of data to perform the same enumeration.
-//!
-//! \return Returns a pointer to the header of the required descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tDescriptorHeader *
-USBDCDConfigDescGet(const tConfigHeader *psConfig, uint32_t ui32Type,
- uint32_t ui32Index, uint32_t *pui32Section)
-{
- uint32_t ui32Section, ui32TotalDescs, ui32NumDescs;
-
- //
- // Initialize our counts.
- //
- ui32TotalDescs = 0;
-
- //
- // Determine the number of descriptors of the given type in each of the
- // sections comprising the configuration descriptor. This allows us to
- // determine which section contains the descriptor we are being asked for.
- //
- for(ui32Section = 0; ui32Section < (uint32_t)psConfig->ui8NumSections;
- ui32Section++)
- {
- //
- // How many descriptors of the requested type exist in this section?
- //
- ui32NumDescs = USBDescGetNum(
- (tDescriptorHeader *)psConfig->psSections[ui32Section]->pui8Data,
- psConfig->psSections[ui32Section]->ui16Size, ui32Type);
-
- //
- // Does this section contain the descriptor whose index we are looking
- // for?
- //
- if((ui32TotalDescs + ui32NumDescs) > ui32Index)
- {
- //
- // We know the requested descriptor exists in the current
- // block so write the section number to the caller's storage.
- //
- *pui32Section = ui32Section;
-
- //
- // Now find the actual descriptor requested and return its pointer.
- //
- return(USBDescGet(
- (tDescriptorHeader *)psConfig->psSections[ui32Section]->pui8Data,
- psConfig->psSections[ui32Section]->ui16Size,
- ui32Type, ui32Index - ui32TotalDescs));
- }
-
- //
- // We have not found the required descriptor yet. Update our running
- // count of the number of type matches found so far then move on to
- // the next section.
- //
- ui32TotalDescs += ui32NumDescs;
- }
-
- //
- // If we drop out of the loop, we can't find the requested descriptor
- // so return NULL.
- //
- return((tDescriptorHeader *)0);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Determines the number of different alternate configurations for a given
-//! interface within a configuration descriptor.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor that is to be searched.
-//! \param ui8InterfaceNumber is the interface number for which the number of
-//! alternate configurations is to be counted.
-//!
-//! This function can be used to count the number of alternate settings for a
-//! specific interface within a configuration.
-//!
-//! The search performed by this function traverses through the list of
-//! sections comprising the configuration descriptor. Note that the similar
-//! top-level function, USBDescGetNumAlternateInterfaces(), searches through
-//! a single, contiguous block of data to perform the same enumeration.
-//!
-//! \return Returns the number of alternate versions of the specified interface
-//! or 0 if the interface number supplied cannot be found in the configuration
-//! descriptor.
-//
-//*****************************************************************************
-uint32_t
-USBDCDConfigGetNumAlternateInterfaces(const tConfigHeader *psConfig,
- uint8_t ui8InterfaceNumber)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32Count, ui32Sec;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = (tDescriptorHeader *)psConfig->psSections[0]->pui8Data;
- ui32Sec = 0;
- ui32Count = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(psDescCheck)
- {
- //
- // Is this an interface descriptor with the required interface number?
- //
- if((psDescCheck->bDescriptorType == USB_DTYPE_INTERFACE) &&
- (((tInterfaceDescriptor *)psDescCheck)->bInterfaceNumber ==
- ui8InterfaceNumber))
- {
- //
- // Yes - increment our count.
- //
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- psDescCheck = NextConfigDescGet(psConfig, &ui32Sec, psDescCheck);
- }
-
- //
- // Return the descriptor count to the caller.
- //
- return(ui32Count);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Returns a pointer to the n-th interface descriptor in a configuration
-//! descriptor that applies to the supplied alternate setting number.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor that is to be searched.
-//! \param ui32Index is the zero based index of the interface that is to be
-//! found. If \e ui32Alt is set to a value other than \b USB_DESC_ANY, this
-//! is equivalent to the interface number being searched for.
-//! \param ui32Alt is the alternate setting number which is to be
-//! searched for. If this value is \b USB_DESC_ANY, the alternate setting
-//! is ignored and all interface descriptors are considered in the search.
-//! \param pui32Section points to storage which will receive the index of the
-//! config descriptor section which contains the requested interface
-//! descriptor.
-//!
-//! Return a pointer to the n-th interface descriptor found in the supplied
-//! configuration descriptor. If \e ui32Alt is not \b USB_DESC_ANY, only
-//! interface descriptors which are part of the supplied alternate setting are
-//! considered in the search otherwise all interface descriptors are
-//! considered.
-//!
-//! Note that, although alternate settings can be applied on an interface-by-
-//! interface basis, the number of interfaces offered is fixed for a given
-//! config descriptor. Hence, this function will correctly find the unique
-//! interface descriptor for that interface's alternate setting number \e
-//! ui32Alt if \e ui32Index is set to the required interface number and
-//! \e ui32Alt is set to a valid alternate setting number for that interface.
-//!
-//! The search performed by this function traverses through the list of
-//! sections comprising the configuration descriptor. Note that the similar
-//! top-level function, USBDescGetInterface(), searches through a single,
-//! contiguous block of data to perform the same enumeration.
-//!
-//! \return Returns a pointer to the required interface descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tInterfaceDescriptor *
-USBDCDConfigGetInterface(const tConfigHeader *psConfig, uint32_t ui32Index,
- uint32_t ui32Alt, uint32_t *pui32Section)
-{
- //
- // If we are being told to ignore the alternate configuration, this boils
- // down to a very simple query.
- //
- if(ui32Alt == USB_DESC_ANY)
- {
- //
- // Return the ui32Index-th interface descriptor we find in the
- // configuration descriptor.
- //
- return((tInterfaceDescriptor *)USBDCDConfigDescGet(psConfig,
- USB_DTYPE_INTERFACE,
- ui32Index,
- pui32Section));
- }
- else
- {
- //
- // In this case, a specific alternate setting number is required.
- // Given that interface numbers are zero based indices, we can
- // pass the supplied ui32Index parameter directly as the interface
- // number to USBDescGetAlternateInterface() to retrieve the requested
- // interface descriptor pointer.
- //
- return(ConfigAlternateInterfaceGet(psConfig, ui32Index, ui32Alt,
- pui32Section));
- }
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Return a pointer to the n-th endpoint descriptor in a particular interface
-//! within a configuration descriptor.
-//!
-//! \param psConfig points to the header structure for the configuration
-//! descriptor that is to be searched.
-//! \param ui32InterfaceNumber is the interface number whose endpoint is to be
-//! found.
-//! \param ui32AltCfg is the alternate setting number which is to be searched
-//! for. This must be a valid alternate setting number for the requested
-//! interface.
-//! \param ui32Index is the zero based index of the endpoint that is to be
-//! found within the appropriate alternate setting for the interface.
-//!
-//! Return a pointer to the n-th endpoint descriptor found in the supplied
-//! interface descriptor. If the \e ui32Index parameter is invalid (greater
-//! than or equal to the bNumEndpoints field of the interface descriptor) or
-//! the endpoint descriptor cannot be found, the function will return NULL.
-//!
-//! The search performed by this function traverses through the list of
-//! sections comprising the configuration descriptor. Note that the similar
-//! top-level function, USBDescGetInterfaceEndpoint(), searches through a
-//! single, contiguous block of data to perform the same enumeration.
-//!
-//! \return Returns a pointer to the requested endpoint descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tEndpointDescriptor *
-USBDCDConfigGetInterfaceEndpoint(const tConfigHeader *psConfig,
- uint32_t ui32InterfaceNumber,
- uint32_t ui32AltCfg, uint32_t ui32Index)
-{
- tInterfaceDescriptor *psInterface;
- tDescriptorHeader *psEndpoint;
- uint32_t ui32Section, ui32Count;
-
- //
- // Find the requested interface descriptor.
- //
- psInterface = USBDCDConfigGetInterface(psConfig, ui32InterfaceNumber,
- ui32AltCfg, &ui32Section);
-
- //
- // Did we find the requested interface?
- //
- if(psInterface)
- {
- //
- // Is the index passed valid?
- //
- if(ui32Index >= psInterface->bNumEndpoints)
- {
- //
- // It's out of bounds so return a NULL.
- //
- return((tEndpointDescriptor *)0);
- }
- else
- {
- //
- // Endpoint index is valid so find the descriptor. We start from
- // the interface descriptor and look for following endpoint
- // descriptors.
- //
- ui32Count = 0;
- psEndpoint = (tDescriptorHeader *)psInterface;
-
- while(psEndpoint)
- {
- if(psEndpoint->bDescriptorType == USB_DTYPE_ENDPOINT)
- {
- //
- // We found an endpoint descriptor. Have we reached the
- // one we want?
- //
- if(ui32Count == ui32Index)
- {
- //
- // Yes - return the descriptor pointer to the caller.
- //
- return((tEndpointDescriptor *)psEndpoint);
- }
-
- //
- // Move on to look for the next endpoint.
- //
- ui32Count++;
- }
-
- //
- // Move to the next descriptor.
- //
- psEndpoint = NextConfigDescGet(psConfig, &ui32Section,
- psEndpoint);
- }
- }
- }
-
- //
- // We could not find the requested interface or we got to the end of the
- // descriptor without finding the requested endpoint.
- //
- return((tEndpointDescriptor *)0);
-
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.c
deleted file mode 100644
index 36f4f5f61..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.c
+++ /dev/null
@@ -1,1506 +0,0 @@
-//****************************************************************************
-//
-// usbdcomp.c - USB composite device class driver.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usb-ids.h"
-#include "usblib/usbcdc.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdcdc.h"
-#include "usblib/device/usbdcomp.h"
-
-//****************************************************************************
-//
-//! \addtogroup composite_device_class_api
-//! @{
-//
-//****************************************************************************
-
-//****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//****************************************************************************
-static uint8_t g_pui8CompDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- USB_CLASS_MISC, // USB Device Class (spec 5.1.1)
- USB_MISC_SUBCLASS_COMMON, // USB Device Sub-class (spec 5.1.1)
- USB_MISC_PROTOCOL_IAD, // USB Device protocol (spec 5.1.1)
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (filled in during USBDCompositeInit).
- USBShort(0), // Product ID (filled in during USBDCompositeInit).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//****************************************************************************
-//
-// Composite class device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//****************************************************************************
-static const uint8_t g_pui8CompConfigDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(0), // The total size of this full structure.
- 0, // The number of interfaces in this
- // configuration, this will be filled by
- // the class as it discovers all classes
- // supported.
- 1, // The unique value for this configuration.
- 0, // The string identifier that describes this
- // configuration.
- USB_CONF_ATTR_BUS_PWR, // .
- 250, // The maximum power in 2mA increments.
-};
-
-//****************************************************************************
-//
-// Byte offsets used to access various fields in our index/interface/endpoint
-// lookup table (tUSBDCompositeDevice.pui32DeviceWorkspace). This workspace
-// contains one 4 byte entry per device. The LSB is the device index, next byte
-// is the number of the first interface not within this device, next byte is
-// the number of the first IN endpoint not within this device and the final
-// byte is the number of the first OUT endpoint not within this device. Using
-// this simple table we can reasonably quickly cross-reference index with
-// interface and endpoint numbers.
-//
-//****************************************************************************
-#define LOOKUP_INDEX_BYTE 0
-#define LOOKUP_INTERFACE_BYTE 1
-#define LOOKUP_IN_END_BYTE 2
-#define LOOKUP_OUT_END_BYTE 3
-
-//****************************************************************************
-//
-// A marker used to indicate an invalid index into the device table.
-//
-//****************************************************************************
-#define INVALID_DEVICE_INDEX 0xFFFFFFFF
-
-//****************************************************************************
-//
-// Various internal handlers needed by this class.
-//
-//****************************************************************************
-static void HandleDisconnect(void *pvCompositeInstance);
-static void InterfaceChange(void *pvCompositeInstance, uint8_t ui8InterfaceNum,
- uint8_t ui8AlternateSetting);
-static void ConfigChangeHandler(void *pvCompositeInstance, uint32_t ui32Value);
-static void DataSent(void *pvCompositeInstance, uint32_t ui32Info);
-static void DataReceived(void *pvCompositeInstance, uint32_t ui32Info);
-static void HandleEndpoints(void *pvCompositeInstance, uint32_t ui32Status);
-static void HandleRequests(void *pvCompositeInstance, tUSBRequest *psUSBRequest);
-static void SuspendHandler(void *pvCompositeInstance);
-static void ResumeHandler(void *pvCompositeInstance);
-static void ResetHandler(void *pvCompositeInstance);
-static void HandleDevice(void *pvCompositeInstance, uint32_t ui32Request,
- void *pvRequestData);
-static void GetDescriptor(void *pvCompositeInstance, tUSBRequest *psUSBRequest);
-
-//****************************************************************************
-//
-// Configuration Descriptor.
-//
-//****************************************************************************
-tConfigHeader *g_ppCompConfigDescriptors[1];
-
-//****************************************************************************
-//
-// The device information structure for the USB Composite device.
-//
-//****************************************************************************
-const tCustomHandlers g_sCompHandlers =
-{
- //
- // GetDescriptor
- //
- GetDescriptor,
-
- //
- // RequestHandler
- //
- HandleRequests,
-
- //
- // InterfaceChange
- //
- InterfaceChange,
-
- //
- // ConfigChange
- //
- ConfigChangeHandler,
-
- //
- // DataReceived
- //
- DataReceived,
-
- //
- // DataSentCallback
- //
- DataSent,
-
- //
- // ResetHandler
- //
- ResetHandler,
-
- //
- // SuspendHandler
- //
- SuspendHandler,
-
- //
- // ResumeHandler
- //
- ResumeHandler,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // DeviceHandler
- //
- HandleDevice,
-};
-
-//****************************************************************************
-//
-// Use the lookup table from the field pui32DeviceWorkspace in the
-// tUSBDCompositeDevice structure to determine which device to call given a
-// particular composite device interface number.
-//
-// The returned value is the index into psDevice->tCompositeEntry indicating
-// the device which contains this interface or INVALID_DEVICE_INDEX if no
-// device contains the passed interface number.
-//
-//****************************************************************************
-static uint32_t
-InterfaceToIndex(tUSBDCompositeDevice *psDevice, uint32_t ui32Interface)
-{
- uint32_t ui32Loop;
- uint32_t ui32Lookup;
-
- //
- // Check each lookup entry in turn.
- //
- for(ui32Loop = 0; ui32Loop < psDevice->ui32NumDevices; ui32Loop++)
- {
- //
- // Get the look up value from the device.
- //
- ui32Lookup = psDevice->psDevices[ui32Loop].ui32DeviceWorkspace;
- ui32Lookup = (ui32Lookup >> (8 * LOOKUP_INTERFACE_BYTE)) & 0xff;
-
- //
- // If the desired interface number is lower than the value in the
- // current lookup table entry, we have found the desired device so
- // return its index.
- //
- if(ui32Interface < ui32Lookup)
- {
- return(ui32Loop);
- }
- }
-
- //
- // If we get here, an invalid interface number was passed so return a
- // marker to indicate this.
- //
- return(INVALID_DEVICE_INDEX);
-}
-
-//****************************************************************************
-//
-// Use the lookup table from the field pui32DeviceWorkspace in the
-// tUSBDCompositeDevice structure to determine which device to call given a
-// particular composite device endpoint number.
-//
-// The returned value is the index into psDevice->tCompositeEntry indicating
-// the device which contains this endpoint or INVALID_DEVICE_INDEX if no
-// device contains the passed endpoint number.
-//
-//****************************************************************************
-static uint32_t
-EndpointToIndex(tUSBDCompositeDevice *psDevice, uint32_t ui32Endpoint,
- bool bInEndpoint)
-{
- uint32_t ui32Loop, ui32EndpointByte, ui32Lookup;
-
- //
- // Are we considering an IN or OUT endpoint?
- //
- ui32EndpointByte = bInEndpoint ? LOOKUP_IN_END_BYTE : LOOKUP_OUT_END_BYTE;
-
- //
- // Check each lookup entry in turn.
- //
- for(ui32Loop = 0; ui32Loop < psDevice->ui32NumDevices; ui32Loop++)
- {
- //
- // Get the look up byte from the device.
- //
- ui32Lookup = psDevice->psDevices[ui32Loop].ui32DeviceWorkspace;
- ui32Lookup = (ui32Lookup >> (ui32EndpointByte * 8)) & 0xff;
-
- //
- // If the desired endpoint number is lower than the value in the
- // current lookup table entry, we have found the desired device so
- // return its index.
- //
- if(ui32Endpoint < ui32Lookup)
- {
- return(ui32Loop);
- }
- }
-
- //
- // If we get here, an invalid endpoint number was passed so return a
- // marker to indicate this.
- //
- return(INVALID_DEVICE_INDEX);
-}
-
-
-//****************************************************************************
-//
-// This function will check if any device classes need a get descriptor
-// handler called.
-//
-//****************************************************************************
-static void
-GetDescriptor(void *pvCompositeInstance, tUSBRequest *psUSBRequest)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- //
- // Create the composite device pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Determine which device this request is intended for. We have to be
- // careful here to send this to the callback for the correct device
- // depending upon whether it is a request sent to the device, the interface
- // or the endpoint.
- //
- switch(psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M)
- {
- case USB_RTYPE_INTERFACE:
- {
- ui32Idx = InterfaceToIndex(psCompDevice,
- (psUSBRequest->wIndex & 0xFF));
- break;
- }
-
- case USB_RTYPE_ENDPOINT:
- {
- ui32Idx = EndpointToIndex(psCompDevice,
- (psUSBRequest->wIndex & 0x0F),
- (psUSBRequest->wIndex & 0x80) ? true : false);
- break;
- }
-
- //
- // Requests sent to the device or any other recipient can't be
- // handled here since we have no way of telling where they are
- // supposed to be handled. As a result, we just stall them.
- //
- // If your composite device has some device-specific descriptors,
- // you should add code here to handle them.
- //
- case USB_RTYPE_DEVICE:
- case USB_RTYPE_OTHER:
- default:
- {
- ui32Idx = INVALID_DEVICE_INDEX;
- break;
- }
- }
-
- //
- // Did we find a device class to pass the request to?
- //
- if(ui32Idx != INVALID_DEVICE_INDEX)
- {
- //
- // Get a pointer to the individual device instance.
- //
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- //
- // Does this device have a GetDescriptor callback?
- //
- if(psDeviceInfo->psCallbacks->pfnGetDescriptor)
- {
- //
- // Remember this device index so that we can correctly route any
- // data notification callbacks to it.
- //
- psCompDevice->sPrivateData.ui32EP0Owner = ui32Idx;
-
- //
- // Call the device to retrieve the descriptor.
- //
- psDeviceInfo->psCallbacks->pfnGetDescriptor(
- psCompDevice->psDevices[ui32Idx].pvInstance, psUSBRequest);
- }
- else
- {
- //
- // Oops - we can't satisfy the request so stall EP0 to indicate
- // an error.
- //
- USBDCDStallEP0(USBBaseToIndex(
- psCompDevice->sPrivateData.ui32USBBase));
- }
- }
- else
- {
- //
- // We are unable to satisfy the descriptor request so stall EP0 to
- // indicate an error.
- //
- USBDCDStallEP0(USBBaseToIndex(
- psCompDevice->sPrivateData.ui32USBBase));
- }
-}
-
-//****************************************************************************
-//
-// This function will check if any device classes need an suspend handler
-// called.
-//
-//****************************************************************************
-static void
-SuspendHandler(void *pvCompositeInstance)
-{
- uint32_t ui32Idx;
- tUSBDCompositeDevice *psCompDevice;
- const tDeviceInfo *psDeviceInfo;
- void *pvDeviceInst;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Inform the application that the device has resumed.
- //
- if(psCompDevice->pfnCallback)
- {
- psCompDevice->pfnCallback(pvCompositeInstance, USB_EVENT_SUSPEND,
- 0, 0);
- }
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
- pvDeviceInst = psCompDevice->psDevices[ui32Idx].pvInstance;
-
- if(psDeviceInfo->psCallbacks->pfnSuspendHandler)
- {
- psDeviceInfo->psCallbacks->pfnSuspendHandler(pvDeviceInst);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function will check if any device classes need an resume handler
-// called.
-//
-//****************************************************************************
-static void
-ResumeHandler(void *pvCompositeInstance)
-{
- uint32_t ui32Idx;
- tUSBDCompositeDevice *psCompDevice;
- const tDeviceInfo *psDeviceInfo;
- void *pvDeviceInst;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Inform the application that the device has resumed.
- //
- if(psCompDevice->pfnCallback)
- {
- psCompDevice->pfnCallback(pvCompositeInstance, USB_EVENT_RESUME,
- 0, 0);
- }
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
- pvDeviceInst = psCompDevice->psDevices[ui32Idx].pvInstance;
-
- if(psDeviceInfo->psCallbacks->pfnResumeHandler)
- {
- psDeviceInfo->psCallbacks->pfnResumeHandler(pvDeviceInst);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function will check if any device classes need an reset handler
-// called.
-//
-//****************************************************************************
-static void
-ResetHandler(void *pvCompositeInstance)
-{
- uint32_t ui32Idx;
- tUSBDCompositeDevice *psCompDevice;
- const tDeviceInfo *psDeviceInfo;
- void *pvDeviceInst;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Inform the application that the device has been connected.
- //
- if(psCompDevice->pfnCallback)
- {
- psCompDevice->pfnCallback(pvCompositeInstance,
- USB_EVENT_CONNECTED, 0, 0);
- }
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
- pvDeviceInst = psCompDevice->psDevices[ui32Idx].pvInstance;
-
- if(psDeviceInfo->psCallbacks->pfnResetHandler)
- {
- psDeviceInfo->psCallbacks->pfnResetHandler(pvDeviceInst);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called to handle data being set to the host so that the
-// application callback can be called when the data has been transferred.
-//
-//****************************************************************************
-static void
-DataSent(void *pvCompositeInstance, uint32_t ui32Info)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Pass this notification on to the device which last handled a
- // transaction on endpoint 0 (assuming we know who that was).
- //
- ui32Idx = psCompDevice->sPrivateData.ui32EP0Owner;
-
- if(ui32Idx != INVALID_DEVICE_INDEX)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnDataSent)
- {
- psDeviceInfo->psCallbacks->pfnDataSent(
- psCompDevice->psDevices[ui32Idx].pvInstance, ui32Info);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called to handle data being received back from the host so
-// that the application callback can be called when the new data is ready.
-//
-//****************************************************************************
-static void
-DataReceived(void *pvCompositeInstance, uint32_t ui32Info)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Pass this notification on to the device which last handled a
- // transaction on endpoint 0 (assuming we know who that was).
- //
- ui32Idx = psCompDevice->sPrivateData.ui32EP0Owner;
-
- if(ui32Idx != INVALID_DEVICE_INDEX)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnDataReceived)
- {
- psDeviceInfo->psCallbacks->pfnDataReceived(
- psCompDevice->psDevices[ui32Idx].pvInstance, ui32Info);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function will check if any device classes need an endpoint handler
-// called.
-//
-//****************************************************************************
-static void
-HandleEndpoints(void *pvCompositeInstance, uint32_t ui32Status)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Call each of the endpoint handlers. This may seem odd since we should
- // only call the handler whose endpoint needs service. Unfortunately, if
- // the device class driver is using uDMA, we have no way of knowing which
- // handler to call (since ui32Status will be 0). Since the handlers are
- // set up to ignore any callback that is not for them, this is safe.
- //
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnEndpointHandler)
- {
- psDeviceInfo->psCallbacks->pfnEndpointHandler(
- psCompDevice->psDevices[ui32Idx].pvInstance, ui32Status);
- }
- }
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvCompositeInstance, uint32_t ui32Request,
- void *pvRequestData)
-{
- uint32_t ui32Idx;
- tUSBDCompositeDevice *psCompDevice;
- const tDeviceInfo *psDeviceInfo;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnDeviceHandler)
- {
- psDeviceInfo->psCallbacks->pfnDeviceHandler(
- psCompDevice->psDevices[ui32Idx].pvInstance, ui32Request,
- pvRequestData);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//****************************************************************************
-static void
-HandleDisconnect(void *pvCompositeInstance)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Inform the application that the device has been disconnected.
- //
- if(psCompDevice->pfnCallback)
- {
- psCompDevice->pfnCallback(pvCompositeInstance,
- USB_EVENT_DISCONNECTED, 0, 0);
- }
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnDisconnectHandler)
- {
- psDeviceInfo->psCallbacks->pfnDisconnectHandler(
- psCompDevice->psDevices[ui32Idx].pvInstance);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called by the USB device stack whenever the device
-// interface changes. It will be passed on to the device classes if they have
-// a handler for this function.
-//
-//****************************************************************************
-static void
-InterfaceChange(void *pvCompositeInstance, uint8_t ui8InterfaceNum,
- uint8_t ui8AlternateSetting)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnInterfaceChange)
- {
- psDeviceInfo->psCallbacks->pfnInterfaceChange(
- psCompDevice->psDevices[ui32Idx].pvInstance,
- ui8InterfaceNum, ui8AlternateSetting);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called by the USB device stack whenever the device
-// configuration changes. It will be passed on to the device classes if they
-// have a handler for this function.
-//
-//****************************************************************************
-static void
-ConfigChangeHandler(void *pvCompositeInstance, uint32_t ui32Value)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- ASSERT(pvCompositeInstance != 0);
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- for(ui32Idx = 0; ui32Idx < psCompDevice->ui32NumDevices; ui32Idx++)
- {
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- if(psDeviceInfo->psCallbacks->pfnConfigChange)
- {
- psDeviceInfo->psCallbacks->pfnConfigChange(
- psCompDevice->psDevices[ui32Idx].pvInstance, ui32Value);
- }
- }
-}
-
-//****************************************************************************
-//
-// This function is called by the USB device stack whenever a non-standard
-// request is received.
-//
-// \param pvCompositeInstance
-// \param psUSBRequest points to the request received.
-//
-// This call will be passed on to the device classes if they have a handler
-// for this function.
-//
-// \return None.
-//
-//****************************************************************************
-static void
-HandleRequests(void *pvCompositeInstance, tUSBRequest *psUSBRequest)
-{
- uint32_t ui32Idx;
- const tDeviceInfo *psDeviceInfo;
- tUSBDCompositeDevice *psCompDevice;
-
- //
- // Create the device instance pointer.
- //
- psCompDevice = (tUSBDCompositeDevice *)pvCompositeInstance;
-
- //
- // Determine which device this request is intended for. We have to be
- // careful here to send this to the callback for the correct device
- // depending upon whether it is a request sent to the device, the interface
- // or the endpoint.
- //
- switch(psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M)
- {
- case USB_RTYPE_INTERFACE:
- {
- ui32Idx = InterfaceToIndex(psCompDevice,
- (psUSBRequest->wIndex & 0xFF));
- break;
- }
-
- case USB_RTYPE_ENDPOINT:
- {
- ui32Idx = EndpointToIndex(psCompDevice,
- (psUSBRequest->wIndex & 0x0F),
- (psUSBRequest->wIndex & 0x80) ? true : false);
- break;
- }
-
- //
- // Requests sent to the device or any other recipient can't be
- // handled here since we have no way of telling where they are
- // supposed to be handled. As a result, we just stall them.
- //
- // If your composite device has some device-specific requests that need
- // to be handled at the device (rather than interface or endpoint)
- // level, you should add code here to handle them.
- //
- case USB_RTYPE_DEVICE:
- case USB_RTYPE_OTHER:
- default:
- {
- ui32Idx = INVALID_DEVICE_INDEX;
- break;
- }
- }
-
- //
- // Did we find a device class to pass the request to?
- //
- if(ui32Idx != INVALID_DEVICE_INDEX)
- {
- //
- // Get a pointer to the individual device instance.
- //
- psDeviceInfo = psCompDevice->psDevices[ui32Idx].psDevInfo;
-
- //
- // Does this device have a RequestHandler callback?
- //
- if(psDeviceInfo->psCallbacks->pfnRequestHandler)
- {
- //
- // Remember this device index so that we can correctly route any
- // data notification callbacks to it.
- //
- psCompDevice->sPrivateData.ui32EP0Owner = ui32Idx;
-
- //
- // Yes - call the device to retrieve the descriptor.
- //
- psDeviceInfo->psCallbacks->pfnRequestHandler(
- psCompDevice->psDevices[ui32Idx].pvInstance,
- psUSBRequest);
- }
- else
- {
- //
- // Oops - we can't satisfy the request so stall EP0 to indicate
- // an error.
- //
- USBDCDStallEP0(USBBaseToIndex(
- psCompDevice->sPrivateData.ui32USBBase));
- }
- }
- else
- {
- //
- // We are unable to satisfy the descriptor request so stall EP0 to
- // indicate an error.
- //
- USBDCDStallEP0(USBBaseToIndex(
- psCompDevice->sPrivateData.ui32USBBase));
- }
-}
-
-//****************************************************************************
-//
-// This function handles sending interface number changes to device instances.
-//
-//****************************************************************************
-static void
-CompositeIfaceChange(tCompositeEntry *psCompDevice, uint8_t ui8Old,
- uint8_t ui8New)
-{
- uint8_t pui8Interfaces[2];
-
- if(psCompDevice->psDevInfo->psCallbacks->pfnDeviceHandler)
- {
- //
- // Create the data to pass to the device handler.
- //
- pui8Interfaces[0] = ui8Old;
- pui8Interfaces[1] = ui8New;
-
- //
- // Call the device handler to inform the class of the interface number
- // change.
- //
- psCompDevice->psDevInfo->psCallbacks->pfnDeviceHandler(
- psCompDevice->pvInstance, USB_EVENT_COMP_IFACE_CHANGE,
- (void *)pui8Interfaces);
- }
-}
-
-//****************************************************************************
-//
-// This function handles sending endpoint number changes to device instances.
-//
-//****************************************************************************
-static void
-CompositeEPChange(tCompositeEntry *psCompDevice, uint8_t ui8Old,
- uint8_t ui8New)
-{
- uint8_t pui8Interfaces[2];
-
- if(psCompDevice->psDevInfo->psCallbacks->pfnDeviceHandler)
- {
- //
- // Create the data to pass to the device handler.
- //
- pui8Interfaces[0] = ui8Old;
- pui8Interfaces[1] = ui8New;
-
- ui8New--;
-
- //
- // Call the device handler to inform the class of the interface number
- // change.
- //
- psCompDevice->psDevInfo->psCallbacks->pfnDeviceHandler(
- psCompDevice->pvInstance, USB_EVENT_COMP_EP_CHANGE,
- (void *)pui8Interfaces);
- }
-}
-
-//****************************************************************************
-//
-// This function merges the configuration descriptors into a single multiple
-// instance device.
-//
-//****************************************************************************
-uint32_t
-BuildCompositeDescriptor(tUSBDCompositeDevice *psCompDevice)
-{
- uint32_t ui32Idx, ui32Offset, ui32CPIdx, ui32FixINT, ui32Dev;
- uint16_t ui16TotalLength, ui16Bytes;
- uint8_t ui8Interface, ui8INEndpoint, ui8OUTEndpoint;
- uint8_t *pui8Data, *pui8Config;
- const tConfigHeader *psConfigHeader;
- tDescriptorHeader *psHeader;
- const uint8_t *pui8Descriptor;
- tInterfaceDescriptor *psInterface;
- tEndpointDescriptor *psEndpoint;
- const tDeviceInfo *psDevice;
-
- //
- // Save the number of devices to look through.
- //
- ui32Dev = 0;
- ui32Idx = 0;
- ui8Interface = 0;
- ui8INEndpoint = 1;
- ui8OUTEndpoint = 1;
- ui32Offset = 0;
- ui32FixINT = 0;
-
- //
- // This puts the first section pointer in the first entry in the list
- // of sections.
- //
- psCompDevice->sPrivateData.ppsCompSections[0] =
- &psCompDevice->sPrivateData.psCompSections[0];
-
- //
- // Put the pointer to this instances configuration descriptor into the
- // front of the list.
- //
- psCompDevice->sPrivateData.ppsCompSections[0]->pui8Data =
- (uint8_t *)&psCompDevice->sPrivateData.sConfigDescriptor;
-
- psCompDevice->sPrivateData.ppsCompSections[0]->ui16Size =
- psCompDevice->sPrivateData.sConfigDescriptor.bLength;
-
- //
- // The configuration descriptor is 9 bytes so initialize the total length
- // to 9 bytes.
- //
- ui16TotalLength = 9;
-
- //
- // Copy the section pointer into the section array for the composite
- // device. This is awkward but is required given the definition
- // of the structures.
- //
- psCompDevice->sPrivateData.ppsCompSections[1] =
- &psCompDevice->sPrivateData.psCompSections[1];
-
- //
- // Copy the pointer to the application supplied space into the section
- // list.
- //
- psCompDevice->sPrivateData.ppsCompSections[1]->ui16Size = 0;
- psCompDevice->sPrivateData.ppsCompSections[1]->pui8Data =
- psCompDevice->sPrivateData.pui8Data;
-
- //
- // Create a local pointer to the data that is used to copy data from
- // the other devices into the composite descriptor.
- //
- pui8Data = psCompDevice->sPrivateData.pui8Data;
-
- //
- // Consider each device in turn.
- //
- while(ui32Dev < psCompDevice->ui32NumDevices)
- {
- //
- // Save the current starting address of this descriptor.
- //
- pui8Config = pui8Data + ui32Offset;
-
- //
- // Create a local pointer to the configuration header.
- //
- psDevice = psCompDevice->psDevices[ui32Dev].psDevInfo;
- psConfigHeader = psDevice->ppsConfigDescriptors[0];
-
- //
- // Loop through each of the sections in this device's configuration
- // descriptor.
- //
- for(ui32Idx = 0; ui32Idx < psConfigHeader->ui8NumSections; ui32Idx++)
- {
- //
- // Initialize the local offset in this descriptor. We include
- // a special case here to ignore the initial 9 byte configuration
- // descriptor since this has already been handled.
- //
- if(ui32Idx)
- {
- //
- // This is not the first section so we handle everything in
- // it.
- //
- ui16Bytes = 0;
- }
- else
- {
- //
- // This is the first section for this device so skip the 9
- // byte configuration descriptor since we've already handled
- // this.
- //
- ui16Bytes = 9;
-
- //
- // If this section includes only the configuration descriptor,
- // skip it entirely.
- //
- if(psConfigHeader->psSections[ui32Idx]->ui16Size <= ui16Bytes)
- {
- continue;
- }
- }
-
- //
- // Get a pointer to the configuration descriptor.
- //
- pui8Descriptor = psConfigHeader->psSections[ui32Idx]->pui8Data;
-
- //
- // Bounds check the allocated space and return if there is not
- // enough space.
- //
- if(ui32Offset > psCompDevice->sPrivateData.ui32DataSize)
- {
- return(1);
- }
-
- //
- // Copy the descriptor from the device into the descriptor list.
- //
- for(ui32CPIdx = 0;
- ui32CPIdx < psConfigHeader->psSections[ui32Idx]->ui16Size;
- ui32CPIdx++)
- {
- pui8Data[ui32CPIdx + ui32Offset] = pui8Descriptor[ui32CPIdx];
- }
-
- //
- // Read out the descriptors in this section.
- //
- while(ui16Bytes < psConfigHeader->psSections[ui32Idx]->ui16Size)
- {
- //
- // Create a descriptor header pointer.
- //
- psHeader = (tDescriptorHeader *)&pui8Data[ui32Offset +
- ui16Bytes];
-
- //
- // Check for interface descriptors and modify the numbering to
- // match the composite device.
- //
- if(psHeader->bDescriptorType == USB_DTYPE_INTERFACE)
- {
- psInterface = (tInterfaceDescriptor *)psHeader;
-
- //
- // See if this is an alternate setting or the initial
- // setting.
- //
- if(psInterface->bAlternateSetting != 0)
- {
- //
- // If this is an alternate setting then use the
- // previous interface number because the current one
- // has already been incremented.
- //
- psInterface->bInterfaceNumber = ui8Interface - 1;
- }
- else
- {
- //
- // Notify the class that it's interface number has
- // changed.
- //
- CompositeIfaceChange(
- &psCompDevice->psDevices[ui32Dev],
- psInterface->bInterfaceNumber,
- ui8Interface);
- //
- // This was the non-alternate setting so save the
- // value and move to the next interface number.
- //
- psInterface->bInterfaceNumber = ui8Interface;
-
- //
- // No strings allowed on interface descriptors for
- // composite devices.
- //
- psInterface->iInterface = 0;
-
- ui8Interface++;
- }
- }
- //
- // Check for endpoint descriptors and modify the numbering to
- // match the composite device.
- //
- else if(psHeader->bDescriptorType == USB_DTYPE_ENDPOINT)
- {
- psEndpoint = (tEndpointDescriptor *)psHeader;
-
- //
- // Check if this is an IN or OUT endpoint.
- //
- if(psEndpoint->bEndpointAddress & USB_RTYPE_DIR_IN)
- {
- //
- // Check if this is the special Fixed Interrupt class
- // and this is the interrupt endpoint.
- //
- if(((psEndpoint->bmAttributes & USB_EP_ATTR_TYPE_M) ==
- USB_EP_ATTR_INT) &&
- (psCompDevice->ui16PID == USB_PID_COMP_SERIAL))
- {
- //
- // Check if the Fixed Interrupt endpoint has been
- // set yet.
- //
- if(ui32FixINT == 0)
- {
- //
- // Allocate the fixed interrupt endpoint and
- // save its number.
- //
- ui32FixINT = ui8INEndpoint++;
- }
-
- CompositeEPChange(
- &psCompDevice->psDevices[ui32Dev],
- psEndpoint->bEndpointAddress,
- ui32FixINT);
-
- psEndpoint->bEndpointAddress = ui32FixINT |
- USB_RTYPE_DIR_IN;
- }
- else
- {
- //
- // Notify the class that it's interface number has
- // changed.
- //
- CompositeEPChange(
- &psCompDevice->psDevices[ui32Dev],
- psEndpoint->bEndpointAddress,
- ui8INEndpoint);
-
- psEndpoint->bEndpointAddress = ui8INEndpoint++ |
- USB_RTYPE_DIR_IN;
- }
- }
- else
- {
- //
- // Notify the class that it's interface number has
- // changed.
- //
- CompositeEPChange(&psCompDevice->psDevices[ui32Dev],
- psEndpoint->bEndpointAddress,
- ui8OUTEndpoint);
- psEndpoint->bEndpointAddress = ui8OUTEndpoint++;
- }
- }
-
- //
- // Move on to the next descriptor.
- //
- ui16Bytes += psHeader->bLength;
- }
-
- ui32Offset += psConfigHeader->psSections[ui32Idx]->ui16Size;
-
- ui16TotalLength += ui16Bytes;
- }
-
- //
- // Allow the device class to make adjustments to the configuration
- // descriptor.
- //
- psCompDevice->psDevices[ui32Dev].psDevInfo->psCallbacks->pfnDeviceHandler(
- psCompDevice->psDevices[ui32Dev].pvInstance,
- USB_EVENT_COMP_CONFIG, (void *)pui8Config);
-
- //
- // Add an entry into the device workspace array to allow us to quickly
- // map interface and endpoint numbers to device instances later.
- //
- psCompDevice->psDevices[ui32Dev].ui32DeviceWorkspace =
- (ui32Dev << (LOOKUP_INDEX_BYTE * 8)) |
- (ui8Interface << (LOOKUP_INTERFACE_BYTE * 8)) |
- (ui8OUTEndpoint << (LOOKUP_OUT_END_BYTE * 8)) |
- (ui8INEndpoint << (LOOKUP_IN_END_BYTE * 8));
-
- //
- // Move on to the next device.
- //
- ui32Dev++;
- }
-
- //
- // Modify the configuration descriptor to match the number of interfaces
- // and the new total size.
- //
- psCompDevice->sPrivateData.sCompConfigHeader.ui8NumSections = 2;
- psCompDevice->sPrivateData.ppsCompSections[1]->ui16Size = ui32Offset;
- psCompDevice->sPrivateData.sConfigDescriptor.bNumInterfaces =
- ui8Interface;
- psCompDevice->sPrivateData.sConfigDescriptor.wTotalLength =
- ui16TotalLength;
-
-
- return(0);
-}
-
-//****************************************************************************
-//
-//! This function should be called once for the composite class device to
-//! initialize basic operation and prepare for enumeration.
-//!
-//! \param ui32Index is the index of the USB controller to initialize for
-//! composite device operation.
-//! \param psDevice points to a structure containing parameters customizing
-//! the operation of the composite device.
-//! \param ui32Size is the size in bytes of the data pointed to by the
-//! \e pui8Data parameter.
-//! \param pui8Data is the data area that the composite class can use to build
-//! up descriptors.
-//!
-//! In order for an application to initialize the USB composite device class,
-//! it must first call this function with the a valid composite device class
-//! structure in the \e psDevice parameter. This allows this function to
-//! initialize the USB controller and device code to be prepared to enumerate
-//! and function as a USB composite device. The \e ui32Size and \e pui8Data
-//! parameters should be large enough to hold all of the class instances
-//! passed in via the \e psDevice structure. This is typically the full size
-//! of the configuration descriptor for a device minus its configuration
-//! header(9 bytes).
-//!
-//! This function returns a void pointer that must be passed in to all other
-//! APIs used by the composite class.
-//!
-//! See the documentation on the tUSBDCompositeDevice structure for more
-//! information on how to properly fill the structure members.
-//!
-//! \return This function returns 0 on failure or a non-zero void pointer on
-//! success.
-//
-//****************************************************************************
-void *
-USBDCompositeInit(uint32_t ui32Index, tUSBDCompositeDevice *psDevice,
- uint32_t ui32Size, uint8_t *pui8Data)
-{
- tCompositeInstance *psInst;
- int32_t i32Idx;
- uint8_t *pui8Temp;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psDevice);
- ASSERT(psDevice->ppui8StringDescriptors);
-
- //
- // Initialize the work space in the passed instance structure.
- //
- psInst = &psDevice->sPrivateData;
- psInst->ui32DataSize = ui32Size;
- psInst->pui8Data = pui8Data;
-
- //
- // Save the base address of the USB controller.
- //
- psInst->ui32USBBase = USBIndexToBase(ui32Index);
-
- //
- // No device is currently transferring data on EP0.
- //
- psInst->ui32EP0Owner = INVALID_DEVICE_INDEX;
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sCompHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8CompDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors =
- (const tConfigHeader * const *)g_ppCompConfigDescriptors;
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- //
- // Initialize the device info structure for the composite device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- g_ppCompConfigDescriptors[0] = &psInst->sCompConfigHeader;
- g_ppCompConfigDescriptors[0]->ui8NumSections = 0;
- g_ppCompConfigDescriptors[0]->psSections =
- (const tConfigSection * const *)psDevice->sPrivateData.ppsCompSections;
-
- //
- // Create a byte pointer to use with the copy.
- //
- pui8Temp = (uint8_t *)&psInst->sConfigDescriptor;
-
- //
- // Copy the default configuration descriptor into the instance data.
- //
- for(i32Idx = 0; i32Idx < g_pui8CompConfigDescriptor[0]; i32Idx++)
- {
- pui8Temp[i32Idx] = g_pui8CompConfigDescriptor[i32Idx];
- }
-
- //
- // Create a byte pointer to use with the copy.
- //
- pui8Temp = (uint8_t *)&psInst->sDeviceDescriptor;
-
- //
- // Copy the default configuration descriptor into the instance data.
- //
- for(i32Idx = 0; i32Idx < g_pui8CompDeviceDescriptor[0]; i32Idx++)
- {
- pui8Temp[i32Idx] = g_pui8CompDeviceDescriptor[i32Idx];
- }
-
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- psInst->sDeviceDescriptor.idVendor = psDevice->ui16VID;
- psInst->sDeviceDescriptor.idProduct = psDevice->ui16PID;
-
- //
- // Fix up the configuration descriptor with client-supplied values.
- //
- psInst->sConfigDescriptor.bmAttributes = psDevice->ui8PwrAttributes;
- psInst->sConfigDescriptor.bMaxPower =
- (uint8_t)(psDevice->ui16MaxPowermA>>1);
-
- psInst->sDevInfo.pui8DeviceDescriptor =
- (const uint8_t *)&psInst->sDeviceDescriptor;
-
- //
- // Plug in the client's string table to the device information
- // structure.
- //
- psInst->sDevInfo.ppui8StringDescriptors =
- psDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psDevice->ui32NumStringDescriptors;
-
- //
- // Enable Clocking to the USB controller so that changes to the USB
- // controller can be made in the BuildCompositeDescriptor() function.
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
-
- //
- // Create the combined descriptors.
- //
- if(BuildCompositeDescriptor(psDevice))
- {
- return(0);
- }
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the bulk device on the bus.
- //
- USBDCDInit(ui32Index, &psInst->sDevInfo, (void *)psDevice);
-
- //
- // Return the pointer to the instance indicating that everything went
- // well.
- //
- return((void *)psDevice);
-}
-
-//****************************************************************************
-//
-//! Shuts down the composite device.
-//!
-//! \param pvCompositeInstance is the pointer to the device instance structure
-//! as returned by USBDCompositeInit().
-//!
-//! This function terminates composite device interface for the instance
-//! not me supplied. Following this call, the \e pvCompositeInstance instance
-//! should not be used in any other calls.
-//!
-//! \return None.
-//
-//****************************************************************************
-void
-USBDCompositeTerm(void *pvCompositeInstance)
-{
- ASSERT(pvCompositeInstance != 0);
-
-}
-
-//****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//****************************************************************************
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.h
deleted file mode 100644
index 4bd66f35a..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdcomp.h
+++ /dev/null
@@ -1,260 +0,0 @@
-//*****************************************************************************
-//
-// usbdcomp.h - USB composite device class driver.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDCOMP_H__
-#define __USBDCOMP_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup composite_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//
-// Defines a single entry in a table of device types supported by the composite
-// device.
-//
-typedef struct
-{
- //
- // This is set internally by the composite class so it can be left
- // uninitialized by the application.
- //
- const tDeviceInfo *psDeviceInfo;
-
- //
- // This should be the header to the configuration header for a class.
- //
- const tConfigHeader *psConfigHeader;
-
- //
- // The offset to this devices interface, filled in by the composite class.
- //
- uint8_t ui8IfaceOffset;
-}
-tUSBDCompositeEntry;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for the
-// composite device class. The memory for this structure is included in
-// the sPrivateData field in the tUSBDCompositeDevice structure passed on
-// USBDCompositeInit() and should not be modified by any code outside of the
-// composite device code.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Saves which USB controller is in use.
- //
- uint32_t ui32USBBase;
-
- //
- // The device information pointer.
- //
- tDeviceInfo sDevInfo;
-
- //
- // This is the configuration descriptor for this instance.
- //
- tConfigDescriptor sConfigDescriptor;
-
- //
- // This is the device descriptor for this instance.
- //
- tDeviceDescriptor sDeviceDescriptor;
-
- //
- // The configuration header for this instance.
- //
- tConfigHeader sCompConfigHeader;
-
- //
- // These are the configuration sections that will be built from the
- // Configuration Descriptor header and the descriptors from the devices
- // that are part of this composite device.
- //
- tConfigSection psCompSections[2];
- tConfigSection *ppsCompSections[2];
-
- //
- // The size and pointer to the data used by the instance.
- //
- uint32_t ui32DataSize;
- uint8_t *pui8Data;
-
- //
- // The current "owner" of endpoint 0. This is used to track the device
- // class which is currently transferring data on EP0.
- //
- uint32_t ui32EP0Owner;
-}
-tCompositeInstance;
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the composite device class.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in mA.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self or bus-powered and whether or not
- //! it supports remote wake up. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events relating to the operation of the composite
- //! device.
- //
- const tUSBCallback pfnCallback;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1), Composite
- //! device interface description string (language 1), Configuration
- //! description string (language 1).
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //!
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + ((5 + (number of strings)) *
- //! (number of languages)).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The number of devices in the psDevices array.
- //
- const uint32_t ui32NumDevices;
-
- //
- //! This application supplied array holds the the top level device class
- //! information as well as the Instance data for that class.
- //
- tCompositeEntry * const psDevices;
-
- //
- //! The private data for this device instance. This memory must remain
- //! accessible for as long as the composite device is in use and must
- //! not be modified by any code outside the composite class driver.
- //
- tCompositeInstance sPrivateData;
-}
-tUSBDCompositeDevice;
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-// Composite specific device class driver events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDCompositeInit(uint32_t ui32Index,
- tUSBDCompositeDevice *psCompDevice,
- uint32_t ui32Size, uint8_t *pui8Data);
-extern void USBDCompositeTerm(void *pvInstance);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdconfig.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdconfig.c
deleted file mode 100644
index 2fbd5b1eb..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdconfig.c
+++ /dev/null
@@ -1,562 +0,0 @@
-//*****************************************************************************
-//
-// usbdconfig.c - High level USB device configuration function.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdevicepriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Structure used in compiling FIFO size and endpoint properties from a
-// configuration descriptor.
-//
-//*****************************************************************************
-typedef struct
-{
- uint32_t pui32Size[2];
-}
-tUSBEndpointInfo;
-
-//*****************************************************************************
-//
-// Indices used when accessing the tUSBEndpointInfo structure.
-//
-//*****************************************************************************
-#define EP_INFO_IN 0
-#define EP_INFO_OUT 1
-
-//*****************************************************************************
-//
-// Given a maximum packet size and the user's FIFO scaling requirements,
-// determine the flags to use to configure the endpoint FIFO and the number
-// of bytes of FIFO space occupied.
-//
-//*****************************************************************************
-static uint32_t
-GetEndpointFIFOSize(uint32_t ui32MaxPktSize, uint32_t *pupBytesUsed)
-{
- uint32_t ui32Loop, ui32FIFOSize;
-
- //
- // Now we need to find the nearest supported size that accommodates the
- // requested size. Step through each of the supported sizes until we
- // find one that will do.
- //
- for(ui32Loop = USB_FIFO_SZ_8; ui32Loop <= USB_FIFO_SZ_2048; ui32Loop++)
- {
- //
- // How many bytes does this FIFO value represent?
- //
- ui32FIFOSize = USBFIFOSizeToBytes(ui32Loop);
-
- //
- // Is this large enough to hold one packet.
- //
- if(ui32FIFOSize >= ui32MaxPktSize)
- {
- //
- // Return the FIFO size setting and the USB_FIFO_SZ_ value.
- //
- *pupBytesUsed = ui32FIFOSize;
-
- return(ui32Loop);
- }
- }
-
- //
- // If we drop out, we can't support the FIFO size requested. Signal a
- // problem by returning 0 in the pBytesUsed
- //
- *pupBytesUsed = 0;
-
- return(USB_FIFO_SZ_8);
-}
-
-//*****************************************************************************
-//
-// Translate a USB endpoint descriptor into the values we need to pass to the
-// USBDevEndpointConfigSet() API.
-//
-//*****************************************************************************
-static void
-GetEPDescriptorType(tEndpointDescriptor *psEndpoint, uint32_t *pui32EPIndex,
- uint32_t *pui32MaxPktSize, uint32_t *pui32Flags)
-{
- //
- // Get the endpoint index.
- //
- *pui32EPIndex = psEndpoint->bEndpointAddress & USB_EP_DESC_NUM_M;
-
- //
- // Extract the maximum packet size.
- //
- *pui32MaxPktSize = psEndpoint->wMaxPacketSize & USB_EP_MAX_PACKET_COUNT_M;
-
- //
- // Is this an IN or an OUT endpoint?
- //
- *pui32Flags = (psEndpoint->bEndpointAddress & USB_EP_DESC_IN) ?
- USB_EP_DEV_IN : USB_EP_DEV_OUT;
-
- //
- // Set the endpoint mode.
- //
- switch(psEndpoint->bmAttributes & USB_EP_ATTR_TYPE_M)
- {
- case USB_EP_ATTR_CONTROL:
- {
- *pui32Flags |= USB_EP_MODE_CTRL;
- break;
- }
- case USB_EP_ATTR_BULK:
- {
- *pui32Flags |= USB_EP_MODE_BULK;
- break;
- }
- case USB_EP_ATTR_INT:
- {
- *pui32Flags |= USB_EP_MODE_INT;
- break;
- }
- case USB_EP_ATTR_ISOC:
- {
- *pui32Flags |= USB_EP_MODE_ISOC;
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-//! Configure the USB controller appropriately for the device whose
-//! configuration descriptor is passed.
-//!
-//! \param psDevInst is a pointer to the device instance being configured.
-//! \param psConfig is a pointer to the configuration descriptor that the
-//! USB controller is to be set up to support.
-//!
-//! This function may be used to initialize a USB controller to operate as
-//! the device whose configuration descriptor is passed. The function
-//! enables the USB controller, partitions the FIFO appropriately and
-//! configures each endpoint required by the configuration. If the supplied
-//! configuration supports multiple alternate settings for any interface,
-//! the USB FIFO is set up assuming the worst case use (largest packet size
-//! for a given endpoint in any alternate setting using that endpoint) to
-//! allow for on-the-fly alternate setting changes later. On return from this
-//! function, the USB controller is configured for correct operation of
-//! the default configuration of the device described by the descriptor passed.
-//!
-//! USBDCDConfig() is an optional call and applications may chose to make
-//! direct calls to SysCtlPeripheralEnable(), SysCtlUSBPLLEnable(),
-//! USBDevEndpointConfigSet() and USBFIFOConfigSet() instead of using this
-//! function. If this function is used, it must be called prior to
-//! USBDCDInit() since this call assumes that the low level hardware
-//! configuration has been completed before it is made.
-//!
-//! \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-bool
-USBDeviceConfig(tDCDInstance *psDevInst, const tConfigHeader *psConfig)
-{
- uint32_t ui32Loop, ui32Count, ui32NumInterfaces, ui32EpIndex, ui32EpType,
- ui32MaxPkt, ui32NumEndpoints, ui32Flags, ui32BytesUsed,
- ui32Section;
- tInterfaceDescriptor *psInterface;
- tEndpointDescriptor *psEndpoint;
- tUSBEndpointInfo psEPInfo[NUM_USB_EP - 1];
-
- //
- // A valid device instance is required.
- //
- ASSERT(psDevInst != 0);
-
- //
- // Catch bad pointers in a debug build.
- //
- ASSERT(psConfig);
-
- //
- // Clear out our endpoint info.
- //
- for(ui32Loop = 0; ui32Loop < (NUM_USB_EP - 1); ui32Loop++)
- {
- psEPInfo[ui32Loop].pui32Size[EP_INFO_IN] = 0;
- psEPInfo[ui32Loop].pui32Size[EP_INFO_OUT] = 0;
- }
-
- //
- // How many (total) endpoints does this configuration describe?
- //
- ui32NumEndpoints = USBDCDConfigDescGetNum(psConfig,
- USB_DTYPE_ENDPOINT);
-
- //
- // How many interfaces are included?
- //
- ui32NumInterfaces = USBDCDConfigDescGetNum(psConfig,
- USB_DTYPE_INTERFACE);
-
- //
- // Look at each endpoint and determine the largest max packet size for
- // each endpoint. This will determine how we partition the USB FIFO.
- //
- for(ui32Loop = 0; ui32Loop < ui32NumEndpoints; ui32Loop++)
- {
- //
- // Get a pointer to the endpoint descriptor.
- //
- psEndpoint = (tEndpointDescriptor *)USBDCDConfigDescGet(
- psConfig, USB_DTYPE_ENDPOINT, ui32Loop,
- &ui32Section);
-
- //
- // Extract the endpoint number and whether it is an IN or OUT
- // endpoint.
- //
- ui32EpIndex = (uint32_t)
- psEndpoint->bEndpointAddress & USB_EP_DESC_NUM_M;
- ui32EpType = (psEndpoint->bEndpointAddress & USB_EP_DESC_IN) ?
- EP_INFO_IN : EP_INFO_OUT;
-
- //
- // Make sure the endpoint number is valid for our controller. If not,
- // return false to indicate an error. Note that 0 is invalid since
- // you shouldn't reference endpoint 0 in the config descriptor.
- //
- if((ui32EpIndex >= NUM_USB_EP) || (ui32EpIndex == 0))
- {
- return(false);
- }
-
- //
- // Does this endpoint have a max packet size requirement larger than
- // any previous use we have seen?
- //
- if(psEndpoint->wMaxPacketSize >
- psEPInfo[ui32EpIndex - 1].pui32Size[ui32EpType])
- {
- //
- // Yes - remember the new maximum packet size.
- //
- psEPInfo[ui32EpIndex - 1].pui32Size[ui32EpType] =
- psEndpoint->wMaxPacketSize;
- }
- }
-
- //
- // At this point, we have determined the maximum packet size required
- // for each endpoint by any possible alternate setting of any interface
- // in this configuration. Now determine the endpoint settings required
- // for the interface setting we are actually going to use.
- //
- for(ui32Loop = 0; ui32Loop < ui32NumInterfaces; ui32Loop++)
- {
- //
- // Get the next interface descriptor in the configuration descriptor.
- //
- psInterface = USBDCDConfigGetInterface(psConfig, ui32Loop,
- USB_DESC_ANY, &ui32Section);
-
- //
- // Is this the default interface (bAlternateSetting set to 0)?
- //
- if(psInterface && (psInterface->bAlternateSetting == 0))
- {
- //
- // This is an interface we are interested in so gather the
- // information on its endpoints.
- //
- ui32NumEndpoints = (uint32_t)psInterface->bNumEndpoints;
-
- //
- // Walk through each endpoint in this interface and configure
- // it appropriately.
- //
- for(ui32Count = 0; ui32Count < ui32NumEndpoints; ui32Count++)
- {
- //
- // Get a pointer to the endpoint descriptor.
- //
- psEndpoint = USBDCDConfigGetInterfaceEndpoint(psConfig,
- psInterface->bInterfaceNumber,
- psInterface->bAlternateSetting,
- ui32Count);
-
- //
- // Make sure we got a good pointer.
- //
- if(psEndpoint)
- {
- //
- // Determine maximum packet size and flags from the
- // endpoint descriptor.
- //
- GetEPDescriptorType(psEndpoint, &ui32EpIndex, &ui32MaxPkt,
- &ui32Flags);
-
- //
- // Make sure no-one is trying to configure endpoint 0.
- //
- if(!ui32EpIndex)
- {
- return(false);
- }
-
- //
- // Set the endpoint configuration.
- //
- USBDevEndpointConfigSet(USB0_BASE,
- IndexToUSBEP(ui32EpIndex),
- ui32MaxPkt, ui32Flags);
- }
- }
- }
- }
-
- //
- // At this point, we have configured all the endpoints that are to be
- // used by this configuration's alternate setting 0. Now we go on and
- // partition the FIFO based on the maximum packet size information we
- // extracted earlier. Endpoint 0 is automatically configured to use the
- // first MAX_PACKET_SIZE_EP0 bytes of the FIFO so we start from there.
- //
- ui32Count = MAX_PACKET_SIZE_EP0;
- for(ui32Loop = 1; ui32Loop < NUM_USB_EP; ui32Loop++)
- {
- //
- // Configure the IN endpoint at this index if it is referred to
- // anywhere.
- //
- if(psEPInfo[ui32Loop - 1].pui32Size[EP_INFO_IN])
- {
- //
- // What FIFO size flag do we use for this endpoint?
- //
- ui32MaxPkt = GetEndpointFIFOSize(
- psEPInfo[ui32Loop - 1].pui32Size[EP_INFO_IN],
- &ui32BytesUsed);
-
- //
- // The FIFO space could not be allocated.
- //
- if(ui32BytesUsed == 0)
- {
- return(false);
- }
-
- //
- // Now actually configure the FIFO for this endpoint.
- //
- USBFIFOConfigSet(USB0_BASE, IndexToUSBEP(ui32Loop), ui32Count,
- ui32MaxPkt, USB_EP_DEV_IN);
- ui32Count += ui32BytesUsed;
- }
-
- //
- // Configure the OUT endpoint at this index.
- //
- if(psEPInfo[ui32Loop - 1].pui32Size[EP_INFO_OUT])
- {
- //
- // What FIFO size flag do we use for this endpoint?
- //
- ui32MaxPkt = GetEndpointFIFOSize(
- psEPInfo[ui32Loop - 1].pui32Size[EP_INFO_OUT],
- &ui32BytesUsed);
-
- //
- // The FIFO space could not be allocated.
- //
- if(ui32BytesUsed == 0)
- {
- return(false);
- }
-
- //
- // Now actually configure the FIFO for this endpoint.
- //
- USBFIFOConfigSet(USB0_BASE, IndexToUSBEP(ui32Loop), ui32Count,
- ui32MaxPkt, USB_EP_DEV_OUT);
- ui32Count += ui32BytesUsed;
- }
-
- }
-
- //
- // If we get to the end, all is well.
- //
- return(true);
-}
-
-//*****************************************************************************
-//
-//! Configure the affected USB endpoints appropriately for one alternate
-//! interface setting.
-//!
-//! \param psDevInst is a pointer to the device instance being configured.
-//! \param psConfig is a pointer to the configuration descriptor that contains
-//! the interface whose alternate settings is to be configured.
-//! \param ui8InterfaceNum is the number of the interface whose alternate
-//! setting is to be configured. This number corresponds to the
-//! bInterfaceNumber field in the desired interface descriptor.
-//! \param ui8AlternateSetting is the alternate setting number for the desired
-//! interface. This number corresponds to the bAlternateSetting field in the
-//! desired interface descriptor.
-//!
-//! This function may be used to reconfigure the endpoints of an interface
-//! for operation in one of the interface's alternate settings. Note that this
-//! function assumes that the endpoint FIFO settings will not need to change
-//! and only the endpoint mode is changed. This assumption is valid if the
-//! USB controller was initialized using a previous call to USBDCDConfig().
-//!
-//! In reconfiguring the interface endpoints, any additional configuration
-//! bits set in the endpoint configuration other than the direction (\b
-//! USB_EP_DEV_IN or \b USB_EP_DEV_OUT) and mode (\b USB_EP_MODE_MASK) are
-//! preserved.
-//!
-//! \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-bool
-USBDeviceConfigAlternate(tDCDInstance *psDevInst,
- const tConfigHeader *psConfig,
- uint8_t ui8InterfaceNum,
- uint8_t ui8AlternateSetting)
-{
- uint32_t ui32NumInterfaces, ui32NumEndpoints, ui32Loop, ui32Count,
- ui32MaxPkt, ui32Flags, ui32Section, ui32EpIndex;
- tInterfaceDescriptor *psInterface;
- tEndpointDescriptor *psEndpoint;
-
- //
- // How many interfaces are included in the descriptor?
- //
- ui32NumInterfaces = USBDCDConfigDescGetNum(psConfig,
- USB_DTYPE_INTERFACE);
-
- //
- // Find the interface descriptor for the supplied interface and alternate
- // setting numbers.
- //
-
- for(ui32Loop = 0; ui32Loop < ui32NumInterfaces; ui32Loop++)
- {
- //
- // Get the next interface descriptor in the configuration descriptor.
- //
- psInterface = USBDCDConfigGetInterface(psConfig, ui32Loop,
- USB_DESC_ANY, &ui32Section);
-
- //
- // Is this the default interface (bAlternateSetting set to 0)?
- //
- if(psInterface &&
- (psInterface->bInterfaceNumber == ui8InterfaceNum) &&
- (psInterface->bAlternateSetting == ui8AlternateSetting))
- {
- //
- // This is an interface we are interested in and the descriptor
- // representing the alternate setting we want so go ahead and
- // reconfigure the endpoints.
- //
-
- //
- // How many endpoints does this interface have?
- //
- ui32NumEndpoints = (uint32_t)psInterface->bNumEndpoints;
-
- //
- // Walk through each endpoint in turn.
- //
- for(ui32Count = 0; ui32Count < ui32NumEndpoints; ui32Count++)
- {
- //
- // Get a pointer to the endpoint descriptor.
- //
- psEndpoint = USBDCDConfigGetInterfaceEndpoint(psConfig,
- psInterface->bInterfaceNumber,
- psInterface->bAlternateSetting,
- ui32Count);
-
- //
- // Make sure we got a good pointer.
- //
- if(psEndpoint)
- {
- //
- // Determine maximum packet size and flags from the
- // endpoint descriptor.
- //
- GetEPDescriptorType(psEndpoint, &ui32EpIndex, &ui32MaxPkt,
- &ui32Flags);
-
- //
- // Make sure no-one is trying to configure endpoint 0.
- //
- if(!ui32EpIndex)
- {
- return(false);
- }
-
- //
- // Set the endpoint configuration.
- //
- USBDevEndpointConfigSet(USB0_BASE,
- IndexToUSBEP(ui32EpIndex),
- ui32MaxPkt, ui32Flags);
- }
- }
-
- //
- // At this point, we have reconfigured the desired interface so
- // return indicating all is well.
- //
- return(true);
- }
- }
-
- return(false);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.c
deleted file mode 100644
index 6664633c7..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.c
+++ /dev/null
@@ -1,661 +0,0 @@
-//*****************************************************************************
-//
-// usbddfu-rt.c - USB Device Firmware Update runtime device class driver.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "inc/hw_nvic.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/systick.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbdfu.h"
-#include "usblib/usb-ids.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbddfu-rt.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup dfu_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// DFU Device Descriptor. This is a dummy structure since runtime DFU must be
-// a part of a composite device and cannot be instantiated on its own.
-//
-//*****************************************************************************
-const uint8_t g_pui8DFUDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts
- // assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- USB_CLASS_VEND_SPECIFIC, // USB Device Class
- 0, // USB Device Sub-class
- 0, // USB Device protocol
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (VID).
- USBShort(0), // Product ID (PID).
- USBShort(0), // Device Release Number BCD.
- 0, // Manufacturer string identifier.
- 0, // Product string identifier.
- 0, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// DFU device runtime configuration descriptor. This is also a dummy structure
-// since the primary device class configuration will be used when DFU is added
-// to the composite device.
-//
-//*****************************************************************************
-uint8_t g_pui8DFUConfigDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(27), // The total size of this full structure.
- 1, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 0, // The string identifier that describes
- // this configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake
- // up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// The DFU runtime interface descriptor.
-//
-//*****************************************************************************
-uint8_t g_pui8DFUInterface[DFUINTERFACE_SIZE] =
-{
- //
- // Interface descriptor for runtime DFU operation.
- //
- 9, // Length of this descriptor.
- USB_DTYPE_INTERFACE, // This is an interface descriptor.
- 0, // Interface number .
- 0, // Alternate setting number.
- 0, // Number of endpoints (only endpoint 0
- // used)
- USB_CLASS_APP_SPECIFIC, // Application specific interface class
- USB_DFU_SUBCLASS, // Device Firmware Upgrade subclass
- USB_DFU_RUNTIME_PROTOCOL, // DFU runtime protocol
- 0, // No string descriptor for this interface.
-};
-
-//*****************************************************************************
-//
-// The DFU functional descriptor.
-//
-//*****************************************************************************
-uint8_t g_pui8DFUFunctionalDesc[DFUFUNCTIONALDESC_SIZE] =
-{
- //
- // Device Firmware Upgrade functional descriptor.
- //
- 9, // Length of this descriptor.
- USB_DFU_FUNC_DESCRIPTOR_TYPE, // DFU Functional descriptor type
- (DFU_ATTR_CAN_DOWNLOAD | // DFU attributes.
- DFU_ATTR_CAN_UPLOAD |
- DFU_ATTR_WILL_DETACH |
- DFU_ATTR_MANIFEST_TOLERANT),
- USBShort(0xFFFF), // Detach timeout (set to maximum).
- USBShort(DFU_TRANSFER_SIZE), // Transfer size 1KB.
- USBShort(0x0110) // DFU Version 1.1
-};
-
-//*****************************************************************************
-//
-// The DFU runtime configuration descriptor is defined as two sections.
-// These sections are:
-//
-// 1. The 9 byte configuration descriptor.
-// 2. The interface descriptor + DFU functional descriptor.
-//
-//*****************************************************************************
-const tConfigSection g_sDFUConfigSection =
-{
- sizeof(g_pui8DFUConfigDescriptor),
- g_pui8DFUConfigDescriptor
-};
-
-const tConfigSection g_sDFUInterfaceSection =
-{
- sizeof(g_pui8DFUInterface),
- g_pui8DFUInterface
-};
-
-const tConfigSection g_sDFUFunctionalDescSection =
-{
- sizeof(g_pui8DFUFunctionalDesc),
- g_pui8DFUFunctionalDesc
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete DFU runtime configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psDFUSections[] =
-{
- &g_sDFUConfigSection,
- &g_sDFUInterfaceSection,
- &g_sDFUFunctionalDescSection
-};
-
-#define NUM_DFU_SECTIONS (sizeof(g_psDFUSections) / \
- sizeof(g_psDFUSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor.
-//
-//*****************************************************************************
-tConfigHeader g_sDFUConfigHeader =
-{
- NUM_DFU_SECTIONS,
- g_psDFUSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppsDFUConfigDescriptors[] =
-{
- &g_sDFUConfigHeader
-};
-
-//*****************************************************************************
-//
-// Forward references for device handler callbacks
-//
-//*****************************************************************************
-static void HandleGetDescriptor(void *pvDFUInstance, tUSBRequest *psUSBRequest);
-static void HandleRequest(void *pvDFUInstance, tUSBRequest *psUSBRequest);
-static void HandleDevice(void *pvDFUInstance, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// The device information structure for the USB DFU devices.
-//
-//*****************************************************************************
-static const tCustomHandlers g_sDFUHandlers =
-{
- //
- // GetDescriptor
- //
- HandleGetDescriptor,
-
- //
- // RequestHandler
- //
- HandleRequest,
-
- //
- // InterfaceChange
- //
- 0,
-
- //
- // ConfigChange
- //
- 0,
-
- //
- // DataReceived
- //
- 0,
-
- //
- // DataSentCallback
- //
- 0,
-
- //
- // ResetHandler
- //
- 0,
-
- //
- // SuspendHandler
- //
- 0,
-
- //
- //
-
- //
- // ResumeHandler
- //
- 0,
-
- //
- // DisconnectHandler
- //
- 0,
-
- //
- // EndpointHandler
- //
- 0,
-
- //
- // Device handler.
- //
- HandleDevice,
-};
-
-//*****************************************************************************
-//
-// Device instance specific handler. This callback received notifications of
-// events related to handling interface, endpoint and string identifiers when
-// a device is part of a composite device. In this case, the only resource we
-// need which may be renumbered is the DFU runtime interface.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvDFUInstance, uint32_t ui32Request, void *pvRequestData)
-{
- tDFUInstance *psInst;
- uint8_t *pui8Data;
-
- //
- // Get a pointer to the DFU device instance data pointer
- //
- psInst = &((tUSBDDFUDevice *)pvDFUInstance)->sPrivateData;
-
- //
- // Get a byte pointer to the data.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- //
- // Which request event have we been passed?
- //
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- //
- // Save the change to the interface number.
- //
- psInst->ui8Interface = pui8Data[1];
- break;
- }
-
- //
- // We are not interested in any other event.
- //
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a request for a
-// non-standard descriptor is received.
-//
-// \param pvDFUInstance is the instance data for this request.
-// \param psUSBRequest points to the request received.
-//
-// This call parses the provided request structure and determines which
-// descriptor is being requested. Assuming the descriptor can be found, it is
-// scheduled for transmission via endpoint zero. If the descriptor cannot be
-// found, the endpoint is stalled to indicate an error to the host.
-//
-//*****************************************************************************
-static void
-HandleGetDescriptor(void *pvDFUInstance, tUSBRequest *psUSBRequest)
-{
- uint32_t ui32Size;
-
- ASSERT(pvDFUInstance != 0);
-
- //
- // Which type of class descriptor are we being asked for? We only support
- // 1 type - the DFU functional descriptor.
- //
- if(((psUSBRequest->wValue >> 8) == USB_DFU_FUNC_DESCRIPTOR_TYPE) &&
- ((psUSBRequest->wValue & 0xFF) == 0))
- {
- //
- // If there is more data to send than the host requested then just
- // send the requested amount of data.
- //
- if((uint16_t)g_pui8DFUFunctionalDesc[0] > psUSBRequest->wLength)
- {
- ui32Size = (uint32_t)psUSBRequest->wLength;
- }
- else
- {
- ui32Size = (uint32_t)g_pui8DFUFunctionalDesc[0];
- }
-
- //
- // Send the data via endpoint 0.
- //
- USBDCDSendDataEP0(0, g_pui8DFUFunctionalDesc, ui32Size);
- }
- else
- {
- //
- // This was an unknown or invalid request so stall.
- //
- USBDCDStallEP0(0);
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a non-standard
-// request is received.
-//
-// \param pvDFUInstance is the instance data for this HID device.
-// \param psUSBRequest points to the request received.
-//
-// This call parses the provided request structure. Assuming the request is
-// understood, it is handled and any required response generated. If the
-// request cannot be handled by this device class, endpoint zero is stalled to
-// indicate an error to the host.
-//
-//*****************************************************************************
-static void
-HandleRequest(void *pvDFUInstance, tUSBRequest *psUSBRequest)
-{
- tDFUInstance *psInst;
- tUSBDDFUDevice *psDevice;
-
- ASSERT(pvDFUInstance != 0);
-
- //
- // Get a pointer to the DFU device structure
- //
- psDevice = pvDFUInstance;
-
- //
- // Get a pointer to the DFU device instance data pointer
- //
- psInst = &psDevice->sPrivateData;
-
- //
- // Make sure the request was for this interface.
- //
- if(psUSBRequest->wIndex != psInst->ui8Interface)
- {
- return;
- }
-
- //
- // Determine the type of request.
- //
- switch(psUSBRequest->bRequest)
- {
- //
- // We have been asked to detach. In this case, we call back to the
- // application telling it to tidy up and re-enter the boot loader. We
- // rely upon it doing this on our behalf since this must be done from a
- // non-interrupt context and this call is most likely in interrupt
- // context.
- //
- case USBD_DFU_REQUEST_DETACH:
- {
- //
- // Tell the application it's time to reenter the boot loader.
- //
- psDevice->pfnCallback(psDevice->pvCBData, USBD_DFU_EVENT_DETACH,
- 0, (void *)0);
- break;
- }
-
- //
- // This request was not recognized so stall.
- //
- default:
- {
- USBDCDStallEP0(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-//! Initializes DFU device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for DFU runtime device operation.
-//! \param psDFUDevice points to a structure containing parameters customizing
-//! the operation of the DFU device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! The \e psCompEntry should point to the composite device entry to
-//! initialize. This is part of the array that is passed to the
-//! USBDCompositeInit() function.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB DFU APIs.
-//
-//*****************************************************************************
-void *
-USBDDFUCompositeInit(uint32_t ui32Index, tUSBDDFUDevice *psDFUDevice,
- tCompositeEntry *psCompEntry)
-{
- tDFUInstance *psInst;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psDFUDevice);
- ASSERT(psCompEntry != 0);
-
- //
- // Get a pointer to the DFU device instance data pointer
- //
- psInst = &psDFUDevice->sPrivateData;
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psDFUDevice;
- }
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sDFUHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8DFUDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors = g_ppsDFUConfigDescriptors;
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- psInst->ui32USBBase = USB0_BASE;
- psInst->bConnected = false;
- psInst->ui8Interface = 0;
-
- //
- // Initialize the device info structure for the DFU device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psDFUDevice);
-}
-
-//*****************************************************************************
-//
-//! Shuts down the DFU device.
-//!
-//! \param pvDFUInstance is the pointer to the device instance structure as
-//! returned by USBDDFUCompositeInit().
-//!
-//! This function terminates DFU operation for the instance supplied and
-//! removes the device from the USB bus.
-//!
-//! Following this call, the \e pvDFUInstance instance should not me used in
-//! any other calls.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDDFUCompositeTerm(void *pvDFUInstance)
-{
- tDFUInstance *psInst;
-
- ASSERT(pvDFUInstance);
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &((tUSBDDFUDevice *)pvDFUInstance)->sPrivateData;
-
- //
- // Terminate the requested instance.
- //
- USBDCDTerm(0);
-
- psInst->ui32USBBase = 0;
-}
-
-//*****************************************************************************
-//
-//! Removes the current USB device from the bus and transfers control to the
-//! DFU boot loader.
-//!
-//! This function should be called from the application's main loop (i.e. not
-//! in interrupt context) following a callback to the USB DFU callback function
-//! notifying the application of a DETACH request from the host. The function
-//! will prepare the system to switch to DFU mode and transfer control to the
-//! boot loader in preparation for a firmware upgrade from the host.
-//!
-//! The application must ensure that it has completed all necessary shutdown
-//! activities (saved any required data, etc.) before making this call since
-//! the function will not return.
-//!
-//! \return This function does not return.
-//
-//*****************************************************************************
-void
-USBDDFUUpdateBegin(void)
-{
- //
- // Terminate the USB device and take us off the bus.
- //
- USBDCDTerm(0);
-
- //
- // Disable all interrupts.
- //
- MAP_IntMasterDisable();
-
- //
- // We must make sure we turn off SysTick and its interrupt
- // before entering the boot loader!
- //
- MAP_SysTickIntDisable();
- MAP_SysTickDisable();
-
- //
- // Disable all processor interrupts. Instead of disabling them
- // one at a time, a direct write to NVIC is done to disable all
- // peripheral interrupts.
- //
- HWREG(NVIC_DIS0) = 0xffffffff;
- HWREG(NVIC_DIS1) = 0xffffffff;
-
- //
- // Reset the USB peripheral
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
- MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);
- MAP_SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0);
-
- //
- // Wait for about a second.
- //
- MAP_SysCtlDelay(MAP_SysCtlClockGet() / 3);
-
- //
- // Re-enable interrupts at the NVIC level.
- //
- MAP_IntMasterEnable();
-
- //
- // Return control to the boot loader. This is a call to the SVC
- // handler in the boot loader.
- //
- (*((void (*)(void))(*(uint32_t *)0x2c)))();
-
- //
- // Should never get here, but just in case.
- //
- while(1)
- {
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.h
deleted file mode 100644
index dc4051b55..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbddfu-rt.h
+++ /dev/null
@@ -1,184 +0,0 @@
-//*****************************************************************************
-//
-// usbddfu-rt.h - Definitions used by runtime DFU class devices.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDDFURT_H__
-#define __USBDDFURT_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup dfu_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8DFUInterface array in bytes.
-//
-//*****************************************************************************
-#define DFUINTERFACE_SIZE (9)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8DFUFunctionalDesc array in bytes.
-//
-//*****************************************************************************
-#define DFUFUNCTIONALDESC_SIZE (9)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the DFU runtime device. This does not
-//! include the configuration descriptor which is automatically ignored by the
-//! composite device class.
-//!
-//! This label is used to compute the value which will be passed to the
-//! USBDCompositeInit function in the ui32Size parameter.
-//
-//*****************************************************************************
-#define COMPOSITE_DDFU_SIZE (DFUINTERFACE_SIZE + DFUFUNCTIONALDESC_SIZE)
-
-//*****************************************************************************
-//
-//! This value is passed to the client via the callback function provided in
-//! the tUSBDDFUDevice structure and indicates that the host has sent a DETACH
-//! request to the DFU interface. This request indicates that the device detach
-//! from the USB bus and reattach in DFU mode in preparation for a firmware
-//! upgrade. Currently, this is the only event that the DFU runtime class
-//! reports to the client.
-//!
-//! When this event is received, the client should call USBDDFUUpdateBegin()
-//! from a non-interrupt context at its earliest opportunity.
-//
-//*****************************************************************************
-#define USBD_DFU_EVENT_DETACH (USBD_DFU_EVENT_BASE + 0)
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for
-// DFU devices. The memory for this structure is included in the
-// sPrivateData field in the tUSBDDFUDevice structure passed in the
-// USBDDFUCompositeInit() function.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // The DFU class interface number, this is modified in composite devices.
- //
- uint8_t ui8Interface;
-
- //
- // The connection status of the device.
- //
- bool bConnected;
-}
-tDFUInstance;
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the DFU device. Note that, unlike all other devices, this structure does
-//! not contain any fields which configure the device descriptor sent back to
-//! the host. The DFU runtime device class must be used as part of a composite
-//! device since all it provides is the capability to signal the device to
-//! switch into DFU mode in preparation for a firmware upgrade. Creating a
-//! device with nothing but DFU runtime mode capability is rather pointless
-//! so this is not supported.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of DETACH requests.
- //
- const tUSBCallback pfnCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the pfnCallback function.
- //
- void * const pvCBData;
-
- //
- //! The private instance data for this device class. This
- //! memory must remain accessible for as long as the DFU device is in use
- //! and must not be modified by any code outside the DFU class driver.
- //
- tDFUInstance sPrivateData;
-}
-tUSBDDFUDevice;
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDDFUCompositeInit(uint32_t ui32Index,
- tUSBDDFUDevice *psDFUDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDDFUCompositeTerm(void *pvDFUInstance);
-extern void USBDDFUUpdateBegin(void);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDDFURT_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdenum.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdenum.c
deleted file mode 100644
index 60ae29e6d..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdenum.c
+++ /dev/null
@@ -1,2900 +0,0 @@
-//*****************************************************************************
-//
-// usbenum.c - Enumeration code to handle all endpoint zero traffic.
-//
-// Copyright (c) 2007-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_ints.h"
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "inc/hw_sysctl.h"
-#include "driverlib/debug.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/rtos_bindings.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdevicepriv.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-// External prototypes.
-//
-//*****************************************************************************
-extern tUSBMode g_iUSBMode;
-
-//*****************************************************************************
-//
-// Local functions prototypes.
-//
-//*****************************************************************************
-static void USBDGetStatus(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDClearFeature(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDSetFeature(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDSetAddress(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDGetDescriptor(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDSetDescriptor(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDGetConfiguration(void *pvInstance,
- tUSBRequest *psUSBRequest);
-static void USBDSetConfiguration(void *pvInstance,
- tUSBRequest *psUSBRequest);
-static void USBDGetInterface(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDSetInterface(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDSyncFrame(void *pvInstance, tUSBRequest *psUSBRequest);
-static void USBDEP0StateTx(uint32_t ui32Index);
-static void USBDEP0StateTxConfig(uint32_t ui32Index);
-static int32_t USBDStringIndexFromRequest(uint16_t ui16Lang,
- uint16_t ui16Index);
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Indices into the ppui8Halt array to select the IN or OUT endpoint group.
-//
-//*****************************************************************************
-#define HALT_EP_IN 0
-#define HALT_EP_OUT 1
-
-//*****************************************************************************
-//
-// Define the max packet size for endpoint zero.
-//
-//*****************************************************************************
-#define EP0_MAX_PACKET_SIZE 64
-
-//*****************************************************************************
-//
-// This is a flag used with g_sUSBDeviceState.ui32DevAddress to indicate that a
-// device address change is pending.
-//
-//*****************************************************************************
-#define DEV_ADDR_PENDING 0x80000000
-
-//*****************************************************************************
-//
-// This label defines the default configuration number to use after a bus
-// reset. This may be overridden by calling USBDCDSetDefaultConfiguration()
-// during processing of the device reset handler if required.
-//
-//*****************************************************************************
-#define DEFAULT_CONFIG_ID 1
-
-//*****************************************************************************
-//
-// This label defines the number of milliseconds that the remote wake up signal
-// must remain asserted before removing it. Section 7.1.7.7 of the USB 2.0 spec
-// states that "the remote wake up device must hold the resume signaling for at
-// least 1ms but for no more than 15ms" so 10mS seems a reasonable choice.
-//
-//*****************************************************************************
-#define REMOTE_WAKEUP_PULSE_MS 10
-
-//*****************************************************************************
-//
-// This label defines the number of milliseconds between the point where we
-// assert the remote wake up signal and calling the client back to tell it that
-// bus operation has been resumed. This value is based on the timings provided
-// in section 7.1.7.7 of the USB 2.0 specification which indicates that the
-// host (which takes over resume signaling when the device's initial signal is
-// detected) must hold the resume signaling for at least 20mS.
-//
-//*****************************************************************************
-#define REMOTE_WAKEUP_READY_MS 20
-
-//*****************************************************************************
-//
-// The buffer for reading data coming into EP0
-//
-//*****************************************************************************
-static uint8_t g_pui8DataBufferIn[EP0_MAX_PACKET_SIZE];
-
-//*****************************************************************************
-//
-// This is the instance data for the USB controller itself and not a USB
-// device class.
-//
-//*****************************************************************************
-tDCDInstance g_psDCDInst[1];
-
-//*****************************************************************************
-//
-// This is the currently active class in use by USBLib. There is only one
-// of these per USB controller and no device has more than one controller.
-//
-//*****************************************************************************
-tDeviceInfo *g_ppsDevInfo[1];
-
-//*****************************************************************************
-//
-// Function table to handle standard requests.
-//
-//*****************************************************************************
-static const tStdRequest g_psUSBDStdRequests[] =
-{
- USBDGetStatus,
- USBDClearFeature,
- 0,
- USBDSetFeature,
- 0,
- USBDSetAddress,
- USBDGetDescriptor,
- USBDSetDescriptor,
- USBDGetConfiguration,
- USBDSetConfiguration,
- USBDGetInterface,
- USBDSetInterface,
- USBDSyncFrame
-};
-
-//*****************************************************************************
-//
-// Functions accessible by USBLIB clients.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Initialize an instance of the tDeviceInfo structure.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized.
-//! \param psDeviceInfo is a pointer to the tDeviceInfo structure that needs
-//! to be initialized. This function must be called by a USB device class
-//! instance to initialize the basic tDeviceInfo required for all USB device
-//! class modules. This is typically called in the initialization routine for
-//! USB device class. For example in usbdaudio.c that supports USB device
-//! audio classes, this function is called in the USBDAudioCompositeInit()
-//! function which is used for both composite and non-composites instances of
-//! the USB audio class.
-//!
-//! \note This function should not be called directly by applications.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDDeviceInfoInit(uint32_t ui32Index, tDeviceInfo *psDeviceInfo)
-{
- //
- // Check the arguments.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psDeviceInfo != 0);
-
- //
- // Save the USB interrupt number.
- //
- g_psDCDInst[0].ui32IntNum = INT_USB0_BLIZZARD;
-
- //
- // Initialize a couple of fields in the device state structure.
- //
- g_psDCDInst[0].ui32Configuration = DEFAULT_CONFIG_ID;
- g_psDCDInst[0].ui32DefaultConfiguration = DEFAULT_CONFIG_ID;
-
- g_psDCDInst[0].iEP0State = eUSBStateIdle;
-
- //
- // Default to the state where remote wake up is disabled.
- //
- g_psDCDInst[0].ui8Status = 0;
- g_psDCDInst[0].bRemoteWakeup = false;
-
- //
- // Determine the self- or bus-powered state based on the flags the
- // user provided.
- //
- g_psDCDInst[0].bPwrSrcSet = false;
-}
-
-//*****************************************************************************
-//
-//! Initialize the USB library device control driver for a given hardware
-//! controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized.
-//! \param psDevice is a pointer to a structure containing information that
-//! the USB library requires to support operation of this application's
-//! device. The structure contains event handler callbacks and pointers to the
-//! various standard descriptors that the device wishes to publish to the
-//! host.
-//! \param pvDCDCBData is the callback data for any device callbacks.
-//!
-//! This function must be called by a device class which wishes to operate
-//! as a USB device and is not typically called by an application. This
-//! function initializes the USB device control driver for the given
-//! controller and saves the device information for future use. Prior to
-//! returning from this function, the device is connected to the USB bus.
-//! Following return, the caller can expect to receive a callback to the
-//! supplied pfnResetHandler function when a host connects to the
-//! device. The \e pvDCDCBData contains a pointer to data that is returned
-//! with the DCD calls back to the function in the psDevice->psCallbacks()
-//! functions.
-//!
-//! The device information structure passed in \e psDevice must remain
-//! unchanged between this call and any matching call to USBDCDTerm() because
-//! it is not copied by the USB library.
-//!
-//! The USBStackModeSet() function can be called with eUSBModeForceDevice in
-//! order to cause the USB library to force the USB operating mode to a device
-//! controller. This allows the application to used the USBVBUS and USBID pins
-//! as GPIOs on devices that support forcing OTG to operate as a device only
-//! controller. By default the USB library will assume that the USBVBUS and
-//! USBID pins are configured as USB pins and not GPIOs.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDInit(uint32_t ui32Index, tDeviceInfo *psDevice, void *pvDCDCBData)
-{
- const tConfigHeader *psHdr;
- const tConfigDescriptor *psDesc;
-
- //
- // Check the arguments.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psDevice != 0);
-
- g_ppsDevInfo[0] = psDevice;
- g_psDCDInst[0].pvCBData = pvDCDCBData;
-
- //
- // Initialize the Device Info structure for a USB device instance.
- //
- USBDCDDeviceInfoInit(ui32Index, psDevice);
-
- //
- // Should not call this if the stack is in host mode.
- //
- ASSERT(g_iUSBMode != eUSBModeHost);
- ASSERT(g_iUSBMode != eUSBModeForceHost);
-
- //
- // Default to device mode if no mode was set.
- //
- if(g_iUSBMode == eUSBModeNone)
- {
- g_iUSBMode = eUSBModeDevice;
- }
-
- //
- // Only do hardware update if the stack is in not in OTG mode.
- //
- if(g_iUSBMode != eUSBModeOTG)
- {
- //
- // Reset the USB controller.
- //
- MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);
-
- //
- // Enable Clocking to the USB controller.
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
-
- //
- // Turn on USB Phy clock.
- //
- MAP_SysCtlUSBPLLEnable();
-
- //
- // Force device mode if requested.
- //
- if(g_iUSBMode == eUSBModeForceDevice)
- {
- MAP_USBDevMode(USB0_BASE);
- }
- else if(g_iUSBMode == eUSBModeDevice)
- {
- //
- // To run in active device mode the OTG signals must be active.
- // This allows disconnect to be detected by the controller.
- //
- MAP_USBOTGMode(USB0_BASE);
- }
-
- //
- // In all other cases, set the mode to device this function should not
- // be called in OTG mode.
- //
- g_iUSBMode = eUSBModeDevice;
- }
-
- //
- // Initialize the USB DMA interface.
- //
- g_psDCDInst[0].psDMAInstance = USBLibDMAInit(0);
-
- //
- // Initialize the USB tick module.
- //
- InternalUSBTickInit();
-
- //
- // Get a pointer to the default configuration descriptor.
- //
- psHdr = psDevice->ppsConfigDescriptors[
- g_psDCDInst[0].ui32DefaultConfiguration - 1];
- psDesc = (const tConfigDescriptor *)(psHdr->psSections[0]->pui8Data);
-
- if((psDesc->bmAttributes & USB_CONF_ATTR_PWR_M) == USB_CONF_ATTR_SELF_PWR)
- {
- g_psDCDInst[0].ui8Status |= USB_STATUS_SELF_PWR;
- }
- else
- {
- g_psDCDInst[0].ui8Status &= ~USB_STATUS_SELF_PWR;
- }
-
- //
- // Only do hardware update if the stack is not in OTG mode.
- //
- if(g_iUSBMode != eUSBModeOTG)
- {
- //
- // Get the current interrupt status.to clear all pending USB
- // interrupts.
- //
- MAP_USBIntStatusControl(USB0_BASE);
- MAP_USBIntStatusEndpoint(USB0_BASE);
-
- //
- // Enable USB Interrupts.
- //
- // OpenBLT - the bootloader polls for USB events instead of using interrupts.
- /* MAP_USBIntEnableControl(USB0_BASE, USB_INTCTRL_RESET |
- USB_INTCTRL_DISCONNECT |
- USB_INTCTRL_RESUME |
- USB_INTCTRL_SUSPEND |
- USB_INTCTRL_SOF);*/
- MAP_USBIntEnableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Attach the device using the soft connect.
- //
- MAP_USBDevConnect(USB0_BASE);
-
- //
- // Enable the USB interrupt.
- //
- // OpenBLT - the bootloader polls for USB events instead of using interrupts.
- /* OS_INT_ENABLE(g_psDCDInst[0].ui32IntNum); */
- }
-}
-
-//*****************************************************************************
-//
-//! Free the USB library device control driver for a given hardware controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! freed.
-//!
-//! This function should be called by an application if it no longer requires
-//! the use of a given USB controller to support its operation as a USB device.
-//! It frees the controller for use by another client.
-//!
-//! It is the caller's responsibility to remove its device from the USB bus
-//! prior to calling this function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDTerm(uint32_t ui32Index)
-{
- //
- // Check the arguments.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Disable the USB interrupts.
- //
- OS_INT_DISABLE(g_psDCDInst[0].ui32IntNum);
-
- //
- // Reset the tick handlers so that they can be reconfigured when and if
- // USBDCDInit() is called.
- //
- InternalUSBTickReset();
-
- //
- // No active device.
- //
- g_ppsDevInfo[0] = 0;
-
- MAP_USBIntDisableControl(USB0_BASE, USB_INTCTRL_ALL);
- MAP_USBIntDisableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Detach the device using the soft connect.
- //
- MAP_USBDevDisconnect(USB0_BASE);
-
- //
- // Clear any pending interrupts.
- //
- MAP_USBIntStatusControl(USB0_BASE);
- MAP_USBIntStatusEndpoint(USB0_BASE);
-
- //
- // Turn off USB Phy clock.
- //
- MAP_SysCtlUSBPLLDisable();
-
- //
- // Disable the USB peripheral
- //
- MAP_SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0);
-}
-
-//*****************************************************************************
-//
-//! This function starts the request for data from the host on endpoint zero.
-//!
-//! \param ui32Index is the index of the USB controller from which the data
-//! is being requested.
-//! \param pui8Data is a pointer to the buffer to fill with data from the USB
-//! host.
-//! \param ui32Size is the size of the buffer or data to return from the USB
-//! host.
-//!
-//! This function handles retrieving data from the host when a custom command
-//! has been issued on endpoint zero. If the application needs notification
-//! when the data has been received,
-//! psCallbacks->pfnDataReceived() in the tDeviceInfo structure
-//! must contain valid function pointer. In nearly all cases this is necessary
-//! because the caller of this function would likely need to know that the data
-//! requested was received.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDRequestDataEP0(uint32_t ui32Index, uint8_t *pui8Data, uint32_t ui32Size)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Enter the RX state on end point 0.
- //
- g_psDCDInst[0].iEP0State = eUSBStateRx;
-
- //
- // Save the pointer to the data.
- //
- g_psDCDInst[0].pui8EP0Data = pui8Data;
-
- //
- // Location to save the current number of bytes received.
- //
- g_psDCDInst[0].ui32OUTDataSize = ui32Size;
-
- //
- // Bytes remaining to be received.
- //
- g_psDCDInst[0].ui32EP0DataRemain = ui32Size;
-}
-
-//*****************************************************************************
-//
-//! This function requests transfer of data to the host on endpoint zero.
-//!
-//! \param ui32Index is the index of the USB controller which is to be used to
-//! send the data.
-//! \param pui8Data is a pointer to the buffer to send via endpoint zero.
-//! \param ui32Size is the amount of data to send in bytes.
-//!
-//! This function handles sending data to the host when a custom command is
-//! issued or non-standard descriptor has been requested on endpoint zero. If
-//! the application needs notification when this is complete,
-//! psCallbacks->pfnDataSent in the tDeviceInfo structure must
-//! contain a valid function pointer. This callback could be used to free up
-//! the buffer passed into this function in the \e pui8Data parameter. The
-//! contents of the \e pui8Data buffer must remain unchanged until the
-//! pfnDataSent callback is received.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDSendDataEP0(uint32_t ui32Index, uint8_t *pui8Data, uint32_t ui32Size)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Return the externally provided device descriptor.
- //
- g_psDCDInst[0].pui8EP0Data = pui8Data;
-
- //
- // The size of the device descriptor is in the first byte.
- //
- g_psDCDInst[0].ui32EP0DataRemain = ui32Size;
-
- //
- // Save the total size of the data sent.
- //
- g_psDCDInst[0].ui32OUTDataSize = ui32Size;
-
- //
- // Now in the transmit data state.
- //
- USBDEP0StateTx(0);
-}
-
-//*****************************************************************************
-//
-//! This function sets the default configuration for the device.
-//!
-//! \param ui32Index is the index of the USB controller whose default
-//! configuration is to be set.
-//! \param ui32DefaultConfig is the configuration identifier (byte 6 of the
-//! standard configuration descriptor) which is to be presented to the host
-//! as the default configuration in cases where the configuration descriptor is
-//! queried prior to any specific configuration being set.
-//!
-//! This function allows a device to override the default configuration
-//! descriptor that will be returned to a host whenever it is queried prior
-//! to a specific configuration having been set. The parameter passed must
-//! equal one of the configuration identifiers found in the
-//! ppsConfigDescriptors array for the device.
-//!
-//! If this function is not called, the USB library will return the first
-//! configuration in the ppsConfigDescriptors array as the default
-//! configuration.
-//!
-//! \note The USB device stack assumes that the configuration IDs (byte 6 of
-//! the configuration descriptor, bConfigurationValue) stored within
-//! the configuration descriptor array, ppsConfigDescriptors,
-//! are equal to the array index + 1. In other words, the first entry in the
-//! array must contain a descriptor with bConfigurationValue 1, the
-//! second must have bConfigurationValue 2 and so on.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDSetDefaultConfiguration(uint32_t ui32Index, uint32_t ui32DefaultConfig)
-{
- ASSERT(ui32Index == 0);
-
- g_psDCDInst[0].ui32DefaultConfiguration = ui32DefaultConfig;
-}
-
-//*****************************************************************************
-//
-//! This function generates a stall condition on endpoint zero.
-//!
-//! \param ui32Index is the index of the USB controller whose endpoint zero is
-//! to be stalled.
-//!
-//! This function is typically called to signal an error condition to the host
-//! when an unsupported request is received by the device. It should be
-//! called from within the callback itself (in interrupt context) and not
-//! deferred until later since it affects the operation of the endpoint zero
-//! state machine in the USB library.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDStallEP0(uint32_t ui32Index)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Stall the endpoint in question.
- //
- MAP_USBDevEndpointStall(USB0_BASE, USB_EP_0, USB_EP_DEV_OUT);
-
- //
- // Enter the stalled state.
- //
- g_psDCDInst[0].iEP0State = eUSBStateStall;
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus- or self-powered) to the library.
-//!
-//! \param ui32Index is the index of the USB controller whose device power
-//! status is being reported.
-//! \param ui8Power indicates the current power status, either
-//! \b USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus- or self-powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the library to allow correct responses to be provided when
-//! the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDCDPowerStatusSet(uint32_t ui32Index, uint8_t ui8Power)
-{
- //
- // Check for valid parameters.
- //
- ASSERT((ui8Power == USB_STATUS_BUS_PWR) ||
- (ui8Power == USB_STATUS_SELF_PWR));
- ASSERT(ui32Index == 0);
-
- //
- // Update the device status with the new power status flag.
- //
- g_psDCDInst[0].bPwrSrcSet = true;
- g_psDCDInst[0].ui8Status &= ~USB_STATUS_PWR_M;
- g_psDCDInst[0].ui8Status |= ui8Power;
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wake up to resume communication when in suspended state.
-//!
-//! \param ui32Index is the index of the USB controller that will request
-//! a bus wake up.
-//!
-//! When the bus is suspended, an application which supports remote wake up
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wake up signaling to the host. If the remote
-//! wake up feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wake up,
-//! \b false will be returned to indicate that the wake up request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wake up is not disabled and the
-//! signaling was started or \b false if remote wake up is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDCDRemoteWakeupRequest(uint32_t ui32Index)
-{
- //
- // Check for parameter validity.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Is remote wake up signaling currently enabled?
- //
- if(g_psDCDInst[0].ui8Status & USB_STATUS_REMOTE_WAKE)
- {
- //
- // The host has not disabled remote wake up. Are we still in the
- // middle of a previous wake up sequence?
- //
- if(!g_psDCDInst[0].bRemoteWakeup)
- {
- //
- // No - we are not in the middle of a wake up sequence so start
- // one here.
- //
- g_psDCDInst[0].ui8RemoteWakeupCount = 0;
- g_psDCDInst[0].bRemoteWakeup = true;
- MAP_USBHostResume(USB0_BASE, true);
- return(true);
- }
- }
-
- //
- // If we drop through to here, signaling was not initiated so return
- // false.
- return(false);
-}
-
-//*****************************************************************************
-//
-// Internal Functions, not to be called by applications
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This internal function is called on the SOF interrupt to process any
-// outstanding remote wake up requests.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USBDeviceResumeTickHandler(tDCDInstance *psDevInst)
-{
- if(g_psDCDInst[0].bRemoteWakeup)
- {
- //
- // Increment the millisecond counter we use to time the resume
- // signaling.
- //
- g_psDCDInst[0].ui8RemoteWakeupCount++;
-
- //
- // Have we reached the 10mS mark? If so, we need to turn the signaling
- // off again.
- //
- if(g_psDCDInst[0].ui8RemoteWakeupCount == REMOTE_WAKEUP_PULSE_MS)
- {
- MAP_USBHostResume(USB0_BASE, false);
- }
-
- //
- // Have we reached the point at which we can tell the client that the
- // bus has resumed? The controller does not give us an interrupt if we
- // initiated the wake up signaling so we just wait until 20mS have
- // passed then tell the client all is well.
- //
- if(g_psDCDInst[0].ui8RemoteWakeupCount == REMOTE_WAKEUP_READY_MS)
- {
- //
- // We are now finished with the remote wake up signaling.
- //
- g_psDCDInst[0].bRemoteWakeup = false;
-
- //
- // If the client has registered a resume callback, call it. In the
- // case of a remote wake up request, we do not get a resume
- // interrupt from the controller so we need to fake it here.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnResumeHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnResumeHandler(
- g_psDCDInst[0].pvCBData);
- }
- }
- }
-}
-
-//*****************************************************************************
-//
-// This internal function reads a request data packet and dispatches it to
-// either a standard request handler or the registered device request
-// callback depending upon the request type.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDReadAndDispatchRequest(uint32_t ui32Index)
-{
- uint32_t ui32Size;
- tUSBRequest *psRequest;
-
- //
- // Cast the buffer to a request structure.
- //
- psRequest = (tUSBRequest *)g_pui8DataBufferIn;
-
- //
- // Set the buffer size.
- //
- ui32Size = EP0_MAX_PACKET_SIZE;
-
- //
- // Get the data from the USB controller end point 0.
- //
- MAP_USBEndpointDataGet(USB0_BASE, USB_EP_0, g_pui8DataBufferIn,
- &ui32Size);
-
- //
- // If there was a null setup packet then just return.
- //
- if(!ui32Size)
- {
- return;
- }
-
- //
- // See if this is a standard request or not.
- //
- if((psRequest->bmRequestType & USB_RTYPE_TYPE_M) != USB_RTYPE_STANDARD)
- {
- //
- // Since this is not a standard request, see if there is
- // an external handler present.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnRequestHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnRequestHandler(
- g_psDCDInst[0].pvCBData,
- psRequest);
- }
- else
- {
- //
- // If there is no handler then stall this request.
- //
- USBDCDStallEP0(0);
- }
- }
- else
- {
- //
- // Assure that the jump table is not out of bounds.
- //
- if((psRequest->bRequest <
- (sizeof(g_psUSBDStdRequests) / sizeof(tStdRequest))) &&
- (g_psUSBDStdRequests[psRequest->bRequest] != 0))
- {
- //
- // Jump table to the appropriate handler.
- //
- g_psUSBDStdRequests[psRequest->bRequest](&g_psDCDInst[0],
- psRequest);
- }
- else
- {
- //
- // If there is no handler then stall this request.
- //
- USBDCDStallEP0(0);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This is interrupt handler for endpoint zero.
-//
-// This function handles all interrupts on endpoint zero in order to maintain
-// the state needed for the control endpoint on endpoint zero. In order to
-// successfully enumerate and handle all USB standard requests, all requests
-// on endpoint zero must pass through this function. The endpoint has the
-// following states: \b eUSBStateIdle, \b eUSBStateTx, \b eUSBStateRx,
-// \b eUSBStateStall, and \b eUSBStateStatus. In the \b eUSBStateIdle
-// state the USB controller has not received the start of a request, and once
-// it does receive the data for the request it will either enter the
-// \b eUSBStateTx, \b eUSBStateRx, or \b eUSBStateStall depending on the
-// command. If the controller enters the \b eUSBStateTx or \b eUSBStateRx
-// then once all data has been sent or received, it must pass through the
-// \b eUSBStateStatus state to allow the host to acknowledge completion of
-// the request. The \b eUSBStateStall is entered from \b eUSBStateIdle in
-// the event that the USB request was not valid. Both the \b eUSBStateStall
-// and \b eUSBStateStatus are transitional states that return to the
-// \b eUSBStateIdle state.
-//
-// \return None.
-//
-// eUSBStateIdle -*--> eUSBStateTx -*-> eUSBStateStatus -*->eUSBStateIdle
-// | | |
-// |--> eUSBStateRx |
-// | |
-// |--> eUSBStateStall ---------->--------
-//
-// ----------------------------------------------------------------
-// | Current State | State 0 | State 1 |
-// | --------------------|-------------------|----------------------
-// | eUSBStateIdle | eUSBStateTx/RX | eUSBStateStall |
-// | eUSBStateTx | eUSBStateStatus | |
-// | eUSBStateRx | eUSBStateStatus | |
-// | eUSBStateStatus | eUSBStateIdle | |
-// | eUSBStateStall | eUSBStateIdle | |
-// ----------------------------------------------------------------
-//
-//*****************************************************************************
-void
-USBDeviceEnumHandler(tDCDInstance *pDevInstance)
-{
- uint32_t ui32EPStatus, ui32DataSize;
-
- //
- // Get the end point 0 status.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, USB_EP_0);
-
- switch(pDevInstance->iEP0State)
- {
- //
- // Handle the status state, this is a transitory state from
- // eUSBStateTx or eUSBStateRx back to eUSBStateIdle.
- //
- case eUSBStateStatus:
- {
- //
- // Just go back to the idle state.
- //
- pDevInstance->iEP0State = eUSBStateIdle;
-
- //
- // If there is a pending address change then set the address.
- //
- if(pDevInstance->ui32DevAddress & DEV_ADDR_PENDING)
- {
- //
- // Clear the pending address change and set the address.
- //
- pDevInstance->ui32DevAddress &= ~DEV_ADDR_PENDING;
- MAP_USBDevAddrSet(USB0_BASE, pDevInstance->ui32DevAddress);
- }
-
- //
- // If a new packet is already pending, we need to read it
- // and handle whatever request it contains.
- //
- if(ui32EPStatus & USB_DEV_EP0_OUT_PKTRDY)
- {
- //
- // Process the newly arrived packet.
- //
- USBDReadAndDispatchRequest(0);
- }
- break;
- }
-
- //
- // In the IDLE state the code is waiting to receive data from the host.
- //
- case eUSBStateIdle:
- {
- //
- // Is there a packet waiting for us?
- //
- if(ui32EPStatus & USB_DEV_EP0_OUT_PKTRDY)
- {
- //
- // Yes - process it.
- //
- USBDReadAndDispatchRequest(0);
- }
- break;
- }
-
- //
- // Data is still being sent to the host so handle this in the
- // EP0StateTx() function.
- //
- case eUSBStateTx:
- {
- USBDEP0StateTx(0);
- break;
- }
-
- //
- // We are still in the middle of sending the configuration descriptor
- // so handle this in the EP0StateTxConfig() function.
- //
- case eUSBStateTxConfig:
- {
- USBDEP0StateTxConfig(0);
- break;
- }
-
- //
- // Handle the receive state for commands that are receiving data on
- // endpoint zero.
- //
- case eUSBStateRx:
- {
- //
- // Set the number of bytes to get out of this next packet.
- //
- if(pDevInstance->ui32EP0DataRemain > EP0_MAX_PACKET_SIZE)
- {
- //
- // Don't send more than EP0_MAX_PACKET_SIZE bytes.
- //
- ui32DataSize = EP0_MAX_PACKET_SIZE;
- }
- else
- {
- //
- // There was space so send the remaining bytes.
- //
- ui32DataSize = pDevInstance->ui32EP0DataRemain;
- }
-
- //
- // Get the data from the USB controller end point 0.
- //
- MAP_USBEndpointDataGet(USB0_BASE, USB_EP_0,
- pDevInstance->pui8EP0Data, &ui32DataSize);
-
- //
- // If there we not more that EP0_MAX_PACKET_SIZE or more bytes
- // remaining then this transfer is complete. If there were exactly
- // EP0_MAX_PACKET_SIZE remaining then there still needs to be
- // null packet sent before this is complete.
- //
- if(pDevInstance->ui32EP0DataRemain < EP0_MAX_PACKET_SIZE)
- {
- //
- // Need to ACK the data on end point 0 in this case and set the
- // data end as this is the last of the data.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Return to the idle state.
- //
- pDevInstance->iEP0State = eUSBStateStatus;
-
- //
- // If there is a receive callback then call it.
- //
- if((g_ppsDevInfo[0]->psCallbacks->pfnDataReceived) &&
- (pDevInstance->ui32OUTDataSize != 0))
- {
- //
- // Call the custom receive handler to handle the data
- // that was received.
- //
- g_ppsDevInfo[0]->psCallbacks->pfnDataReceived(
- g_psDCDInst[0].pvCBData,
- pDevInstance->ui32OUTDataSize);
-
- //
- // Indicate that there is no longer any data being waited
- // on.
- //
- pDevInstance->ui32OUTDataSize = 0;
- }
- }
- else
- {
- //
- // Need to ACK the data on end point 0 in this case
- // without setting data end because more data is coming.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
- }
-
- //
- // Advance the pointer.
- //
- pDevInstance->pui8EP0Data += ui32DataSize;
-
- //
- // Decrement the number of bytes that are being waited on.
- //
- pDevInstance->ui32EP0DataRemain -= ui32DataSize;
-
- break;
- }
- //
- // The device stalled endpoint zero so check if the stall needs to be
- // cleared once it has been successfully sent.
- //
- case eUSBStateStall:
- {
- //
- // If we sent a stall then acknowledge this interrupt.
- //
- if(ui32EPStatus & USB_DEV_EP0_SENT_STALL)
- {
- //
- // Clear the Setup End condition.
- //
- MAP_USBDevEndpointStatusClear(USB0_BASE, USB_EP_0,
- USB_DEV_EP0_SENT_STALL);
-
- //
- // Reset the global end point 0 state to IDLE.
- //
- pDevInstance->iEP0State = eUSBStateIdle;
-
- }
- break;
- }
- //
- // Halt on an unknown state, but only in DEBUG mode builds.
- //
- default:
- {
- ASSERT(0);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function handles bus reset notifications.
-//
-// This function is called from the low level USB interrupt handler whenever
-// a bus reset is detected. It performs tidy-up as required and resets the
-// configuration back to defaults in preparation for descriptor queries from
-// the host.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USBDeviceEnumResetHandler(tDCDInstance *pDevInstance)
-{
- uint32_t ui32Loop;
-
- //
- // Disable remote wake up signaling (as per USB 2.0 spec 9.1.1.6).
- //
- pDevInstance->ui8Status &= ~USB_STATUS_REMOTE_WAKE;
- pDevInstance->bRemoteWakeup = false;
-
- //
- // Call the device dependent code to indicate a bus reset has occurred.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnResetHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnResetHandler(g_psDCDInst[0].pvCBData);
- }
-
- //
- // Reset the default configuration identifier and alternate function
- // selections.
- //
- pDevInstance->ui32Configuration = pDevInstance->ui32DefaultConfiguration;
-
- for(ui32Loop = 0; ui32Loop < USB_MAX_INTERFACES_PER_DEVICE; ui32Loop++)
- {
- pDevInstance->pui8AltSetting[ui32Loop] = (uint8_t)0;
- }
-}
-
-//*****************************************************************************
-//
-// This function handles the GET_STATUS standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the request type and endpoint number if endpoint
-// status is requested.
-//
-// This function handles responses to a Get Status request from the host
-// controller. A status request can be for the device, an interface or an
-// endpoint. If any other type of request is made this function will cause
-// a stall condition to indicate that the command is not supported. The
-// \e psUSBRequest structure holds the type of the request in the
-// bmRequestType field. If the type indicates that this is a request for an
-// endpoint's status, then the wIndex field holds the endpoint number.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDGetStatus(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- uint16_t ui16Data, ui16Index;
- uint32_t ui32Dir;
- tDCDInstance *psUSBControl;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 without setting last data as there
- // will be a data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // Determine what type of status was requested.
- //
- switch(psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M)
- {
- //
- // This was a Device Status request.
- //
- case USB_RTYPE_DEVICE:
- {
- //
- // Return the current status for the device.
- //
- ui16Data = (uint16_t)psUSBControl->ui8Status;
-
- break;
- }
-
- //
- // This was a Interface status request.
- //
- case USB_RTYPE_INTERFACE:
- {
- //
- // Interface status always returns 0.
- //
- ui16Data = (uint16_t)0;
-
- break;
- }
-
- //
- // This was an endpoint status request.
- //
- case USB_RTYPE_ENDPOINT:
- {
- //
- // Which endpoint are we dealing with?
- //
- ui16Index = psUSBRequest->wIndex & USB_REQ_EP_NUM_M;
-
- //
- // Check if this was a valid endpoint request.
- //
- if((ui16Index == 0) || (ui16Index >= NUM_USB_EP))
- {
- USBDCDStallEP0(0);
- return;
- }
- else
- {
- //
- // Are we dealing with an IN or OUT endpoint?
- //
- ui32Dir = ((psUSBRequest->wIndex & USB_REQ_EP_DIR_M) ==
- USB_REQ_EP_DIR_IN) ? HALT_EP_IN : HALT_EP_OUT;
-
- //
- // Get the current halt status for this endpoint.
- //
- ui16Data =
- (uint16_t)psUSBControl->ppui8Halt[ui32Dir][ui16Index - 1];
- }
- break;
- }
-
- //
- // This was an unknown request.
- //
- default:
- {
- //
- // Anything else causes a stall condition to indicate that the
- // command was not supported.
- //
- USBDCDStallEP0(0);
- return;
- }
- }
-
- //
- // Send the two byte status response.
- //
- psUSBControl->ui32EP0DataRemain = 2;
- psUSBControl->pui8EP0Data = (uint8_t *)&ui16Data;
-
- //
- // Send the response.
- //
- USBDEP0StateTx(0);
-}
-
-//*****************************************************************************
-//
-// This function handles the CLEAR_FEATURE standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the options for the Clear Feature USB request.
-//
-// This function handles device or endpoint clear feature requests. The
-// \e psUSBRequest structure holds the type of the request in the bmRequestType
-// field and the feature is held in the wValue field. The device can only
-// clear the Remote Wake feature. This device request should only be made if
-// the descriptor indicates that Remote Wake is implemented by the device.
-// Endpoints can only clear a halt on a given endpoint. If any other
-// requests are made, then the device will stall the request to indicate to
-// the host that the command was not supported.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDClearFeature(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- tDCDInstance *psUSBControl;
- uint32_t ui32Dir;
- uint16_t ui16Index;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Determine what type of status was requested.
- //
- switch(psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M)
- {
- //
- // This is a clear feature request at the device level.
- //
- case USB_RTYPE_DEVICE:
- {
- //
- // Only remote wake is can be cleared by this function.
- //
- if(USB_FEATURE_REMOTE_WAKE & psUSBRequest->wValue)
- {
- //
- // Clear the remote wake up state.
- //
- psUSBControl->ui8Status &= ~USB_STATUS_REMOTE_WAKE;
- }
- else
- {
- USBDCDStallEP0(0);
- }
- break;
- }
-
- //
- // This is a clear feature request at the endpoint level.
- //
- case USB_RTYPE_ENDPOINT:
- {
- //
- // Which endpoint are we dealing with?
- //
- ui16Index = psUSBRequest->wIndex & USB_REQ_EP_NUM_M;
-
- //
- // Not a valid endpoint.
- //
- if((ui16Index == 0) || (ui16Index > NUM_USB_EP))
- {
- USBDCDStallEP0(0);
- }
- else
- {
- //
- // Only the halt feature is supported.
- //
- if(USB_FEATURE_EP_HALT == psUSBRequest->wValue)
- {
- //
- // Are we dealing with an IN or OUT endpoint?
- //
- ui32Dir = ((psUSBRequest->wIndex & USB_REQ_EP_DIR_M) ==
- USB_REQ_EP_DIR_IN) ? HALT_EP_IN : HALT_EP_OUT;
-
- //
- // Clear the halt condition on this endpoint.
- //
- psUSBControl->ppui8Halt[ui32Dir][ui16Index - 1] = 0;
-
- if(ui32Dir == HALT_EP_IN)
- {
- MAP_USBDevEndpointStallClear(USB0_BASE,
- IndexToUSBEP(ui16Index),
- USB_EP_DEV_IN);
- }
- else
- {
- MAP_USBDevEndpointStallClear(USB0_BASE,
- IndexToUSBEP(ui16Index),
- USB_EP_DEV_OUT);
- }
- }
- else
- {
- //
- // If any other feature is requested, this is an error.
- //
- USBDCDStallEP0(0);
- return;
- }
- }
- break;
- }
-
- //
- // This is an unknown request.
- //
- default:
- {
- USBDCDStallEP0(0);
- return;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function handles the SET_FEATURE standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the feature in the wValue field of the USB
-// request.
-//
-// This function handles device or endpoint set feature requests. The
-// \e psUSBRequest structure holds the type of the request in the bmRequestType
-// field and the feature is held in the wValue field. The device can only
-// set the Remote Wake feature. This device request should only be made if the
-// descriptor indicates that Remote Wake is implemented by the device.
-// Endpoint requests can only issue a halt on a given endpoint. If any other
-// requests are made, then the device will stall the request to indicate to the
-// host that the command was not supported.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSetFeature(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- tDCDInstance *psUSBControl;
- uint16_t ui16Index;
- uint32_t ui32Dir;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Determine what type of status was requested.
- //
- switch(psUSBRequest->bmRequestType & USB_RTYPE_RECIPIENT_M)
- {
- //
- // This is a set feature request at the device level.
- //
- case USB_RTYPE_DEVICE:
- {
- //
- // Only remote wake is the only feature that can be set by this
- // function.
- //
- if(USB_FEATURE_REMOTE_WAKE & psUSBRequest->wValue)
- {
- //
- // Set the remote wake up state.
- //
- psUSBControl->ui8Status |= USB_STATUS_REMOTE_WAKE;
- }
- else
- {
- USBDCDStallEP0(0);
- }
- break;
- }
-
- //
- // This is a set feature request at the endpoint level.
- //
- case USB_RTYPE_ENDPOINT:
- {
- //
- // Which endpoint are we dealing with?
- //
- ui16Index = psUSBRequest->wIndex & USB_REQ_EP_NUM_M;
-
- //
- // Not a valid endpoint?
- //
- if((ui16Index == 0) || (ui16Index >= NUM_USB_EP))
- {
- USBDCDStallEP0(0);
- }
- else
- {
- //
- // Only the Halt feature can be set.
- //
- if(USB_FEATURE_EP_HALT == psUSBRequest->wValue)
- {
- //
- // Are we dealing with an IN or OUT endpoint?
- //
- ui32Dir = ((psUSBRequest->wIndex & USB_REQ_EP_DIR_M) ==
- USB_REQ_EP_DIR_IN) ? HALT_EP_IN : HALT_EP_OUT;
-
- //
- // Clear the halt condition on this endpoint.
- //
- psUSBControl->ppui8Halt[ui32Dir][ui16Index - 1] = 1;
- }
- else
- {
- //
- // No other requests are supported.
- //
- USBDCDStallEP0(0);
- return;
- }
- }
- break;
- }
-
- //
- // This is an unknown request.
- //
- default:
- {
- USBDCDStallEP0(0);
- return;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function handles the SET_ADDRESS standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the new address to use in the wValue field of the
-// USB request.
-//
-// This function is called to handle the change of address request from the
-// host controller. This can only start the sequence as the host must
-// acknowledge that the device has changed address. Thus this function sets
-// the address change as pending until the status phase of the request has
-// been completed successfully. This prevents the devices address from
-// changing and not properly responding to the status phase.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSetAddress(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- tDCDInstance *psUSBControl;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Save the device address as we cannot change address until the status
- // phase is complete.
- //
- psUSBControl->ui32DevAddress = psUSBRequest->wValue | DEV_ADDR_PENDING;
-
- //
- // Transition directly to the status state since there is no data phase
- // for this request.
- //
- psUSBControl->iEP0State = eUSBStateStatus;
-}
-
-//*****************************************************************************
-//
-// This function handles the GET_DESCRIPTOR standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function will return most of the descriptors requested by the host
-// controller. The descriptor specified by \e
-// pvInstance->psInfo->pui8DeviceDescriptor will be returned when the device
-// descriptor is requested. If a request for a specific configuration
-// descriptor is made, then the appropriate descriptor from the \e
-// g_pConfigDescriptors will be returned. When a request for a string
-// descriptor is made, the appropriate string from the
-// \e pvInstance->psInfo->pStringDescriptors will be returned. If the
-// \e pvInstance->psInfo->psCallbacks->GetDescriptor is specified it will be
-// called to handle the request. In this case it must call the
-// USBDCDSendDataEP0() function to send the data to the host controller. If
-// the callback is not specified, and the descriptor request is not for a
-// device, configuration, or string descriptor then this function will stall
-// the request to indicate that the request was not supported by the device.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDGetDescriptor(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- bool bConfig;
- tDCDInstance *psUSBControl;
- tDeviceInfo *psDevice;
- const tConfigHeader *psConfig;
- const tDeviceDescriptor *psDeviceDesc;
- uint8_t ui8Index;
- int32_t i32Index;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
- psDevice = g_ppsDevInfo[0];
-
- //
- // Need to ACK the data on end point 0 without setting last data as there
- // will be a data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // Assume we are not sending the configuration descriptor until we
- // determine otherwise.
- //
- bConfig = false;
-
- //
- // Which descriptor are we being asked for?
- //
- switch(psUSBRequest->wValue >> 8)
- {
- //
- // This request was for a device descriptor.
- //
- case USB_DTYPE_DEVICE:
- {
- //
- // Return the externally provided device descriptor.
- //
- psUSBControl->pui8EP0Data =
- (uint8_t *)psDevice->pui8DeviceDescriptor;
-
- //
- // The size of the device descriptor is in the first byte.
- //
- psUSBControl->ui32EP0DataRemain =
- psDevice->pui8DeviceDescriptor[0];
-
- break;
- }
-
- //
- // This request was for a configuration descriptor.
- //
- case USB_DTYPE_CONFIGURATION:
- {
- //
- // Which configuration are we being asked for?
- //
- ui8Index = (uint8_t)(psUSBRequest->wValue & 0xFF);
-
- //
- // Is this valid?
- //
- psDeviceDesc =
- (const tDeviceDescriptor *)psDevice->pui8DeviceDescriptor;
-
- if(ui8Index >= psDeviceDesc->bNumConfigurations)
- {
- //
- // This is an invalid configuration index. Stall EP0 to
- // indicate a request error.
- //
- USBDCDStallEP0(0);
- psUSBControl->pui8EP0Data = 0;
- psUSBControl->ui32EP0DataRemain = 0;
- }
- else
- {
- //
- // Return the externally specified configuration descriptor.
- //
- psConfig = psDevice->ppsConfigDescriptors[ui8Index];
-
- //
- // Start by sending data from the beginning of the first
- // descriptor.
- //
- psUSBControl->ui8ConfigSection = 0;
- psUSBControl->ui8SectionOffset = 0;
- psUSBControl->pui8EP0Data =
- (uint8_t *)psConfig->psSections[0]->pui8Data;
-
- //
- // Determine the total size of the configuration descriptor
- // by counting the sizes of the sections comprising it.
- //
- psUSBControl->ui32EP0DataRemain =
- USBDCDConfigDescGetSize(psConfig);
-
- //
- // Remember that we need to send the configuration descriptor
- // and which descriptor we need to send.
- //
- psUSBControl->ui8ConfigIndex = ui8Index;
-
- bConfig = true;
- }
- break;
- }
-
- //
- // This request was for a string descriptor.
- //
- case USB_DTYPE_STRING:
- {
- //
- // Determine the correct descriptor index based on the requested
- // language ID and index.
- //
- i32Index = USBDStringIndexFromRequest(psUSBRequest->wIndex,
- psUSBRequest->wValue & 0xFF);
-
- //
- // If the mapping function returned -1 then stall the request to
- // indicate that the request was not valid.
- //
- if(i32Index == -1)
- {
- USBDCDStallEP0(0);
- break;
- }
-
- //
- // Return the externally specified configuration descriptor.
- //
- psUSBControl->pui8EP0Data =
- (uint8_t *)psDevice->ppui8StringDescriptors[i32Index];
-
- //
- // The total size of a string descriptor is in byte 0.
- //
- psUSBControl->ui32EP0DataRemain =
- psDevice->ppui8StringDescriptors[i32Index][0];
-
- break;
- }
-
- //
- // Any other request is not handled by the default enumeration handler
- // so see if it needs to be passed on to another handler.
- //
- default:
- {
- //
- // If there is a handler for requests that are not handled then
- // call it.
- //
- if(psDevice->psCallbacks->pfnGetDescriptor)
- {
- psDevice->psCallbacks->pfnGetDescriptor(g_psDCDInst[0].pvCBData,
- psUSBRequest);
- }
- else
- {
- //
- // Whatever this was this handler does not understand it so
- // just stall the request.
- //
- USBDCDStallEP0(0);
- }
-
- return;
- }
- }
-
- //
- // If this request has data to send, then send it.
- //
- if(psUSBControl->pui8EP0Data)
- {
- //
- // If there is more data to send than is requested then just
- // send the requested amount of data.
- //
- if(psUSBControl->ui32EP0DataRemain > psUSBRequest->wLength)
- {
- psUSBControl->ui32EP0DataRemain = psUSBRequest->wLength;
- }
-
- //
- // Now in the transmit data state. Be careful to call the correct
- // function since we need to handle the configuration descriptor
- // differently from the others.
- //
- if(!bConfig)
- {
- USBDEP0StateTx(0);
- }
- else
- {
- USBDEP0StateTxConfig(0);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function determines which string descriptor to send to satisfy a
-// request for a given index and language.
-//
-// \param ui16Lang is the requested string language ID.
-// \param ui16Index is the requested string descriptor index.
-//
-// When a string descriptor is requested, the host provides a language ID and
-// index to identify the string ("give me string number 5 in French"). This
-// function maps these two parameters to an index within our device's string
-// descriptor array which is arranged as multiple groups of strings with
-// one group for each language advertised via string descriptor 0.
-//
-// We assume that there are an equal number of strings per language and
-// that the first descriptor is the language descriptor and use this fact to
-// perform the mapping.
-//
-// \return The index of the string descriptor to return or -1 if the string
-// could not be found.
-//
-//*****************************************************************************
-static int32_t
-USBDStringIndexFromRequest(uint16_t ui16Lang, uint16_t ui16Index)
-{
- tString0Descriptor *pLang;
- uint32_t ui32NumLangs, ui32NumStringi16PerLang, ui32Loop;
-
- //
- // Make sure we have a string table at all.
- //
- if((g_ppsDevInfo[0] == 0) ||
- (g_ppsDevInfo[0]->ppui8StringDescriptors == 0))
- {
- return(-1);
- }
-
- //
- // First look for the trivial case where descriptor 0 is being
- // requested. This is the special case since descriptor 0 contains the
- // language codes supported by the device.
- //
- if(ui16Index == 0)
- {
- return(0);
- }
-
- //
- // How many languages does this device support? This is determined by
- // looking at the length of the first descriptor in the string table,
- // subtracting 2 for the header and dividing by two (the size of each
- // language code).
- //
- ui32NumLangs =
- (g_ppsDevInfo[0]->ppui8StringDescriptors[0][0] - 2) / 2;
-
- //
- // We assume that the table includes the same number of strings for each
- // supported language. We know the number of entries in the string table,
- // so how many are there for each language? This may seem an odd way to
- // do this (why not just have the application tell us in the device info
- // structure?) but it's needed since we didn't want to change the API
- // after the first release which did not support multiple languages.
- //
- ui32NumStringi16PerLang =
- ((g_ppsDevInfo[0]->ui32NumStringDescriptors - 1) /ui32NumLangs);
-
- //
- // Just to be sure, make sure that the calculation indicates an equal
- // number of strings per language. We expect the string table to contain
- // (1 + (strings_per_language * languages)) entries.
- //
- if((1 + (ui32NumStringi16PerLang * ui32NumLangs)) !=
- g_ppsDevInfo[0]->ui32NumStringDescriptors)
- {
- return(-1);
- }
-
- //
- // Now determine which language we are looking for. It is assumed that
- // the order of the groups of strings per language in the table is the
- // same as the order of the language IDs listed in the first descriptor.
- //
- pLang = (tString0Descriptor *)
- (g_ppsDevInfo[0]->ppui8StringDescriptors[0]);
-
- //
- // Look through the supported languages looking for the one we were asked
- // for.
- //
- for(ui32Loop = 0; ui32Loop < ui32NumLangs; ui32Loop++)
- {
- //
- // Have we found the requested language?
- //
- if(pLang->wLANGID[ui32Loop] == ui16Lang)
- {
- //
- // Yes - calculate the index of the descriptor to send.
- //
- return((ui32NumStringi16PerLang * ui32Loop) + ui16Index);
- }
- }
-
- //
- // If we drop out of the loop, the requested language was not found so
- // return -1 to indicate the error.
- //
- return(-1);
-}
-
-//*****************************************************************************
-//
-// This function handles the SET_DESCRIPTOR standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function currently is not supported and will respond with a Stall
-// to indicate that this command is not supported by the device.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSetDescriptor(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- //
- // Need to ACK the data on end point 0 without setting last data as there
- // will be a data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // This function is not handled by default.
- //
- USBDCDStallEP0(0);
-}
-
-//*****************************************************************************
-//
-// This function handles the GET_CONFIGURATION standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function responds to a host request to return the current
-// configuration of the USB device. The function will send the configuration
-// response to the host and return. This value will either be 0 or the last
-// value received from a call to SetConfiguration().
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDGetConfiguration(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- uint8_t ui8Value;
- tDCDInstance *psUSBControl;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 without setting last data as there
- // will be a data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // If we still have an address pending then the device is still not
- // configured.
- //
- if(psUSBControl->ui32DevAddress & DEV_ADDR_PENDING)
- {
- ui8Value = 0;
- }
- else
- {
- ui8Value = (uint8_t)psUSBControl->ui32Configuration;
- }
-
- psUSBControl->ui32EP0DataRemain = 1;
- psUSBControl->pui8EP0Data = &ui8Value;
-
- //
- // Send the single byte response.
- //
- USBDEP0StateTx(0);
-}
-
-//*****************************************************************************
-//
-// This function handles the SET_CONFIGURATION standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function responds to a host request to change the current
-// configuration of the USB device. The actual configuration number is taken
-// from the structure passed in via \e psUSBRequest. This number should be one
-// of the configurations that was specified in the descriptors. If the
-// \e ConfigChange callback is specified in \e pvInstance->psInfo->psCallbacks->
-// it will be called so that the application can respond to a change in
-// configuration.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSetConfiguration(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- tDCDInstance *psUSBControl;
- tDeviceInfo *psDevice;
- const tConfigHeader *psHdr;
- const tConfigDescriptor *psDesc;
-
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
- psDevice = g_ppsDevInfo[0];
-
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Cannot set the configuration to one that does not exist so check the
- // enumeration structure to see how many valid configurations are present.
- //
- if(psUSBRequest->wValue > psDevice->pui8DeviceDescriptor[17])
- {
- //
- // The passed configuration number is not valid. Stall the endpoint to
- // signal the error to the host.
- //
- USBDCDStallEP0(0);
- }
- else
- {
- //
- // Save the configuration.
- //
- psUSBControl->ui32Configuration = psUSBRequest->wValue;
-
- //
- // If passed a configuration other than 0 (which tells us that we are
- // not currently configured), configure the endpoints (other than EP0)
- // appropriately.
- //
- if(psUSBControl->ui32Configuration)
- {
- //
- // Get a pointer to the configuration descriptor. This will always
- // be the first section in the current configuration.
- //
- psHdr = psDevice->ppsConfigDescriptors[psUSBRequest->wValue - 1];
- psDesc =
- (const tConfigDescriptor *)(psHdr->psSections[0]->pui8Data);
-
- //
- // Remember the new self- or bus-powered state if the user has not
- // already called us to tell us the state to report.
- //
- if(!psUSBControl->bPwrSrcSet)
- {
- if((psDesc->bmAttributes & USB_CONF_ATTR_PWR_M) ==
- USB_CONF_ATTR_SELF_PWR)
- {
- psUSBControl->ui8Status |= USB_STATUS_SELF_PWR;
- }
- else
- {
- psUSBControl->ui8Status &= ~USB_STATUS_SELF_PWR;
- }
- }
-
- //
- // Configure endpoints for the new configuration.
- //
- USBDeviceConfig(psUSBControl,
- psDevice->ppsConfigDescriptors[psUSBRequest->wValue - 1]);
- }
-
- //
- // If there is a configuration change callback then call it.
- //
- if(psDevice->psCallbacks->pfnConfigChange)
- {
- psDevice->psCallbacks->pfnConfigChange(g_psDCDInst[0].pvCBData,
- psUSBControl->ui32Configuration);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function handles the GET_INTERFACE standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function is called when the host controller request the current
-// interface that is in use by the device. This simply returns the value set
-// by the last call to SetInterface().
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDGetInterface(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- uint8_t ui8Value;
- tDCDInstance *psUSBControl;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
-
- //
- // Need to ACK the data on end point 0 without setting last data as there
- // will be a data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, false);
-
- //
- // If we still have an address pending then the device is still not
- // configured.
- //
- if(psUSBControl->ui32DevAddress & DEV_ADDR_PENDING)
- {
- ui8Value = (uint8_t)0;
- }
- else
- {
- //
- // Is the interface number valid?
- //
- if(psUSBRequest->wIndex < USB_MAX_INTERFACES_PER_DEVICE)
- {
- //
- // Read the current alternate setting for the required interface.
- //
- ui8Value = psUSBControl->pui8AltSetting[psUSBRequest->wIndex];
- }
- else
- {
- //
- // An invalid interface number was specified.
- //
- USBDCDStallEP0(0);
- return;
- }
- }
-
- //
- // Send the single byte response.
- //
- psUSBControl->ui32EP0DataRemain = 1;
- psUSBControl->pui8EP0Data = &ui8Value;
-
- //
- // Send the single byte response.
- //
- USBDEP0StateTx(0);
-}
-
-//*****************************************************************************
-//
-// This function handles the SET_INTERFACE standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This function is called when a standard request for changing the interface
-// is received from the host controller. If this is a valid request the
-// function will call the function specified by the InterfaceChange in the
-// \e pvInstance->psInfo->psCallbacks->variable to notify the application that
-// the interface has changed and will pass it the new alternate interface
-// number.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSetInterface(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- const tConfigHeader *psConfig;
- tInterfaceDescriptor *psInterface;
- uint32_t ui32Loop, ui32Section, ui32NumInterfaces;
- uint8_t ui8Interface;
- bool bRetcode;
- tDCDInstance *psUSBControl;
- tDeviceInfo *psDevice;
-
- ASSERT(psUSBRequest != 0);
- ASSERT(pvInstance != 0);
-
- //
- // Create the device information pointer.
- //
- psUSBControl = (tDCDInstance *)pvInstance;
- psDevice = g_ppsDevInfo[0];
-
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Use the current configuration.
- //
- psConfig =
- psDevice->ppsConfigDescriptors[psUSBControl->ui32Configuration - 1];
-
- //
- // How many interfaces are included in the descriptor?
- //
- ui32NumInterfaces = USBDCDConfigDescGetNum(psConfig, USB_DTYPE_INTERFACE);
-
- //
- // Find the interface descriptor for the supplied interface and alternate
- // setting numbers.
- //
- for(ui32Loop = 0; ui32Loop < ui32NumInterfaces; ui32Loop++)
- {
- //
- // Get the next interface descriptor in the configuration descriptor.
- //
- psInterface = USBDCDConfigGetInterface(psConfig, ui32Loop,
- USB_DESC_ANY, &ui32Section);
-
- //
- // Is this the required interface with the correct alternate setting?
- //
- if(psInterface &&
- (psInterface->bInterfaceNumber == psUSBRequest->wIndex) &&
- (psInterface->bAlternateSetting == psUSBRequest->wValue))
- {
- ui8Interface = psInterface->bInterfaceNumber;
-
- //
- // Make sure we don't write outside the bounds of the
- // pui8AltSetting array (in a debug build, anyway, since this
- // indicates an error in the device descriptor).
- //
- ASSERT(ui8Interface < USB_MAX_INTERFACES_PER_DEVICE);
-
- //
- // This is the correct interface descriptor so save the
- // setting.
- //
- psUSBControl->pui8AltSetting[ui8Interface] =
- psInterface->bAlternateSetting;
-
- //
- // Reconfigure the endpoints to match the requirements of the
- // new alternate setting for the interface.
- //
- bRetcode = USBDeviceConfigAlternate(psUSBControl, psConfig,
- ui8Interface,
- psInterface->bAlternateSetting);
-
- //
- // If there is a callback then notify the application of the
- // change to the alternate interface.
- //
- if(bRetcode && psDevice->psCallbacks->pfnInterfaceChange)
- {
- psDevice->psCallbacks->pfnInterfaceChange(
- g_psDCDInst[0].pvCBData,
- psUSBRequest->wIndex,
- psUSBRequest->wValue);
- }
-
- //
- // All done.
- //
- return;
- }
- }
-
- //
- // If we drop out of the loop, we didn't find an interface descriptor
- // matching the requested number and alternate setting or there was an
- // error while trying to set up for the new alternate setting.
- //
- USBDCDStallEP0(0);
-}
-
-//*****************************************************************************
-//
-// This function handles the SYNC_FRAME standard USB request.
-//
-// \param pvInstance is the USB device controller instance data.
-// \param psUSBRequest holds the data for this request.
-//
-// This is currently a stub function that will stall indicating that the
-// command is not supported.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDSyncFrame(void *pvInstance, tUSBRequest *psUSBRequest)
-{
- //
- // Need to ACK the data on end point 0 with last data set as this has no
- // data phase.
- //
- MAP_USBDevEndpointDataAck(USB0_BASE, USB_EP_0, true);
-
- //
- // Not handled yet so stall this request.
- //
- USBDCDStallEP0(0);
-}
-
-//*****************************************************************************
-//
-// This internal function handles sending data on endpoint zero.
-//
-// \param ui32Index is the index of the USB controller which is to be
-// initialized.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDEP0StateTx(uint32_t ui32Index)
-{
- uint32_t ui32NumBytes;
- uint8_t *pui8Data;
-
- ASSERT(ui32Index == 0);
-
- //
- // In the TX state on endpoint zero.
- //
- g_psDCDInst[0].iEP0State = eUSBStateTx;
-
- //
- // Set the number of bytes to send this iteration.
- //
- ui32NumBytes = g_psDCDInst[0].ui32EP0DataRemain;
-
- //
- // Limit individual transfers to 64 bytes.
- //
- if(ui32NumBytes > EP0_MAX_PACKET_SIZE)
- {
- ui32NumBytes = EP0_MAX_PACKET_SIZE;
- }
-
- //
- // Save the pointer so that it can be passed to the USBEndpointDataPut()
- // function.
- //
- pui8Data = (uint8_t *)g_psDCDInst[0].pui8EP0Data;
-
- //
- // Advance the data pointer and counter to the next data to be sent.
- //
- g_psDCDInst[0].ui32EP0DataRemain -= ui32NumBytes;
- g_psDCDInst[0].pui8EP0Data += ui32NumBytes;
-
- //
- // Put the data in the correct FIFO.
- //
- MAP_USBEndpointDataPut(USB0_BASE, USB_EP_0, pui8Data, ui32NumBytes);
-
- //
- // If this is exactly 64 then don't set the last packet yet.
- //
- if(ui32NumBytes == EP0_MAX_PACKET_SIZE)
- {
- //
- // There is more data to send or exactly 64 bytes were sent, this
- // means that there is either more data coming or a null packet needs
- // to be sent to complete the transaction.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_IN);
- }
- else
- {
- //
- // Now go to the status state and wait for the transmit to complete.
- //
- g_psDCDInst[0].iEP0State = eUSBStateStatus;
-
- //
- // Send the last bit of data.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_IN_LAST);
-
- //
- // If there is a sent callback then call it.
- //
- if((g_ppsDevInfo[0]->psCallbacks->pfnDataSent) &&
- (g_psDCDInst[0].ui32OUTDataSize != 0))
- {
- //
- // Call the custom handler.
- //
- g_ppsDevInfo[0]->psCallbacks->pfnDataSent(
- g_psDCDInst[0].pvCBData,
- g_psDCDInst[0].ui32OUTDataSize);
-
- //
- // There is no longer any data pending to be sent.
- //
- g_psDCDInst[0].ui32OUTDataSize = 0;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This internal function handles sending the configuration descriptor on
-// endpoint zero.
-//
-// \param ui32Index is the index of the USB controller.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBDEP0StateTxConfig(uint32_t ui32Index)
-{
- uint32_t ui32NumBytes, ui32SecBytes, ui32ToSend;
- uint8_t *pui8Data;
- tConfigDescriptor sConfDesc;
- const tConfigHeader *psConfig;
- const tConfigSection *psSection;
-
- ASSERT(ui32Index == 0);
-
- //
- // In the TX state on endpoint zero.
- //
- g_psDCDInst[0].iEP0State = eUSBStateTxConfig;
-
- //
- // Find the current configuration descriptor definition.
- //
- psConfig = g_ppsDevInfo[0]->ppsConfigDescriptors[
- g_psDCDInst[0].ui8ConfigIndex];
-
- //
- // Set the number of bytes to send this iteration.
- //
- ui32NumBytes = g_psDCDInst[0].ui32EP0DataRemain;
-
- //
- // Limit individual transfers to 64 bytes.
- //
- if(ui32NumBytes > EP0_MAX_PACKET_SIZE)
- {
- ui32NumBytes = EP0_MAX_PACKET_SIZE;
- }
-
- //
- // If this is the first call, we need to fix up the total length of the
- // configuration descriptor. This has already been determined and set in
- // g_sUSBDeviceState.ui32EP0DataRemain.
- //
- if((g_psDCDInst[0].ui8SectionOffset == 0) &&
- (g_psDCDInst[0].ui8ConfigSection == 0))
- {
- //
- // Copy the USB configuration descriptor from the beginning of the
- // first section of the current configuration.
- //
- sConfDesc = *(tConfigDescriptor *)g_psDCDInst[0].pui8EP0Data;
-
- //
- // Update the total size.
- //
- sConfDesc.wTotalLength = (uint16_t)USBDCDConfigDescGetSize(psConfig);
-
- //
- // Write the descriptor to the USB FIFO.
- //
- ui32ToSend = (ui32NumBytes < sizeof(tConfigDescriptor)) ? ui32NumBytes:
- sizeof(tConfigDescriptor);
- MAP_USBEndpointDataPut(USB0_BASE, USB_EP_0, (uint8_t *)&sConfDesc,
- ui32ToSend);
-
- //
- // Did we reach the end of the first section?
- //
- if(psConfig->psSections[0]->ui16Size == ui32ToSend)
- {
- //
- // Update our tracking indices to point to the start of the next
- // section.
- //
- g_psDCDInst[0].ui8SectionOffset = 0;
- g_psDCDInst[0].ui8ConfigSection = 1;
- }
- else
- {
- //
- // Note that we have sent the first few bytes of the descriptor.
- //
- g_psDCDInst[0].ui8SectionOffset = (uint8_t)ui32ToSend;
- }
-
- //
- // How many bytes do we have remaining to send on this iteration?
- //
- ui32ToSend = ui32NumBytes - ui32ToSend;
- }
- else
- {
- //
- // Set the number of bytes we still have to send on this call.
- //
- ui32ToSend = ui32NumBytes;
- }
-
- //
- // Add the relevant number of bytes to the USB FIFO
- //
- while(ui32ToSend)
- {
- //
- // Get a pointer to the current configuration section.
- //
- psSection = psConfig->psSections[g_psDCDInst[0].ui8ConfigSection];
-
- //
- // Calculate bytes are available in the current configuration section.
- //
- ui32SecBytes = (uint32_t)(psSection->ui16Size -
- g_psDCDInst[0].ui8SectionOffset);
-
- //
- // Save the pointer so that it can be passed to the
- // USBEndpointDataPut() function.
- //
- pui8Data = (uint8_t *)psSection->pui8Data +
- g_psDCDInst[0].ui8SectionOffset;
-
- //
- // Are there more bytes in this section that we still have to send?
- //
- if(ui32SecBytes > ui32ToSend)
- {
- //
- // Yes - send only the remaining bytes in the transfer.
- //
- ui32SecBytes = ui32ToSend;
- }
-
- //
- // Put the data in the correct FIFO.
- //
- MAP_USBEndpointDataPut(USB0_BASE, USB_EP_0, pui8Data, ui32SecBytes);
-
- //
- // Fix up our pointers for the next iteration.
- //
- ui32ToSend -= ui32SecBytes;
- g_psDCDInst[0].ui8SectionOffset += (uint8_t)ui32SecBytes;
-
- //
- // Have we reached the end of a section?
- //
- if(g_psDCDInst[0].ui8SectionOffset == psSection->ui16Size)
- {
- //
- // Yes - move to the next one.
- //
- g_psDCDInst[0].ui8ConfigSection++;
- g_psDCDInst[0].ui8SectionOffset = 0;
- }
- }
-
- //
- // Fix up the number of bytes remaining to be sent and the start pointer.
- //
- g_psDCDInst[0].ui32EP0DataRemain -= ui32NumBytes;
-
- //
- // If we ran out of bytes in the configuration section, bail and just
- // send out what we have.
- //
- if(psConfig->ui8NumSections <= g_psDCDInst[0].ui8ConfigSection)
- {
- g_psDCDInst[0].ui32EP0DataRemain = 0;
- }
-
- //
- // If there is no more data don't keep looking or ui8ConfigSection might
- // overrun the available space.
- //
- if(g_psDCDInst[0].ui32EP0DataRemain != 0)
- {
- pui8Data =(uint8_t *)
- psConfig->psSections[g_psDCDInst[0].ui8ConfigSection]->pui8Data;
- ui32ToSend = g_psDCDInst[0].ui8SectionOffset;
- g_psDCDInst[0].pui8EP0Data = (pui8Data + ui32ToSend);
- }
-
- //
- // If this is exactly 64 then don't set the last packet yet.
- //
- if(ui32NumBytes == EP0_MAX_PACKET_SIZE)
- {
- //
- // There is more data to send or exactly 64 bytes were sent, this
- // means that there is either more data coming or a null packet needs
- // to be sent to complete the transaction.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_IN);
- }
- else
- {
- //
- // Send the last bit of data.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_IN_LAST);
-
- //
- // If there is a sent callback then call it.
- //
- if((g_ppsDevInfo[0]->psCallbacks->pfnDataSent) &&
- (g_psDCDInst[0].ui32OUTDataSize != 0))
- {
- //
- // Call the custom handler.
- //
- g_ppsDevInfo[0]->psCallbacks->pfnDataSent(g_psDCDInst[0].pvCBData,
- g_psDCDInst[0].ui32OUTDataSize);
-
- //
- // There is no longer any data pending to be sent.
- //
- g_psDCDInst[0].ui32OUTDataSize = 0;
- }
-
- //
- // Now go to the status state and wait for the transmit to complete.
- //
- g_psDCDInst[0].iEP0State = eUSBStateStatus;
- }
-}
-
-//*****************************************************************************
-//
-// The internal USB device interrupt handler.
-//
-// \param ui32Index is the USB controller associated with this interrupt.
-// \param ui32Status is the current interrupt status as read via a call to
-// USBIntStatusControl().
-//
-// This function is called from either \e USB0DualModeIntHandler() or
-// \e USB0DeviceIntHandler() to process USB interrupts when in device mode.
-// This handler will branch the interrupt off to the appropriate application or
-// stack handlers depending on the current status of the USB controller.
-//
-// The two-tiered structure for the interrupt handler ensures that it is
-// possible to use the same handler code in both device and OTG modes and
-// means that host code can be excluded from applications that only require
-// support for USB device mode operation.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USBDeviceIntHandlerInternal(uint32_t ui32Index, uint32_t ui32Status)
-{
- static uint32_t ui32SOFDivide = 0;
- void *pvInstance;
- uint32_t ui32DMAIntStatus;
-
- //
- // If device initialization has not been performed then just disconnect
- // from the USB bus and return from the handler.
- //
- if(g_ppsDevInfo[0] == 0)
- {
- MAP_USBDevDisconnect(USB0_BASE);
- return;
- }
-
- pvInstance = g_psDCDInst[0].pvCBData;
-
- //
- // Received a reset from the host.
- //
- if(ui32Status & USB_INTCTRL_RESET)
- {
- USBDeviceEnumResetHandler(&g_psDCDInst[0]);
- }
-
- //
- // Suspend was signaled on the bus.
- //
- if(ui32Status & USB_INTCTRL_SUSPEND)
- {
- //
- // Call the SuspendHandler() if it was specified.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnSuspendHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnSuspendHandler(pvInstance);
- }
- }
-
- //
- // Resume was signaled on the bus.
- //
- if(ui32Status & USB_INTCTRL_RESUME)
- {
- //
- // Call the ResumeHandler() if it was specified.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnResumeHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnResumeHandler(pvInstance);
- }
- }
-
- //
- // USB device was disconnected.
- //
- if(ui32Status & USB_INTCTRL_DISCONNECT)
- {
- //
- // Call the DisconnectHandler() if it was specified.
- //
- if(g_ppsDevInfo[0]->psCallbacks->pfnDisconnectHandler)
- {
- g_ppsDevInfo[0]->psCallbacks->pfnDisconnectHandler(pvInstance);
- }
- }
-
- //
- // Start of Frame was received.
- //
- if(ui32Status & USB_INTCTRL_SOF)
- {
- //
- // Increment the global Start of Frame counter.
- //
- g_ui32USBSOFCount++;
-
- //
- // Increment our SOF divider.
- //
- ui32SOFDivide++;
-
- //
- // Handle resume signaling if required.
- //
- USBDeviceResumeTickHandler(&g_psDCDInst[0]);
-
- //
- // Have we counted enough SOFs to allow us to call the tick function?
- //
- if(ui32SOFDivide == USB_SOF_TICK_DIVIDE)
- {
- //
- // Yes - reset the divider and call the SOF tick handler.
- //
- ui32SOFDivide = 0;
- InternalUSBStartOfFrameTick(USB_SOF_TICK_DIVIDE);
- }
- }
-
- //
- // Get the controller interrupt status.
- //
- ui32Status = MAP_USBIntStatusEndpoint(USB0_BASE);
-
- //
- // Handle end point 0 interrupts.
- //
- if(ui32Status & USB_INTEP_0)
- {
- USBDeviceEnumHandler(&g_psDCDInst[0]);
- ui32Status &= ~USB_INTEP_0;
- }
-
- //
- // Check to see if any DMA transfers are pending
- //
- ui32DMAIntStatus = USBLibDMAIntStatus(g_psDCDInst[0].psDMAInstance);
-
- if(ui32DMAIntStatus)
- {
- //
- // Handle any DMA interrupt processing.
- //
- USBLibDMAIntHandler(g_psDCDInst[0].psDMAInstance, ui32DMAIntStatus);
- }
-
- //
- // Because there is no way to detect if a uDMA interrupt has occurred,
- // check for an endpoint callback and call it if it is available.
- //
- if((g_ppsDevInfo[0]->psCallbacks->pfnEndpointHandler) &&
- ((ui32Status != 0) || (ui32DMAIntStatus != 0)))
- {
- g_ppsDevInfo[0]->psCallbacks->pfnEndpointHandler(pvInstance, ui32Status);
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevice.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevice.h
deleted file mode 100644
index 341f34b26..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevice.h
+++ /dev/null
@@ -1,206 +0,0 @@
-//*****************************************************************************
-//
-// usbdevice.h - types and definitions used during USB enumeration.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDEVICE_H__
-#define __USBDEVICE_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! The maximum number of independent interfaces that any single device
-//! implementation can support. Independent interfaces means interface
-//! descriptors with different bInterfaceNumber values - several interface
-//! descriptors offering different alternative settings but the same interface
-//! number count as a single interface.
-//
-//*****************************************************************************
-#define USB_MAX_INTERFACES_PER_DEVICE 8
-
-#include "usbdevicepriv.h"
-
-//*****************************************************************************
-//
-//! This structure is passed to the USB library on a call to USBDCDInit and
-//! provides the library with information about the device that the
-//! application is implementing. It contains functions pointers for the
-//! various USB event handlers and pointers to each of the standard device
-//! descriptors.
-//
-//*****************************************************************************
-struct tDeviceInfo
-{
- //
- //! A pointer to a structure containing pointers to event handler functions
- //! provided by the client to support the operation of this device.
- //
- const tCustomHandlers * psCallbacks;
-
- //
- //! A pointer to the device descriptor for this device.
- //
- const uint8_t *pui8DeviceDescriptor;
-
- //
- //! A pointer to an array of configuration descriptor pointers. Each entry
- //! in the array corresponds to one configuration that the device may be
- //! set to use by the USB host. The number of entries in the array must
- //! match the bNumConfigurations value in the device descriptor
- //! array, pui8DeviceDescriptor.
- //
- const tConfigHeader * const *ppsConfigDescriptors;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must be arranged as follows:
- //!
- //! - [0] - Standard descriptor containing supported language codes.
- //! - [1] - String 1 for the first language listed in descriptor 0.
- //! - [2] - String 2 for the first language listed in descriptor 0.
- //! - ...
- //! - [n] - String n for the first language listed in descriptor 0.
- //! - [n+1] - String 1 for the second language listed in descriptor 0.
- //! - ...
- //! - [2n] - String n for the second language listed in descriptor 0.
- //! - [2n+1]- String 1 for the third language listed in descriptor 0.
- //! - ...
- //! - [3n] - String n for the third language listed in descriptor 0.
- //!
- //! and so on.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The total number of descriptors provided in the ppStringDescriptors
- //! array.
- //
- uint32_t ui32NumStringDescriptors;
-};
-
-//*****************************************************************************
-//
-//! This type is used by an application to describe and instance of a device
-//! and an instance data pointer for that class. The psDevice pointer should
-//! be a pointer to a valid device class to include in the composite device.
-//! The pvInstance pointer should be a pointer to an instance pointer for the
-//! device in the psDevice pointer.
-//!
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! This is the top level device information structure.
- //
- const tDeviceInfo *psDevInfo;
-
- //
- //! This is the instance data for the device structure.
- //
- void *pvInstance;
-
- //
- //! A per-device workspace used by the composite device.
- //
- uint32_t ui32DeviceWorkspace;
-}
-tCompositeEntry;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Public APIs offered by the USB library device control driver.
-//
-//*****************************************************************************
-extern void USBDCDInit(uint32_t ui32Index, tDeviceInfo *psDevice,
- void *pvDCDCBData);
-extern void USBDCDTerm(uint32_t ui32Index);
-extern void USBDCDStallEP0(uint32_t ui32Index);
-extern void USBDCDRequestDataEP0(uint32_t ui32Index, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern void USBDCDSendDataEP0(uint32_t ui32Index, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern void USBDCDSetDefaultConfiguration(uint32_t ui32Index,
- uint32_t ui32DefaultConfig);
-extern uint32_t USBDCDConfigDescGetSize(const tConfigHeader *psConfig);
-extern uint32_t USBDCDConfigDescGetNum(const tConfigHeader *psConfig,
- uint32_t ui32Type);
-extern tDescriptorHeader *USBDCDConfigDescGet(const tConfigHeader *psConfig,
- uint32_t ui32Type,
- uint32_t ui32Index,
- uint32_t *pui32Section);
-extern uint32_t
- USBDCDConfigGetNumAlternateInterfaces(const tConfigHeader *psConfig,
- uint8_t ui8InterfaceNumber);
-extern tInterfaceDescriptor *
- USBDCDConfigGetInterface(const tConfigHeader *psConfig,
- uint32_t ui32Index, uint32_t ui32AltCfg,
- uint32_t *pui32Section);
-extern tEndpointDescriptor *
- USBDCDConfigGetInterfaceEndpoint(const tConfigHeader *psConfig,
- uint32_t ui32InterfaceNumber,
- uint32_t ui32AltCfg,
- uint32_t ui32Index);
-extern void USBDCDPowerStatusSet(uint32_t ui32Index, uint8_t ui8Power);
-extern bool USBDCDRemoteWakeupRequest(uint32_t ui32Index);
-
-//*****************************************************************************
-//
-// Device mode interrupt handler for controller index 0.
-//
-//*****************************************************************************
-extern void USB0DeviceIntHandler(void);
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBENUM_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevicepriv.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevicepriv.h
deleted file mode 100644
index 74b059996..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdevicepriv.h
+++ /dev/null
@@ -1,238 +0,0 @@
-//*****************************************************************************
-//
-// usbdevicepriv.h - Private header file used to share internal variables and
-// function prototypes between the various device-related
-// modules in the USB library. This header MUST NOT be
-// used by application code.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDEVICEPRIV_H__
-#define __USBDEVICEPRIV_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-// The states for endpoint zero during enumeration.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // The USB device is waiting on a request from the host controller on
- // endpoint zero.
- //
- eUSBStateIdle,
-
- //
- // The USB device is sending data back to the host due to an IN request.
- //
- eUSBStateTx,
-
- //
- // The USB device is sending the configuration descriptor back to the host
- // due to an IN request.
- //
- eUSBStateTxConfig,
-
- //
- // The USB device is receiving data from the host due to an OUT
- // request from the host.
- //
- eUSBStateRx,
-
- //
- // The USB device has completed the IN or OUT request and is now waiting
- // for the host to acknowledge the end of the IN/OUT transaction. This
- // is the status phase for a USB control transaction.
- //
- eUSBStateStatus,
-
- //
- // This endpoint has signaled a stall condition and is waiting for the
- // stall to be acknowledged by the host controller.
- //
- eUSBStateStall
-}
-tEP0State;
-
-typedef struct tDeviceInfo tDeviceInfo;
-
-//*****************************************************************************
-//
-// The USB controller device information.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The current state of endpoint zero.
- //
- volatile tEP0State iEP0State;
-
- //
- // The devices current address, this also has a change pending bit in the
- // MSB of this value specified by DEV_ADDR_PENDING.
- //
- volatile uint32_t ui32DevAddress;
-
- //
- // This holds the current active configuration for this device.
- //
- uint32_t ui32Configuration;
-
- //
- // This holds the configuration id that will take effect after a reset.
- //
- uint32_t ui32DefaultConfiguration;
-
- //
- // This holds the current alternate interface for this device.
- //
- uint8_t pui8AltSetting[USB_MAX_INTERFACES_PER_DEVICE];
-
- //
- // This is the pointer to the current data being sent out or received
- // on endpoint zero.
- //
- uint8_t *pui8EP0Data;
-
- //
- // This is the number of bytes that remain to be sent from or received
- // into the g_sUSBDeviceState.pui8EP0Data data buffer.
- //
- volatile uint32_t ui32EP0DataRemain;
-
- //
- // The amount of data being sent/received due to a custom request.
- //
- uint32_t ui32OUTDataSize;
-
- //
- // Holds the current device status.
- //
- uint8_t ui8Status;
-
- //
- // Holds the endpoint status for the HALT condition. This array is sized
- // to hold halt status for all IN and OUT endpoints.
- //
- uint8_t ppui8Halt[2][USBLIB_NUM_EP - 1];
-
- //
- // Holds the configuration descriptor section number currently being sent
- // to the host.
- //
- uint8_t ui8ConfigSection;
-
- //
- // Holds the offset within the configuration descriptor section currently
- // being sent to the host.
- //
- uint8_t ui8SectionOffset;
-
- //
- // Holds the index of the configuration that we are currently sending back
- // to the host.
- //
- uint8_t ui8ConfigIndex;
-
- //
- // This flag is set to true if the client has called USBDPowerStatusSet()
- // and tells the USB library not to try to determine the current power
- // status from the configuration descriptor.
- //
- bool bPwrSrcSet;
-
- //
- // This flag indicates whether or not remote wake up signaling is in
- // progress.
- //
- bool bRemoteWakeup;
-
- //
- // During remote wake up signaling, this counter is used to track the
- // number of milliseconds since the signaling was initiated.
- //
- uint8_t ui8RemoteWakeupCount;
-
- //
- // The DMA instance information for this USB controller.
- //
- tUSBDMAInstance *psDMAInstance;
-
- //
- // The interrupt number for this instance.
- //
- uint32_t ui32IntNum;
-
- //
- // Pointer to the device supplied call back data.
- //
- void *pvCBData;
-}
-tDCDInstance;
-
-extern tDCDInstance g_psDCDInst[];
-extern tDeviceInfo *g_ppsDevInfo[];
-
-//*****************************************************************************
-//
-// Device enumeration functions provided by device/usbenum.c and called from
-// the interrupt handler in device/usbhandler.c
-//
-//*****************************************************************************
-extern bool USBDeviceConfig(tDCDInstance *psDevInst,
- const tConfigHeader *psConfig);
-extern bool USBDeviceConfigAlternate(tDCDInstance *psDevInst,
- const tConfigHeader *psConfig,
- uint8_t ui8InterfaceNum,
- uint8_t ui8AlternateSetting);
-
-extern void USBDCDDeviceInfoInit(uint32_t ui32Index, tDeviceInfo *psDevice);
-
-//*****************************************************************************
-//
-// Macro access function to device information.
-//
-//*****************************************************************************
-#define DCDGetDMAInstance(psDevInfo) (&(psDevInfo->psDCDInst->sDMAInstance))
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDEVICEPRIV_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhandler.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhandler.c
deleted file mode 100644
index e3ce14c47..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhandler.c
+++ /dev/null
@@ -1,85 +0,0 @@
-//*****************************************************************************
-//
-// usbhandler.c - General USB handling routines.
-//
-// Copyright (c) 2007-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdevicepriv.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! The USB device interrupt handler.
-//!
-//! This the main USB interrupt handler entry point for use in USB device
-//! applications. This top-level handler will branch the interrupt off to the
-//! appropriate application or stack handlers depending on the current status
-//! of the USB controller.
-//!
-//! Applications which operate purely as USB devices (rather than dual mode
-//! applications which can operate in either device or host mode at different
-//! times) must ensure that a pointer to this function is installed in the
-//! interrupt vector table entry for the USB0 interrupt. For dual mode
-//! operation, the vector should be set to point to \e USB0DualModeIntHandler()
-//! instead.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USB0DeviceIntHandler(void)
-{
- uint32_t ui32Status;
-
- //
- // Get the controller interrupt status.
- //
- ui32Status = MAP_USBIntStatusControl(USB0_BASE);
-
- //
- // Call the internal handler.
- //
- USBDeviceIntHandlerInternal(0, ui32Status);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.c
deleted file mode 100644
index 7af519d9c..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.c
+++ /dev/null
@@ -1,2461 +0,0 @@
-//*****************************************************************************
-//
-// usbdhid.c - USB HID device class driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbhid.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdhid.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup hid_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// The subset of endpoint status flags that we consider to be reception
-// errors. These are passed to the client via USB_EVENT_ERROR if seen.
-//
-//*****************************************************************************
-#define USB_RX_ERROR_FLAGS (USBERR_DEV_RX_DATA_ERROR | \
- USBERR_DEV_RX_OVERRUN | \
- USBERR_DEV_RX_FIFO_FULL)
-
-//*****************************************************************************
-//
-// Marker used to indicate that a given HID descriptor cannot be found in the
-// client-supplied list.
-//
-//*****************************************************************************
-#define HID_NOT_FOUND 0xFFFFFFFF
-
-//*****************************************************************************
-//
-// Flags that may appear in ui16DeferredOpFlags to indicate some operation that
-// has been requested but could not be processed at the time it was received.
-// Each deferred operation is defined as the bit number that should be set in
-// tHIDInstance->ui16DeferredOpFlags to indicate that the operation is pending.
-//
-//*****************************************************************************
-#define HID_DO_PACKET_RX 5
-#define HID_DO_SEND_IDLE_REPORT 6
-
-//*****************************************************************************
-//
-// Endpoints to use for each of the required endpoints in the driver.
-//
-//*****************************************************************************
-#define INT_IN_ENDPOINT USB_EP_3
-#define INT_OUT_ENDPOINT USB_EP_3
-
-//*****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8HIDDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- USB_CLASS_DEVICE, // USB Device Class
- 0, // USB Device Sub-class
- USB_HID_PROTOCOL_NONE, // USB Device protocol
- USBDHID_MAX_PACKET, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (VID).
- USBShort(0), // Product ID (PID).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// Forward references for device handler callbacks
-//
-//*****************************************************************************
-static void HandleGetDescriptor(void *pvHIDInstance, tUSBRequest *psUSBRequest);
-static void HandleRequest(void *pvHIDInstance, tUSBRequest *psUSBRequest);
-static void HandleConfigChange(void *pvHIDInstance, uint32_t ui32Info);
-static void HandleEP0DataReceived(void *pvHIDInstance, uint32_t ui32Info);
-static void HandleEP0DataSent(void *pvHIDInstance, uint32_t ui32Info);
-static void HandleReset(void *pvHIDInstance);
-static void HandleSuspend(void *pvHIDInstance);
-static void HandleResume(void *pvHIDInstance);
-static void HandleDisconnect(void *pvHIDInstance);
-static void HandleEndpoints(void *pvHIDInstance, uint32_t ui32Status);
-static void HandleDevice(void *pvHIDInstance, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// The device information structure for the USB HID devices.
-//
-//*****************************************************************************
-const tCustomHandlers g_sHIDHandlers =
-{
- //
- // GetDescriptor
- //
- HandleGetDescriptor,
-
- //
- // RequestHandler
- //
- HandleRequest,
-
- //
- // InterfaceChange
- //
- 0,
-
- //
- // ConfigChange
- //
- HandleConfigChange,
-
- //
- // DataReceived
- //
- HandleEP0DataReceived,
-
- //
- // DataSentCallback
- //
- HandleEP0DataSent,
-
- //
- // ResetHandler
- //
- HandleReset,
-
- //
- // SuspendHandler
- //
- HandleSuspend,
-
- //
- // ResumeHandler
- //
- HandleResume,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // Device handler.
- //
- HandleDevice
-};
-
-//*****************************************************************************
-//
-// Set or clear deferred operation flags in an "atomic" manner.
-//
-// \param pui16DeferredOp points to the flags variable which is to be modified.
-// \param ui16Bit indicates which bit number is to be set or cleared.
-// \param bSet indicates the state that the flag must be set to. If \b true,
-// the flag is set, if \b false, the flag is cleared.
-//
-// This function safely sets or clears a bit in a flag variable. The operation
-// makes use of bitbanding to ensure that the operation is atomic (no read-
-// modify-write is required).
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-SetDeferredOpFlag(volatile uint16_t *pui16DeferredOp, uint16_t ui16Bit,
- bool bSet)
-{
- //
- // Set the flag bit to 1 or 0 using a bitband access.
- //
- HWREGBITH(pui16DeferredOp, ui16Bit) = bSet ? 1 : 0;
-}
-
-//*****************************************************************************
-//
-// This function is called to clear the counter used to keep track of the time
-// elapsed since a given report was last sent.
-//
-// \param psHIDDevice points to the HID device structure whose report timer is
-// to be cleared.
-// \param ui8ReportID is the first byte of the report to be sent. If this
-// device offers more than one input report, this value is used to find the
-// relevant report timer structure in the psHIDDevice structure.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-ClearReportTimer(const tUSBDHIDDevice *psHIDDevice, uint8_t ui8ReportID)
-{
- uint32_t ui32Loop;
-
- if(psHIDDevice->ui8NumInputReports > 1)
- {
- //
- // We have more than 1 input report so the report must begin with a
- // byte containing the report ID. Scan the table we were provided
- // when the device was initialized to find the entry for this report.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->ui8NumInputReports;
- ui32Loop++)
- {
- if(psHIDDevice->psReportIdle[ui32Loop].ui8ReportID == ui8ReportID)
- {
- break;
- }
- }
- }
- else
- {
- ui32Loop = 0;
- }
-
- //
- // If we drop out of the loop with an index less than ui8NumInputReports,
- // we found the relevant report so clear its timer.
- //
- if(ui32Loop < psHIDDevice->ui8NumInputReports)
- {
- psHIDDevice->psReportIdle[ui32Loop].ui32TimeSinceReportmS = 0;
- }
-}
-
-//*****************************************************************************
-//
-// This function is called to clear the idle period timers for each input
-// report supported by the device.
-//
-// \param psHIDDevice points to the HID device structure whose timers are to be
-// cleared.
-// \param ui32TimemS is the elapsed time in milliseconds since the last call
-// to this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-ClearIdleTimers(const tUSBDHIDDevice *psHIDDevice)
-{
- uint32_t ui32Loop;
-
- //
- // Clear the "time till next report" counters for each input report.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->ui8NumInputReports; ui32Loop++)
- {
- psHIDDevice->psReportIdle[ui32Loop].ui16TimeTillNextmS =
- psHIDDevice->psReportIdle[ui32Loop].ui8Duration4mS * 4;
- }
-}
-
-//*****************************************************************************
-//
-// This function is called periodically to allow us to process the report idle
-// timers.
-//
-// \param psHIDDevice points to the HID device structure whose timers are to be
-// updated.
-// \param ui32ElapsedmS indicates the number of milliseconds that have elapsed
-// since the last call to this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-ProcessIdleTimers(const tUSBDHIDDevice *psHIDDevice, uint32_t ui32ElapsedmS)
-{
- uint32_t ui32Loop, ui32SizeReport;
- void *pvReport;
- tHIDInstance *psInst;
- bool bDeferred;
-
- //
- // Get our instance data pointer
- //
- psInst = &((tUSBDHIDDevice *)psHIDDevice)->sPrivateData;
-
- //
- // We have not had to defer any report transmissions yet.
- //
- bDeferred = false;
-
- //
- // Look at each of the input report idle timers in turn.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->ui8NumInputReports; ui32Loop++)
- {
- //
- // Update the time since the last report was sent.
- //
- psHIDDevice->psReportIdle[ui32Loop].ui32TimeSinceReportmS +=
- ui32ElapsedmS;
-
- //
- // Is this timer running?
- //
- if(psHIDDevice->psReportIdle[ui32Loop].ui8Duration4mS)
- {
- //
- // Yes - is it about to expire?
- //
- if(psHIDDevice->psReportIdle[ui32Loop].ui16TimeTillNextmS <=
- ui32ElapsedmS)
- {
- //
- // The timer is about to expire. Can we send a report right
- // now?
- //
- if((psInst->iHIDTxState == eHIDStateIdle) &&
- (psInst->bSendInProgress == false))
- {
- //
- // We can send a report so send a message to the
- // application to retrieve its latest report for
- // transmission to the host.
- //
- ui32SizeReport = psHIDDevice->pfnRxCallback(
- psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_IDLE_TIMEOUT,
- psHIDDevice->psReportIdle[ui32Loop].ui8ReportID,
- &pvReport);
-
- //
- // Schedule the report for transmission.
- //
- USBDHIDReportWrite((void *)psHIDDevice, pvReport,
- ui32SizeReport, true);
-
- //
- // Reload the timer for the next period.
- //
- psHIDDevice->psReportIdle[ui32Loop].ui16TimeTillNextmS =
- psHIDDevice->psReportIdle[ui32Loop].ui8Duration4mS * 4;
- }
- else
- {
- //
- // We can't send the report straight away so flag it for
- // transmission as soon as the previous transmission ends.
- //
- psHIDDevice->psReportIdle[ui32Loop].ui16TimeTillNextmS = 0;
- bDeferred = true;
- }
- }
- else
- {
- //
- // The timer is not about to expire. Update the time till the
- // next report transmission.
- //
- psHIDDevice->psReportIdle[ui32Loop].ui16TimeTillNextmS -=
- ui32ElapsedmS;
- }
- }
- }
-
- //
- // If we had to defer transmission of any report, remember this so that we
- // will process it as soon as possible.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, HID_DO_SEND_IDLE_REPORT,
- bDeferred);
-}
-
-static void
-SetIdleTimeout(const tUSBDHIDDevice *psHIDDevice, uint8_t ui8ReportID,
- uint8_t ui8Timeout4mS)
-{
- uint32_t ui32Loop;
- bool bReportNeeded;
- tHIDReportIdle *psIdle;
-
- //
- // Remember that we have not found any report that needs to be sent
- // immediately.
- //
- bReportNeeded = false;
-
- //
- // Search through all the input reports looking for ones that fit the
- // requirements.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->ui8NumInputReports; ui32Loop++)
- {
- psIdle = &psHIDDevice->psReportIdle[ui32Loop];
-
- //
- // If the report ID passed matches the report ID in the idle timer
- // control structure or we were passed a report ID of zero, which
- // indicates that all timers are to be set...
- //
- if(!ui8ReportID || (ui8ReportID == psIdle->ui8ReportID))
- {
- //
- // Save the new duration for the idle timer.
- //
- psIdle->ui8Duration4mS = ui8Timeout4mS;
-
- //
- // Are we enabling the idle timer? If so, fix up the time until it
- // needs to fire.
- //
- if(ui8Timeout4mS)
- {
- //
- // Determine what the timeout is for this report given the time
- // since the last report of this type was sent.
- //
- if(psIdle->ui32TimeSinceReportmS >=
- ((uint32_t)ui8Timeout4mS * 4))
- {
- psIdle->ui16TimeTillNextmS = 0;
- bReportNeeded = true;
- }
- else
- {
- psIdle->ui16TimeTillNextmS =
- (((uint16_t)ui8Timeout4mS * 4) -
- psIdle->ui32TimeSinceReportmS);
- }
- }
- }
- }
-
- //
- // If we get to here and bReportNeeded is true, this means we need to
- // send back at least one of the input reports as soon as possible. Try
- // to do this immediately.
- //
- if(bReportNeeded)
- {
- ProcessIdleTimers(psHIDDevice, 0);
- }
-}
-
-//*****************************************************************************
-//
-// Find the idle timeout for a given HID input report.
-//
-// \param psHIDDevice points to the HID device whose report idle timeout is to
-// be found.
-// \param ui8ReportID identifies the report whose timeout is requested. If 0,
-// the timeout for the first report is returns, regardless of its ID (or
-// whether it has one).
-//
-// This function returns the current idle timeout for a given HID input report.
-// The value returned is expressed in terms of 4mS intervals. Convert to
-// milliseconds by multiplying by 4. If the return value is 0, this indicates
-// that an infinite timeout is currently set and the device will not send the
-// report unless a state change occurs.
-//
-// \return Returns the current idle timeout for the given report.
-//
-//*****************************************************************************
-static uint32_t
-GetIdleTimeout(const tUSBDHIDDevice *psHIDDevice, uint8_t ui8ReportID)
-{
- uint32_t ui32Loop;
- tHIDReportIdle *psIdle;
-
- //
- // Search through all the input reports looking for ones that fit the
- // requirements.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->ui8NumInputReports; ui32Loop++)
- {
- psIdle = &psHIDDevice->psReportIdle[ui32Loop];
-
- //
- // If the report ID passed matches the report ID in the idle timer
- // control structure or we were passed a report ID of zero, which
- // indicates that all timers are to be set...
- //
- if(!ui8ReportID || (ui8ReportID == psIdle->ui8ReportID))
- {
- //
- // We found a report matching the required ID or we were not passed
- // an ID and we are looking at the first report information.
- //
- return((uint32_t)psIdle->ui8Duration4mS);
- }
- }
-
- //
- // If we drop out, the report could not be found so we need to indicate
- // an error.
- //
- return(HID_NOT_FOUND);
-}
-
-//*****************************************************************************
-//
-// Find the n-th HID class descriptor of a given type in the client-provided
-// descriptor table.
-//
-// \param psHIDDevice points to the HID device which is to be searched for the
-// required class descriptor.
-// \param ui8Type is the type of class descriptor being requested. This will
-// be either USB_HID_DTYPE_REPORT or USB_HID_DTYPE_PHYSICAL.
-// \param ui32Index is the zero-based index of the descriptor that is being
-// requested.
-//
-// This function parses the supplied HID descriptor to find the index into the
-// sClassDescriptor array that corresponds to the requested descriptor. If
-// a descriptor with the requested index does not exist, HID_NOT_FOUND will be
-// returned unless the request is for a physical descriptor and at least one
-// such descriptor exists. In this case, the index returned will be for the
-// last physical descriptor (as required by the HID spec 7.1.1).
-//
-// \return Returns the index of the descriptor within the sClassDescriptor
-// of the tHIDDevice structure if found or HID_NOT_FOUND otherwise.
-//
-//*****************************************************************************
-static uint32_t
-FindHIDDescriptor(const tUSBDHIDDevice *psHIDDevice, uint8_t ui8Type,
- uint32_t ui32Index, uint32_t *pui32Len)
-{
- bool bFoundType;
- uint32_t ui32Loop, ui32Count, ui32LastFound;
- const tHIDClassDescriptorInfo *psDesc;
-
- //
- // Remember that we have not found any descriptor with a matching type yet.
- //
- bFoundType = false;
- ui32Count = 0;
- ui32LastFound = 0;
-
- //
- // Walk through all the class descriptors looking for the one which
- // matches the requested index and type.
- //
- for(ui32Loop = 0; ui32Loop < psHIDDevice->psHIDDescriptor->bNumDescriptors;
- ui32Loop++)
- {
- psDesc = &(psHIDDevice->psHIDDescriptor->sClassDescriptor[ui32Loop]);
- if(psDesc->bDescriptorType == ui8Type)
- {
- //
- // We found a descriptor of the correct type. Is this the
- // correct index?
- //
- bFoundType = true;
-
- //
- // Is this the descriptor we are looking for?
- //
- if(ui32Count == ui32Index)
- {
- //
- // Yes - we found it so return the index and size to the
- // caller.
- //
- *pui32Len = (uint32_t)psDesc->wDescriptorLength;
- return(ui32Loop);
- }
- else
- {
- //
- // Update our count and keep looking. Remember where we were
- // when we found this descriptor in case we need to return the
- // last physical descriptor.
- //
- ui32Count++;
- ui32LastFound = ui32Loop;
- }
- }
- }
-
- //
- // If we drop out, we did not find the requested descriptor. Now handle
- // the special case of a physical descriptor - if we found any physical
- // descriptors, return the last one.
- //
- if((ui8Type == USB_HID_DTYPE_PHYSICAL) && bFoundType)
- {
- //
- // Get the length of the last descriptor we found.
- //
- psDesc =
- &(psHIDDevice->psHIDDescriptor->sClassDescriptor[ui32LastFound]);
- *pui32Len = (uint32_t)psDesc->wDescriptorLength;
-
- //
- // Return the index to the caller.
- //
- return(ui32LastFound);
- }
- else
- {
- //
- // We could not find the descriptor so return an appropriate error.
- //
- return(HID_NOT_FOUND);
- }
-}
-
-//*****************************************************************************
-//
-// Schedule transmission of the next packet forming part of an input report.
-//
-// \param psHIDInst points to the HID device instance whose input report is to
-// be sent.
-//
-// This function is called to transmit the next packet of an input report
-// passed to the driver via a call to USBDHIDReportWrite. If any data remains
-// to be sent, a USB packet is written to the FIFO and scheduled for
-// transmission to the host. The function ensures that reports are sent as
-// a sequence of full packets followed by either a single int16_t packet or a
-// packet with no data to indicate the end of the transaction.
-//
-//*****************************************************************************
-static int32_t
-ScheduleReportTransmission(tHIDInstance *psHIDInst)
-{
- uint32_t ui32NumBytes;
- uint8_t *pui8Data;
- int32_t i32Retcode;
-
- //
- // Set the number of bytes to send this iteration.
- //
- ui32NumBytes = (uint32_t)(psHIDInst->ui16InReportSize -
- psHIDInst->ui16InReportIndex);
-
- //
- // Limit individual transfers to the maximum packet size for the endpoint.
- //
- if(ui32NumBytes > USBDHID_MAX_PACKET)
- {
- ui32NumBytes = USBDHID_MAX_PACKET;
- }
-
- //
- // Where are we sending this data from?
- //
- pui8Data = psHIDInst->pui8InReportData + psHIDInst->ui16InReportIndex;
-
- //
- // Put the data in the correct FIFO.
- //
- i32Retcode = MAP_USBEndpointDataPut(psHIDInst->ui32USBBase,
- psHIDInst->ui8INEndpoint,
- pui8Data, ui32NumBytes);
-
- if(i32Retcode != -1)
- {
- //
- // Update the count and index ready for the next time round.
- //
- psHIDInst->ui16InReportIndex += ui32NumBytes;
-
- //
- // Send out the current data.
- //
- i32Retcode = MAP_USBEndpointDataSend(psHIDInst->ui32USBBase,
- psHIDInst->ui8INEndpoint,
- USB_TRANS_IN);
- }
-
- //
- // Tell the caller how we got on.
- //
- return(i32Retcode);
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data received from the host.
-//
-// \param psHIDDevice is the device instance whose endpoint is to be processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts signaling
-// the arrival of data on the interrupt OUT endpoint (in other words, whenever
-// the host has sent us a packet of data). We inform the client that a packet
-// is available and, on return, check to see if the packet has been read. If
-// not, we schedule another notification to the client for a later time.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-ProcessDataFromHost(tUSBDHIDDevice *psHIDDevice, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus, ui32Size;
- tHIDInstance *psInst;
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, psInst->ui8OUTEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(USB0_BASE, psInst->ui8OUTEndpoint,
- ui32EPStatus);
-
- //
- // Has a packet been received?
- //
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Set the flag we use to indicate that a packet read is pending. This
- // will be cleared if the packet is read. If the client does not read
- // the packet in the context of the USB_EVENT_RX_AVAILABLE callback,
- // the event will be signaled later during tick processing.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags, HID_DO_PACKET_RX,
- true);
-
- //
- // How big is the packet we have just been sent?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // The receive channel is not blocked so let the caller know
- // that a packet is waiting. The parameters are set to indicate
- // that the packet has not been read from the hardware FIFO yet.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE, ui32Size,
- (void *)0);
- }
- else
- {
- //
- // No packet was received. Some error must have been reported. Check
- // and pass this on to the client if necessary.
- //
- if(ui32EPStatus & USB_RX_ERROR_FLAGS)
- {
- //
- // This is an error we report to the client so...
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USB_EVENT_ERROR,
- (ui32EPStatus & USB_RX_ERROR_FLAGS),
- (void *)0);
- }
- return(false);
- }
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Receives notifications related to data sent to the host.
-//
-// \param psHIDDevice is the device instance whose endpoint is to be processed.
-// \param ui32Status is the USB interrupt status that caused this function to
-// be called.
-//
-// This function is called from HandleEndpoints for all interrupts originating
-// from the interrupt IN endpoint (in other words, whenever data has been
-// transmitted to the USB host). We examine the cause of the interrupt and,
-// if due to completion of a transmission, notify the client.
-//
-// \return Returns \b true on success or \b false on failure.
-//
-//*****************************************************************************
-static bool
-ProcessDataToHost(tUSBDHIDDevice *psHIDDevice, uint32_t ui32Status)
-{
- tHIDInstance *psInst;
- uint32_t ui32EPStatus;
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8INEndpoint);
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase, psInst->ui8INEndpoint,
- ui32EPStatus);
-
- //
- // Our last packet was transmitted successfully. Is there any more data to
- // send or have we finished sending the whole report? We know we finished
- // if the ui16InReportIndex has reached the ui16InReportSize value.
- //
- if(psInst->ui16InReportSize == psInst->ui16InReportIndex)
- {
- //
- // We finished sending the last report so are idle once again.
- //
- psInst->iHIDTxState = eHIDStateIdle;
-
- //
- // Notify the client that the report transmission completed.
- //
- psHIDDevice->pfnTxCallback(psHIDDevice->pvTxCBData,
- USB_EVENT_TX_COMPLETE,
- psInst->ui16InReportSize, (void *)0);
-
- //
- // Do we have any reports to send as a result of idle timer timeouts?
- //
- if(psInst->ui16DeferredOpFlags & (1 << HID_DO_SEND_IDLE_REPORT))
- {
- //
- // Yes - send reports for any timers that expired recently.
- //
- ProcessIdleTimers(psHIDDevice, 0);
- }
- }
- else
- {
- //
- // There must be more data or a zero length packet waiting to be sent
- // so go ahead and do this.
- //
- ScheduleReportTransmission(psInst);
- }
-
- return(true);
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack for any activity involving one of our endpoints
-// other than EP0. This function is a fan out that merely directs the call to
-// the correct handler depending upon the endpoint and transaction direction
-// signaled in ui32Status.
-//
-//*****************************************************************************
-static void
-HandleEndpoints(void *pvHIDInstance, uint32_t ui32Status)
-{
- tUSBDHIDDevice *psHIDInst;
- tHIDInstance *psInst;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Determine if the serial device is in single or composite mode because
- // the meaning of ui32Index is different in both cases.
- //
- psHIDInst = (tUSBDHIDDevice *)pvHIDInstance;
- psInst = &psHIDInst->sPrivateData;
-
- //
- // Handler for the interrupt OUT data endpoint.
- //
- if(ui32Status & (0x10000 << USBEPToIndex(psInst->ui8OUTEndpoint)))
- {
- //
- // Data is being sent to us from the host.
- //
- ProcessDataFromHost(pvHIDInstance, ui32Status);
- }
-
- //
- // Handler for the interrupt IN data endpoint.
- //
- if(ui32Status & (1 << USBEPToIndex(psInst->ui8INEndpoint)))
- {
- ProcessDataToHost(pvHIDInstance, ui32Status);
- }
-}
-
-//*****************************************************************************
-//
-// Called by the USB stack whenever a configuration change occurs.
-//
-//*****************************************************************************
-static void
-HandleConfigChange(void *pvHIDInstance, uint32_t ui32Info)
-{
- tHIDInstance *psInst;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Create the instance pointer.
- //
- psHIDDevice = pvHIDInstance;
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Set all our endpoints to idle state.
- //
- psInst->iHIDRxState = eHIDStateIdle;
- psInst->iHIDTxState = eHIDStateIdle;
-
- //
- // If we are not currently connected let the client know we are open for
- // business.
- //
- if(!psInst->bConnected)
- {
- //
- // Pass the connected event to the client.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USB_EVENT_CONNECTED, 0, (void *)0);
- }
-
- //
- // Clear the idle timers for each input report.
- //
- ClearIdleTimers(psHIDDevice);
-
- //
- // Remember that we are connected.
- //
- psInst->bConnected = true;
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvHIDInstance, uint32_t ui32Request, void *pvRequestData)
-{
- tHIDInstance *psInst;
- uint8_t *pui8Data;
-
- //
- // Create the serial instance data.
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Create the int8_t array used by the events supported by the USB CDC
- // serial class.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- psInst->ui8Interface = pui8Data[1];
- break;
- }
-
- //
- // This was an endpoint change event.
- //
- case USB_EVENT_COMP_EP_CHANGE:
- {
- //
- // Determine if this is an IN or OUT endpoint that has changed.
- //
- if(pui8Data[0] & USB_EP_DESC_IN)
- {
- psInst->ui8INEndpoint = IndexToUSBEP((pui8Data[1] & 0x7f));
- }
- else
- {
- //
- // Extract the new endpoint number.
- //
- psInst->ui8OUTEndpoint = IndexToUSBEP(pui8Data[1] & 0x7f);
- }
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//*****************************************************************************
-static void
-HandleDisconnect(void *pvHIDInstance)
-{
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Create the instance pointer.
- //
- psHIDDevice = (tUSBDHIDDevice *)pvHIDInstance;
-
- //
- // If we are not currently connected so let the client know we are open
- // for business.
- //
- if(psHIDDevice->sPrivateData.bConnected)
- {
- //
- // Pass the disconnected event to the client.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USB_EVENT_DISCONNECTED, 0, (void *)0);
- }
-
- //
- // Remember that we are no longer connected.
- //
- psHIDDevice->sPrivateData.bConnected = false;
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a request for a
-// non-standard descriptor is received.
-//
-// \param pvHIDInstance is the instance data for this request.
-// \param psUSBRequest points to the request received.
-//
-// This call parses the provided request structure and determines which
-// descriptor is being requested. Assuming the descriptor can be found, it is
-// scheduled for transmission via endpoint zero. If the descriptor cannot be
-// found, the endpoint is stalled to indicate an error to the host.
-//
-//*****************************************************************************
-static void
-HandleGetDescriptor(void *pvHIDInstance, tUSBRequest *psUSBRequest)
-{
- uint32_t ui32Size, ui32Desc;
- const tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Which device are we dealing with?
- //
- psHIDDevice = pvHIDInstance;
-
- //
- // Which type of class descriptor are we being asked for?
- //
- switch(psUSBRequest->wValue >> 8)
- {
- //
- // This is a request for a HID report or physical descriptor.
- //
- case USB_HID_DTYPE_REPORT:
- case USB_HID_DTYPE_PHYSICAL:
- {
- //
- // Find the index to the descriptor that is being queried.
- //
- ui32Size = 0;
- ui32Desc = FindHIDDescriptor(psHIDDevice,
- psUSBRequest->wValue >> 8,
- psUSBRequest->wValue & 0xFF,
- &ui32Size);
-
- //
- // Did we find the descriptor?
- //
- if(ui32Desc == HID_NOT_FOUND)
- {
- //
- // No - stall the endpoint and return.
- //
- USBDCDStallEP0(0);
- return;
- }
-
- //
- // If there is more data to send than the host requested then just
- // send the requested amount of data.
- //
- if(ui32Size > psUSBRequest->wLength)
- {
- ui32Size = psUSBRequest->wLength;
- }
-
- //
- // Send the data via endpoint 0.
- //
- USBDCDSendDataEP0(0,
- (uint8_t *)psHIDDevice->ppui8ClassDescriptors[ui32Desc],
- ui32Size);
-
- break;
- }
-
- //
- // This is a request for the HID descriptor (as found in the
- // configuration descriptor following the relevant interface).
- //
- case USB_HID_DTYPE_HID:
- {
- //
- // How big is the HID descriptor?
- //
- ui32Size = (uint32_t)psHIDDevice->psHIDDescriptor->bLength;
-
- //
- // If there is more data to send than the host requested then just
- // send the requested amount of data.
- //
- if(ui32Size > psUSBRequest->wLength)
- {
- ui32Size = psUSBRequest->wLength;
- }
-
- //
- // Send the data via endpoint 0.
- //
- USBDCDSendDataEP0(0, (uint8_t *)psHIDDevice->psHIDDescriptor,
- ui32Size);
- break;
- }
-
- //
- // This was an unknown request so stall.
- //
- default:
- {
- USBDCDStallEP0(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a non-standard
-// request is received.
-//
-// \param pvHIDInstance is the instance data for this HID device.
-// \param psUSBRequest points to the request received.
-//
-// This call parses the provided request structure. Assuming the request is
-// understood, it is handled and any required response generated. If the
-// request cannot be handled by this device class, endpoint zero is stalled to
-// indicate an error to the host.
-//
-//*****************************************************************************
-static void
-HandleRequest(void *pvHIDInstance, tUSBRequest *psUSBRequest)
-{
- tHIDInstance *psInst;
- uint8_t ui8Protocol;
- uint32_t ui32Size, ui32Timeout;
- uint8_t *pui8Report;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Which device are we dealing with?
- //
- psHIDDevice = pvHIDInstance;
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Make sure the request was for this interface.
- //
- if(psUSBRequest->wIndex != psInst->ui8Interface)
- {
- return;
- }
-
- //
- // Determine the type of request.
- //
- switch(psUSBRequest->bRequest)
- {
- //
- // A Set Report request is received from the host when it sends an
- // Output report via endpoint 0.
- //
- case USBREQ_SET_REPORT:
- {
- //
- // Ask the application for a buffer large enough to hold the
- // report we are to be sent.
- //
- psInst->ui16OutReportSize = psUSBRequest->wLength;
- psInst->pui8OutReportData =
- (uint8_t *)psHIDDevice->pfnRxCallback(
- psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_GET_REPORT_BUFFER,
- psUSBRequest->wValue,
- (void *)(uint32_t)(psUSBRequest->wLength));
-
- //
- // Did the client provide us a buffer?
- //
- if(!psInst->pui8OutReportData)
- {
- //
- // The application could not provide us a buffer so stall the
- // request.
- //
- USBDCDStallEP0(0);
- }
- else
- {
- //
- // The client provided us a buffer to read the report into
- // so request the data from the host.
- //
-
- //
- // Set the state to indicate we are waiting for data.
- //
- psInst->iHIDRxState = eHIDStateWaitData;
-
- //
- // Now read the payload of the request. We handle the actual
- // operation in the data callback once this data is received.
- //
- USBDCDRequestDataEP0(0, psInst->pui8OutReportData,
- (uint32_t)psUSBRequest->wLength);
-
- //
- // Need to ACK the data on end point 0 in this case. Do this
- // after requesting the data to prevent race conditions that
- // occur if you acknowledge before setting up to receive the
- // request data.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, false);
- }
-
- break;
- }
-
- //
- // A Get Report request is used by the host to poll a device for its
- // current state.
- //
- case USBREQ_GET_REPORT:
- {
- //
- // Get the latest report from the application.
- //
- ui32Size = psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_GET_REPORT,
- psUSBRequest->wValue, &pui8Report);
-
- //
- // Need to ACK the data on end point 0 in this case.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, true);
-
- //
- // ..then send back the requested report.
- //
- psInst->bGetRequestPending = true;
- USBDCDSendDataEP0(0, pui8Report, ui32Size);
-
- break;
- }
-
- //
- // A set IDLE request has been made. This indicates to us how often a
- // given report should be sent back to the host in the absence of any
- // change in state of the device.
- //
- case USBREQ_SET_IDLE:
- {
- //
- // Set the idle timeout for the requested report(s).
- //
- SetIdleTimeout(psHIDDevice, psUSBRequest->wValue & 0xFF,
- (psUSBRequest->wValue >> 8) & 0xFF);
-
- //
- // Need to ACK the data on end point 0 in this case.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, true);
-
- break;
- }
-
- //
- // A get IDLE request has been made. This request queries the current
- // idle timeout for a given report.
- //
- case USBREQ_GET_IDLE:
- {
- //
- // Determine the timeout for the requested report.
- //
- ui32Timeout = GetIdleTimeout(psHIDDevice, psUSBRequest->wValue);
-
- if(ui32Timeout != HID_NOT_FOUND)
- {
- //
- // Need to ACK the data on end point 0 in this case.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, true);
-
- //
- // Send our response to the host.
- //
- USBDCDSendDataEP0(0, (uint8_t *)&ui32Timeout, 1);
- }
- else
- {
- //
- // The report ID was not found so stall the endpoint.
- //
- USBDCDStallEP0(0);
- }
- break;
- }
-
- //
- // Set either boot or report protocol for reports sent from the device.
- // This is only supported by devices in the boot subclass.
- //
- case USBREQ_SET_PROTOCOL:
- {
- if(psHIDDevice->ui8Subclass == USB_HID_SCLASS_BOOT)
- {
- //
- // We need to ACK the data on end point 0 in this case.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, true);
-
- //
- // We are a boot subclass device so pass this on to the
- // application.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_SET_PROTOCOL,
- psUSBRequest->wValue,
- (void *)0);
- }
- else
- {
- //
- // This is not a boot subclass device so stall the endpoint to
- // show that we don't support this request.
- //
- USBDCDStallEP0(0);
- }
- break;
- }
-
- //
- // Inform the host of the protocol, boot or report, that is currently
- // in use. This is only supported by devices in the boot subclass.
- //
- case USBREQ_GET_PROTOCOL:
- {
- if(psHIDDevice->ui8Subclass == USB_HID_SCLASS_BOOT)
- {
- //
- // We need to ACK the data on end point 0 in this case.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase, USB_EP_0, true);
-
- //
- // We are a boot subclass device so pass this on to the
- // application callback to get the answer.
- //
- ui8Protocol = (uint8_t)psHIDDevice->pfnRxCallback(
- psHIDDevice->pvRxCBData, USBD_HID_EVENT_GET_PROTOCOL, 0,
- (void *)0);
-
- //
- // Send our response to the host.
- //
- USBDCDSendDataEP0(0, (uint8_t *)&ui8Protocol, 1);
- }
- else
- {
- //
- // This is not a boot subclass device so stall the endpoint to
- // show that we don't support this request.
- //
- USBDCDStallEP0(0);
- }
- break;
- }
-
- //
- // This request was not recognized so stall.
- //
- default:
- {
- USBDCDStallEP0(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the data requested
-// on endpoint zero is received.
-//
-//*****************************************************************************
-static void
-HandleEP0DataReceived(void *pvHIDInstance, uint32_t ui32DataSize)
-{
- tHIDInstance *psInst;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Which device are we dealing with?
- //
- psHIDDevice = pvHIDInstance;
-
- //
- // If we were not passed any data, just return.
- //
- if(ui32DataSize == 0)
- {
- return;
- }
-
- //
- // Get our instance data pointer.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Make sure we are actually expecting something.
- //
- if(psInst->iHIDRxState != eHIDStateWaitData)
- {
- return;
- }
-
- //
- // Change the endpoint state back to idle now that we have been passed
- // the data we were waiting for.
- //
- psInst->iHIDRxState = eHIDStateIdle;
-
- //
- // The only things we ever request via endpoint zero are reports sent to
- // us via a Set_Report request. Pass the newly received report on to
- // the client.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_SET_REPORT,
- psInst->ui16OutReportSize,
- psInst->pui8OutReportData);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the data sent on
-// endpoint zero is received and acknowledged by the host.
-//
-//*****************************************************************************
-static void
-HandleEP0DataSent(void *pvHIDInstance, uint32_t ui32Info)
-{
- tHIDInstance *psInst;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Which device are we dealing with?
- //
- psHIDDevice = pvHIDInstance;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // If we just sent a report in response to a Get_Report request, send an
- // event to the application telling it that the transmission completed.
- //
- if(psInst->bGetRequestPending)
- {
- //
- // Clear the flag now that we are sending the application callback.
- //
- psInst->bGetRequestPending = false;
-
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USBD_HID_EVENT_REPORT_SENT, 0, (void *)0);
- }
-
- return;
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// reset. If we are currently connected, send a disconnect event at this
-// point.
-//
-//*****************************************************************************
-static void
-HandleReset(void *pvHIDInstance)
-{
- ASSERT(pvHIDInstance != 0);
-
- //
- // Merely call the disconnect handler. This causes a disconnect message to
- // be sent to the client if we think we are currently connected.
- //
- HandleDisconnect(pvHIDInstance);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is put into
-// suspend state.
-//
-//*****************************************************************************
-static void
-HandleSuspend(void *pvHIDInstance)
-{
- const tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Create the instance pointer.
- //
- psHIDDevice = (const tUSBDHIDDevice *)pvHIDInstance;
-
- //
- // Pass the event on to the client.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData, USB_EVENT_SUSPEND, 0,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the bus is taken
-// out of suspend state.
-//
-//*****************************************************************************
-static void
-HandleResume(void *pvHIDInstance)
-{
- const tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Create the instance pointer.
- //
- psHIDDevice = (const tUSBDHIDDevice *)pvHIDInstance;
-
- //
- // Pass the event on to the client.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData, USB_EVENT_RESUME, 0,
- (void *)0);
-}
-
-//*****************************************************************************
-//
-// This function is called periodically and provides us with a time reference
-// and method of implementing delayed or time-dependent operations.
-//
-// \param pvHIDInstance is the instance data for this request.
-// \param ui32TimemS is the elapsed time in milliseconds since the last call
-// to this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-HIDTickHandler(void *pvHIDInstance, uint32_t ui32TimemS)
-{
- tHIDInstance *psInst;
- uint32_t ui32Size;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvHIDInstance != 0);
-
- //
- // Create the instance pointer.
- //
- psHIDDevice = (tUSBDHIDDevice *)pvHIDInstance;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // If we are connected, process our idle timers.
- //
- if(psInst->bConnected)
- {
- ProcessIdleTimers(psHIDDevice, ui32TimemS);
- }
-
- //
- // Do we have a deferred receive waiting
- //
- if(psInst->ui16DeferredOpFlags & (1 << HID_DO_PACKET_RX))
- {
- //
- // Yes - how big is the waiting packet?
- //
- ui32Size = MAP_USBEndpointDataAvail(USB0_BASE, psInst->ui8OUTEndpoint);
-
- //
- // Tell the client that there is a packet waiting for it.
- //
- psHIDDevice->pfnRxCallback(psHIDDevice->pvRxCBData,
- USB_EVENT_RX_AVAILABLE, ui32Size,
- (void *)0);
- }
-
- return;
-}
-
-//*****************************************************************************
-//
-//! Initializes HID device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID device operation.
-//! \param psHIDDevice points to a structure containing parameters customizing
-//! the operation of the HID device.
-//!
-//! An application wishing to offer a USB HID interface to a host system
-//! must call this function to initialize the USB controller and attach the
-//! device to the USB bus. This function performs all required USB
-//! initialization.
-//!
-//! On successful completion, this function will return the \e psHIDDevice
-//! pointer passed to it. This must be passed on all future calls from the
-//! application to the HID device class driver.
-//!
-//! The USB HID device class API offers the application a report-based transmit
-//! interface for Input reports. Output reports may be received via the
-//! control endpoint or via a dedicated Interrupt OUT endpoint. If using the
-//! dedicated endpoint, report data is delivered to the application packet-by-
-//! packet. If the application uses reports longer than \b USBDHID_MAX_PACKET
-//! bytes and would rather receive full reports, it may use a USB buffer above
-//! the receive channel to allow full reports to be read.
-//!
-//! Transmit Operation:
-//!
-//! Calls to USBDHIDReportWrite() pass complete reports to the driver for
-//! transmission. These will be transmitted to the host using as many USB
-//! packets as are necessary to complete the transmission.
-//!
-//! Once a full Input report has been acknowledged by the USB host, a
-//! \b USB_EVENT_TX_COMPLETE event is sent to the application transmit callback
-//! to inform it that another report may be transmitted.
-//!
-//! Receive Operation (when using a dedicated interrupt OUT endpoint):
-//!
-//! An incoming USB data packet will result in a call to the application
-//! callback with event \b USB_EVENT_RX_AVAILABLE. The application must then
-//! call USBDHIDPacketRead(), passing a buffer capable of holding the received
-//! packet. The size of the packet may be determined by calling function
-//! USBDHIDRxPacketAvailable() prior to reading the packet.
-//!
-//! Receive Operation (when not using a dedicated OUT endpoint):
-//!
-//! If no dedicated OUT endpoint is used, Output and Feature reports are sent
-//! from the host using the control endpoint, endpoint zero. When such a
-//! report is received, \b USBD_HID_EVENT_GET_REPORT_BUFFER is sent to the
-//! application which must respond with a buffer large enough to hold the
-//! report. The device class driver will then copy the received report into
-//! the supplied buffer before sending \b USBD_HID_EVENT_SET_REPORT to indicate
-//! that the report is now available.
-//!
-//! \note The application must not make any calls to the low level USB device
-//! interface if interacting with USB via the USB HID device class API. Doing
-//! so will cause unpredictable (though almost certainly unpleasant) behavior.
-//!
-//! \return Returns NULL on failure or the \e psHIDDevice pointer on success.
-//
-//*****************************************************************************
-void *
-USBDHIDInit(uint32_t ui32Index, tUSBDHIDDevice *psHIDDevice)
-{
- tDeviceDescriptor *pi16DevDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psHIDDevice);
- ASSERT(psHIDDevice->ppui8StringDescriptors);
- ASSERT(psHIDDevice->pfnRxCallback);
- ASSERT(psHIDDevice->pfnTxCallback);
- ASSERT(psHIDDevice->ppui8ClassDescriptors);
- ASSERT(psHIDDevice->psHIDDescriptor);
- ASSERT((psHIDDevice->ui8NumInputReports == 0) || psHIDDevice->psReportIdle);
-
- USBDHIDCompositeInit(ui32Index, psHIDDevice, 0);
-
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- pi16DevDesc = (tDeviceDescriptor *)psHIDDevice->sPrivateData.sDevInfo.pui8DeviceDescriptor;
- pi16DevDesc->idVendor = psHIDDevice->ui16VID;
- pi16DevDesc->idProduct = psHIDDevice->ui16PID;
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the HID device on the bus.
- //
- USBDCDInit(ui32Index, &psHIDDevice->sPrivateData.sDevInfo,
- (void *)psHIDDevice);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psHIDDevice);
-}
-
-//*****************************************************************************
-//
-//! Initializes HID device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID device operation.
-//! \param psHIDDevice points to a structure containing parameters customizing
-//! the operation of the HID device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! USB HID device classes call this function to initialize the lower level
-//! HID interface in the USB controller. If this HID device device is part of
-//! a composite device, then the \e psCompEntry should point to the composite
-//! device entry to initialize. This is part of the array that is passed to
-//! the USBDCompositeInit() function.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB HID APIs.
-//
-//*****************************************************************************
-void *
-USBDHIDCompositeInit(uint32_t ui32Index, tUSBDHIDDevice *psHIDDevice,
- tCompositeEntry *psCompEntry)
-{
- tHIDInstance *psInst;
- tEndpointDescriptor *psEndpoint;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psHIDDevice);
- ASSERT(psHIDDevice->ppsConfigDescriptor);
- ASSERT(psHIDDevice->ppui8StringDescriptors);
- ASSERT(psHIDDevice->pfnRxCallback);
- ASSERT(psHIDDevice->pfnTxCallback);
- ASSERT(psHIDDevice->ppui8ClassDescriptors);
- ASSERT(psHIDDevice->psHIDDescriptor);
- ASSERT((psHIDDevice->ui8NumInputReports == 0) || psHIDDevice->psReportIdle);
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst = &psHIDDevice->sPrivateData;
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sHIDHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8HIDDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors = psHIDDevice->ppsConfigDescriptor;
- psInst->sDevInfo.ppui8StringDescriptors =
- psHIDDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psHIDDevice->ui32NumStringDescriptors;
-
- //
- // Default the endpoints zero before looking for them in the configuration
- // descriptor.
- //
- psInst->ui8Interface = 0;
- psInst->ui8INEndpoint = 0;
- psInst->ui8OUTEndpoint = 0;
-
- //
- // Get the first endpoint descriptor on interface 0.
- //
- psEndpoint =
- USBDCDConfigGetInterfaceEndpoint(psHIDDevice->ppsConfigDescriptor[0],
- psInst->ui8Interface, 0, 0);
-
- if(psEndpoint)
- {
- if(psEndpoint->bEndpointAddress & 0x80)
- {
- psInst->ui8INEndpoint = IndexToUSBEP(psEndpoint->bEndpointAddress);
- }
- else
- {
- psInst->ui8OUTEndpoint = IndexToUSBEP(psEndpoint->bEndpointAddress);
- }
- }
-
- //
- // Get the second endpoint descriptor on interface 0.
- //
- psEndpoint =
- USBDCDConfigGetInterfaceEndpoint(psHIDDevice->ppsConfigDescriptor[0],
- psInst->ui8Interface, 0, 1);
- if(psEndpoint)
- {
- if(psEndpoint->bEndpointAddress & 0x80)
- {
- psInst->ui8INEndpoint = IndexToUSBEP(psEndpoint->bEndpointAddress);
- }
- else
- {
- psInst->ui8OUTEndpoint = IndexToUSBEP(psEndpoint->bEndpointAddress);
- }
- }
-
- //
- // Must have at least an IN endpoint.
- //
- if(psInst->ui8INEndpoint == 0)
- {
- return((void *)0);
- }
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psHIDDevice;
- }
-
- psInst->ui32USBBase = USB0_BASE;
- psInst->iHIDRxState = eHIDStateUnconfigured;
- psInst->iHIDTxState = eHIDStateUnconfigured;
- psInst->ui16DeferredOpFlags = 0;
- psInst->bConnected = false;
- psInst->bGetRequestPending = false;
- psInst->bSendInProgress = false;
- psInst->ui16InReportIndex = 0;
- psInst->ui16InReportSize = 0;
- psInst->pui8InReportData = (uint8_t *)0;
- psInst->ui16OutReportSize = 0;
- psInst->pui8OutReportData = (uint8_t *)0;
-
- //
- // Initialize the device info structure for the HID device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // Initialize the input report idle timers if any input reports exist.
- //
- ClearIdleTimers(psHIDDevice);
-
- //
- // Initialize the USB tick module, this will prevent it from being
- // initialized later in the call to USBDCDInit();
- //
- InternalUSBTickInit();
-
- //
- // Register our tick handler (this must be done after USBDCDInit).
- //
- InternalUSBRegisterTickHandler(HIDTickHandler, (void *)psHIDDevice);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psHIDDevice);
-}
-
-//*****************************************************************************
-//
-//! Shuts down the HID device.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//!
-//! This function terminates HID operation for the instance supplied and
-//! removes the device from the USB bus. This function should not be called
-//! if the HID device is part of a composite device and instead the
-//! USBDCompositeTerm() function should be called for the full composite
-//! device.
-//!
-//! Following this call, the \e pvHIDInstance instance should not me used in
-//! any other calls.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDTerm(void *pvHIDInstance)
-{
- tHIDInstance *psInst;
-
- ASSERT(pvHIDInstance);
-
- //
- // Get a pointer to our instance data.
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Terminate the requested instance.
- //
- USBDCDTerm(USBBaseToIndex(psInst->ui32USBBase));
-
- psInst->ui32USBBase = 0;
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer parameter for the receive channel
-//! callback.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the receive channel callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnRxCallback function
-//! passed on USBDHIDInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the pvHIDInstance structure passed to USBDHIDInit() resides in
-//! RAM. If this structure is in flash, callback data changes will not be
-//! possible.
-//!
-//! \return Returns the previous callback pointer that was being used for
-//! this instance's receive callback.
-//
-//*****************************************************************************
-void *
-USBDHIDSetRxCBData(void *pvHIDInstance, void *pvCBData)
-{
- void *pvOldValue;
-
- ASSERT(pvHIDInstance);
-
- //
- // Set the callback data for the receive channel after remembering the
- // previous value.
- //
- pvOldValue = ((tUSBDHIDDevice *)pvHIDInstance)->pvRxCBData;
- ((tUSBDHIDDevice *)pvHIDInstance)->pvRxCBData = pvCBData;
-
- //
- // Return the previous callback data value.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific data pointer for the transmit callback.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the transmit channel callback function.
-//!
-//! The client uses this function to change the callback data pointer passed in
-//! the first parameter on all callbacks to the \e pfnTxCallback function
-//! passed on USBDHIDInit().
-//!
-//! If a client wants to make runtime changes in the callback data, it must
-//! ensure that the pvHIDInstance structure passed to USBDHIDInit() resides in
-//! RAM. If this structure is in flash, callback data changes will not be
-//! possible.
-//!
-//! \return Returns the previous callback data pointer that was being used for
-//! this instance's transmit callback.
-//
-//*****************************************************************************
-void *
-USBDHIDSetTxCBData(void *pvHIDInstance, void *pvCBData)
-{
- void *pvOldValue;
-
- ASSERT(pvHIDInstance);
-
- //
- // Set the callback data for the transmit channel after remembering the
- // previous value.
- //
- pvOldValue = ((tUSBDHIDDevice *)pvHIDInstance)->pvTxCBData;
- ((tUSBDHIDDevice *)pvHIDInstance)->pvTxCBData = pvCBData;
-
- //
- // Return the previous callback data value.
- //
- return(pvOldValue);
-}
-
-//*****************************************************************************
-//
-//! Transmits a HID device report to the USB host via the HID interrupt IN
-//! endpoint.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//! \param pi8Data points to the first byte of data which is to be transmitted.
-//! \param ui32Length is the number of bytes of data to transmit.
-//! \param bLast is ignored in this implementation. This parameter is required
-//! to ensure compatibility with other device class drivers and USB buffers.
-//!
-//! This function schedules the supplied data for transmission to the USB
-//! host in a single USB transaction using as many packets as it takes to send
-//! all the data in the report. If no transmission is currently ongoing,
-//! the first packet of data is immediately copied to the relevant USB endpoint
-//! FIFO for transmission. Whenever all the report data has been acknowledged
-//! by the host, a \b USB_EVENT_TX_COMPLETE event will be sent to the
-//! application transmit callback indicating that another report can now be
-//! transmitted.
-//!
-//! The caller must ensure that the data pointed to by \e pui8Data remains
-//! accessible and unaltered until the \b USB_EVENT_TX_COMPLETE is received.
-//!
-//! \return Returns the number of bytes actually scheduled for transmission.
-//! At this level, this will either be the number of bytes passed or 0 to
-//! indicate a failure.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDReportWrite(void *pvHIDInstance, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- tHIDInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvHIDInstance);
-
- //
- // Get our instance data pointer
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Set a flag indicating that we are currently in the process of sending
- // a packet.
- //
- psInst->bSendInProgress = true;
-
- //
- // Can we send the data provided?
- //
- if(psInst->iHIDTxState != eHIDStateIdle)
- {
- //
- // We are in the middle of sending another report. Return 0 to
- // indicate that we can't send this report until the previous one
- // finishes.
- //
- psInst->bSendInProgress = false;
- return(0);
- }
-
- //
- // Clear the elapsed time since this report was last sent.
- //
- if(ui32Length)
- {
- ClearReportTimer(pvHIDInstance, *pi8Data);
- }
-
- //
- // Keep track of the whereabouts of the report so that we can send it in
- // multiple packets if necessary.
- //
- psInst->pui8InReportData = pi8Data;
- psInst->ui16InReportIndex = 0;
- psInst->ui16InReportSize = ui32Length;
-
- //
- // Schedule transmission of the first packet of the report.
- //
- psInst->iHIDTxState = eHIDStateWaitData;
- i32Retcode = ScheduleReportTransmission(psInst);
-
- //
- // Clear the flag we use to indicate that we are in the midst of sending
- // a packet.
- //
- psInst->bSendInProgress = false;
-
- //
- // Did an error occur while trying to send the data?
- //
- if(i32Retcode != -1)
- {
- //
- // No - tell the caller we sent all the bytes provided.
- //
- return(ui32Length);
- }
- else
- {
- //
- // Yes - tell the caller we could not send the data.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Reads a packet of data received from the USB host via the interrupt OUT
-//! endpoint (if in use).
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//! \param pi8Data points to a buffer into which the received data will be
-//! written.
-//! \param ui32Length is the size of the buffer pointed to by pi8Data.
-//! \param bLast indicates whether the client will make a further call to
-//! read additional data from the packet.
-//!
-//! This function reads up to \e ui32Length bytes of data received from the USB
-//! host into the supplied application buffer. If the driver detects that the
-//! entire packet has been read, it is acknowledged to the host.
-//!
-//! The \e bLast parameter is ignored in this implementation since the end of
-//! a packet can be determined without relying upon the client to provide
-//! this information.
-//!
-//! \return Returns the number of bytes of data read.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDPacketRead(void *pvHIDInstance, uint8_t *pi8Data, uint32_t ui32Length,
- bool bLast)
-{
- uint32_t ui32EPStatus, ui32Count, ui32Pkt;
- tHIDInstance *psInst;
- int32_t i32Retcode;
-
- ASSERT(pvHIDInstance);
-
- //
- // Get our instance data pointer
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // How many bytes are available for us to receive?
- //
- ui32Pkt = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- //
- // Get as much data as we can.
- //
- ui32Count = ui32Length;
- i32Retcode = MAP_USBEndpointDataGet(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint,
- pi8Data, &ui32Count);
-
- //
- // Did we read the last of the packet data?
- //
- if(ui32Count == ui32Pkt)
- {
- //
- // Clear the endpoint status so that we know no packet is
- // waiting.
- //
- MAP_USBDevEndpointStatusClear(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint,
- ui32EPStatus);
-
- //
- // Acknowledge the data, thus freeing the host to send the
- // next packet.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint, true);
-
- //
- // Clear the flag we set to indicate that a packet read is
- // pending.
- //
- SetDeferredOpFlag(&psInst->ui16DeferredOpFlags,
- HID_DO_PACKET_RX, false);
- }
-
- //
- // If all went well, tell the caller how many bytes they got.
- //
- if(i32Retcode != -1)
- {
- return(ui32Count);
- }
- }
-
- //
- // No packet was available or an error occurred while reading so tell
- // the caller no bytes were returned.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! Returns the number of free bytes in the transmit buffer.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//!
-//! This function indicates to the caller whether or not it is safe to send a
-//! new report using a call to USBDHIDReportWrite(). The value returned will
-//! be the maximum USB packet size (\b USBDHID_MAX_PACKET) if no transmission
-//! is currently outstanding or 0 if a transmission is in progress. Since the
-//! function USBDHIDReportWrite() can accept full reports longer than a single
-//! USB packet, the caller should be aware that the returned value from this
-//! class driver, unlike others, does not indicate the maximum size of report
-//! that can be written but is merely an indication that another report can be
-//! written.
-//!
-//! \return Returns 0 if an outgoing report is still being transmitted or
-//! \b USBDHID_MAX_PACKET if no transmission is currently in progress.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDTxPacketAvailable(void *pvHIDInstance)
-{
- tHIDInstance *psInst;
-
- ASSERT(pvHIDInstance);
-
- //
- // Get our instance data pointer.
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Do we have a packet transmission currently ongoing?
- //
- if(psInst->iHIDTxState != eHIDStateIdle)
- {
- //
- // We are not ready to receive a new packet so return 0.
- //
- return(0);
- }
- else
- {
- //
- // We can receive a packet so return the max packet size for the
- // relevant endpoint.
- //
- return(USBDHID_MAX_PACKET);
- }
-}
-
-//*****************************************************************************
-//
-//! Determines whether a packet is available and, if so, the size of the
-//! buffer required to read it.
-//!
-//! \param pvHIDInstance is the pointer to the device instance structure as
-//! returned by USBDHIDInit().
-//!
-//! This function may be used to determine if a received packet remains to be
-//! read and allows the application to determine the buffer size needed to
-//! read the data.
-//!
-//! \return Returns 0 if no received packet remains unprocessed or the
-//! size of the packet if a packet is waiting to be read.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDRxPacketAvailable(void *pvHIDInstance)
-{
- uint32_t ui32EPStatus, ui32Size;
- tHIDInstance *psInst;
-
- ASSERT(pvHIDInstance);
-
- //
- // Get our instance data pointer
- //
- psInst = &((tUSBDHIDDevice *)pvHIDInstance)->sPrivateData;
-
- //
- // Does the relevant endpoint FIFO have a packet waiting for us?
- //
- ui32EPStatus = MAP_USBEndpointStatus(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
- if(ui32EPStatus & USB_DEV_RX_PKT_RDY)
- {
- //
- // Yes - a packet is waiting. How big is it?
- //
- ui32Size = MAP_USBEndpointDataAvail(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint);
-
- return(ui32Size);
- }
- else
- {
- //
- // There is no packet waiting to be received.
- //
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus- or self-powered) to the USB library.
-//!
-//! \param pvHIDInstance is the pointer to the HID device instance structure.
-//! \param ui8Power indicates the current power status, either
-//! \b USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus- or self-powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the USB library to allow correct responses to be provided
-//! when the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDPowerStatusSet(void *pvHIDInstance, uint8_t ui8Power)
-{
- ASSERT(pvHIDInstance);
-
- //
- // Pass the request through to the lower layer.
- //
- USBDCDPowerStatusSet(0, ui8Power);
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wake up to resume communication when in suspended state.
-//!
-//! \param pvHIDInstance is the pointer to the HID device instance structure.
-//!
-//! When the bus is suspended, an application which supports remote wake up
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wake up signaling to the host. If the remote
-//! wake up feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wake up,
-//! \b false will be returned to indicate that the wake up request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wake up is not disabled and the
-//! signaling was started or \b false if remote wake up is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDHIDRemoteWakeupRequest(void *pvHIDInstance)
-{
- ASSERT(pvHIDInstance);
-
- //
- // Pass the request through to the lower layer.
- //
- return(USBDCDRemoteWakeupRequest(0));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.h
deleted file mode 100644
index 58d55c2c1..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhid.h
+++ /dev/null
@@ -1,1088 +0,0 @@
-//*****************************************************************************
-//
-// usbdhid.h - Definitions used by HID class devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDHID_H__
-#define __USBDHID_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup hid_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8HIDInterface array in bytes.
-//
-//*****************************************************************************
-#define HIDINTERFACE_SIZE (9)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8HIDInEndpoint array in bytes.
-//
-//*****************************************************************************
-#define HIDINENDPOINT_SIZE (7)
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8HIDOutEndpoint array in bytes.
-//
-//*****************************************************************************
-#define HIDOUTENDPOINT_SIZE (7)
-
-//*****************************************************************************
-//
-// This is the size of the tHIDDescriptor in bytes.
-//
-//*****************************************************************************
-#define HIDDESCRIPTOR_SIZE (9)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the USB HID Device.
-//! This does not include the configuration descriptor which is automatically
-//! ignored by the composite device class.
-//
-//*****************************************************************************
-#define COMPOSITE_DHID_SIZE (HIDINTERFACE_SIZE + HIDINENDPOINT_SIZE + \
- HIDOUTENDPOINT_SIZE + HIDDESCRIPTOR_SIZE)
-
-//*****************************************************************************
-//
-// Macros used to create the static Report Descriptors.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Usage Page entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the Usage Page value.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage Page entry
-//! into a HID report structure. These are defined by the USB HID
-//! specification.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UsagePage(ui8Value) 0x05, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Usage Page entries in HID report
-//! descriptors when a vendor-specific value is to be used.
-//!
-//! \param ui8Value is the Usage Page value.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage Page entry
-//! into a HID report structure. These are defined by the USB HID
-//! specification. Vendor-specific values must lie in the range 0xFF00 to
-//! 0xFFFF inclusive.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UsagePageVendor(ui16Value) 0x06, ((ui16Value) & 0xFF), \
- (((ui16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Usage entries in HID report descriptors.
-//!
-//! \param ui8Value is the Usage value.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage entry into
-//! a HID report structure. These are defined by the USB HID specification.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Usage(ui8Value) 0x09, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding vendor-specific Usage entries in HID
-//! report descriptors.
-//!
-//! \param ui16Value is the vendor-specific Usage value in the range 0xFF00 to
-//! 0xFFFF.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage entry into
-//! a HID report structure. These are defined by the USB HID specification.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UsageVendor(ui16Value) 0x0A, ((ui16Value) & 0xFF), \
- (((ui16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Usage Minimum entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the Usage Minimum value.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage Minimum
-//! entry into a HID report structure. This is the first or minimum value
-//! associated with a usage value.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UsageMinimum(ui8Value) 0x19, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Usage Maximum entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the Usage Maximum value.
-//!
-//! This macro takes a value and prepares it to be placed as a Usage Maximum
-//! entry into a HID report structure. This is the last or maximum value
-//! associated with a usage value.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UsageMaximum(ui8Value) 0x29, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Logical Minimum entries in HID report
-//! descriptors.
-//!
-//! \param i8Value is the Logical Minimum value.
-//!
-//! This macro takes a value and prepares it to be placed as a Logical Minimum
-//! entry into a HID report structure. This is the actual minimum value for a
-//! range of values associated with a field.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define LogicalMinimum(i8Value) 0x15, ((i8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Logical Maximum entries in HID report
-//! descriptors.
-//!
-//! \param i8Value is the Logical Maximum value.
-//!
-//! This macro takes a value and prepares it to be placed as a Logical Maximum
-//! entry into a HID report structure. This is the actual maximum value for a
-//! range of values associated with a field.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define LogicalMaximum(i8Value) 0x25, ((i8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Physical Minimum entries in HID report
-//! descriptors.
-//!
-//! \param i16Value is the Physical Minimum value. It is a signed, 16 bit
-//! number.
-//!
-//! This macro takes a value and prepares it to be placed as a Physical Minimum
-//! entry into a HID report structure. This is value is used in conversion of
-//! the control logical value, as returned to the host in the relevant report,
-//! to a physical measurement in the appropriate units.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define PhysicalMinimum(i16Value) \
- 0x36, ((i16Value) & 0xFF), \
- (((i16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Physical Maximum entries in HID report
-//! descriptors.
-//!
-//! \param i16Value is the Physical Maximum value. It is a signed, 16 bit
-//! number.
-//!
-//! This macro takes a value and prepares it to be placed as a Physical Maximum
-//! entry into a HID report structure. This is value is used in conversion of
-//! the control logical value, as returned to the host in the relevant report,
-//! to a physical measurement in the appropriate units.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define PhysicalMaximum(i16Value) \
- 0x46, ((i16Value) & 0xFF), \
- (((i16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Collection entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the type of Collection.
-//!
-//! This macro takes a value and prepares it to be placed as a Collection
-//! entry into a HID report structure. This is the type of values that are
-//! being grouped together, for instance input, output or features can be
-//! grouped together as a collection.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Collection(ui8Value) 0xa1, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding End Collection entries in HID report
-//! descriptors.
-//!
-//! This macro can be used to place an End Collection entry into a HID report
-//! structure. This is a tag to indicate that a collection of entries has
-//! ended in the HID report structure. This terminates a previous Collection()
-//! entry.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define EndCollection 0xc0
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Report Count entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the number of items in a report item.
-//!
-//! This macro takes a value and prepares it to be placed as a Report Count
-//! entry into a HID report structure. This is number of entries of Report
-//! Size for a given item.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define ReportCount(ui8Value) 0x95, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Report ID entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the identifier prefix for the current report.
-//!
-//! This macro takes a value and prepares it to be placed as a Report ID
-//! entry into a HID report structure. This value is used as a 1 byte prefix
-//! for the report it is contained within.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define ReportID(ui8Value) 0x85, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Report Size entries in HID report
-//! descriptors.
-//!
-//! \param ui8Value is the size, in bits, of items in a report item.
-//!
-//! This macro takes a value and prepares it to be placed as a Report Size
-//! entry into a HID report structure. This is size in bits of the entries of
-//! of a report entry. The Report Count specifies how many entries of Report
-//! Size are in a given item. These can be individual bits or bit fields.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define ReportSize(ui8Value) 0x75, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Input entries in HID report descriptors.
-//!
-//! \param ui8Value is bit mask to specify the type of a set of input report
-//! items. Note that if the USB_HID_INPUT_BITF flag is required, the Input2
-//! macro (which uses a 2 byte version of the Input item tag) must be used
-//! instead of this macro.
-//!
-//! This macro takes a value and prepares it to be placed as an Input entry
-//! into a HID report structure. This specifies the type of an input item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of input for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Input(ui8Value) 0x81, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Input entries in HID report descriptors.
-//!
-//! \param ui16Value is bit mask to specify the type of a set of input report
-//! items. Note that this macro uses a version of the Input item tag with a
-//! two byte payload and allows any of the 8 possible data bits for the tag to
-//! be used. If USB_HID_INPUT_BITF (bit 8) is not required, the Input macro
-//! may be used instead.
-//!
-//! This macro takes a value and prepares it to be placed as an Input entry
-//! into a HID report structure. This specifies the type of an input item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of input for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Input2(ui16Value) 0x82, ((ui16Value) & 0xff), \
- (((ui16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Feature entries in HID report descriptors.
-//!
-//! \param ui8Value is bit mask to specify the type of a set of feature report
-//! items. Note that if the USB_HID_FEATURE_BITF flag is required, the
-//! Feature2 macro (which uses a 2 byte version of the Feature item tag) must
-//! be used instead of this macro.
-//!
-//! This macro takes a value and prepares it to be placed as a Feature entry
-//! into a HID report structure. This specifies the type of a feature item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of feature for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Feature(ui8Value) 0xB1, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Feature entries in HID report descriptors.
-//!
-//! \param ui16Value is bit mask to specify the type of a set of feature report
-//! items. Note that this macro uses a version of the Feature item tag with a
-//! two byte payload and allows any of the 8 possible data bits for the tag to
-//! be used. If USB_HID_FEATURE_BITF (bit 8) is not required, the Feature
-//! macro may be used instead.
-//!
-//! This macro takes a value and prepares it to be placed as a Feature entry
-//! into a HID report structure. This specifies the type of a feature item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of feature for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Feature2(ui16Value) 0xB2, ((ui16Value) & 0xff), \
- (((ui16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Output entries in HID report descriptors.
-//!
-//! \param ui8Value is bit mask to specify the type of a set of output report
-//! items. Note that if the USB_HID_OUTPUT_BITF flag is required, the Output2
-//! macro (which uses a 2 byte version of the Output item tag) must be used
-//! instead of this macro.
-//!
-//! This macro takes a value and prepares it to be placed as an Output entry
-//! into a HID report structure. This specifies the type of an output item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of output for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Output(ui8Value) 0x91, ((ui8Value) & 0xff)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Output entries in HID report descriptors.
-//!
-//! \param ui16Value is bit mask to specify the type of a set of output report
-//! items. Note that this macro uses a version of the Output item tag with a
-//! two byte payload and allows any of the 8 possible data bits for the tag to
-//! be used. If USB_HID_OUTPUT_BITF (bit 8) is not required, the Output macro
-//! may be used instead.
-//!
-//! This macro takes a value and prepares it to be placed as an Output entry
-//! into a HID report structure. This specifies the type of an output item in
-//! a report structure. These refer to a bit mask of flags that indicate the
-//! type of output for a set of items.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Output2(ui16Value) 0x92, ((ui16Value) & 0xff), \
- (((ui16Value) >> 8) & 0xFF)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Unit Exponent entries in HID report
-//! descriptors.
-//!
-//! \param i8Value is the required exponent in the range [-8, 7].
-//!
-//! This macro takes a value and prepares it to be placed as a Unit Exponent
-//! entry into a HID report structure. This is the exponent applied to
-//! PhysicalMinimum and PhysicalMaximum when scaling and converting control
-//! values to "real" units.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define UnitExponent(i8Value) 0x55, ((i8Value) & 0x0f)
-
-//*****************************************************************************
-//
-//! This is a macro to assist adding Unit entries for uncommon units in HID
-//! report descriptors.
-//!
-//! \param ui32Value is the definition of the unit required as defined in
-//! section 6.2.2.7 of the USB HID device class definition document.
-//!
-//! This macro takes a value and prepares it to be placed as a Unit entry into
-//! a HID report structure. Note that individual macros are defined for common
-//! units and this macro is intended for use when a complex or uncommon unit
-//! is needed. It allows entry of a 5 nibble unit definition into the report
-//! descriptor.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define Unit(ui32Value) 0x67, (ui32Value) & 0x0f), \
- (((ui32Value) >> 8) & 0xFF), \
- (((ui32Value) >> 16) & 0xFF), \
- (((ui32Value) >> 24) & 0xFF)
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for centimeters into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitDistance_cm 0x66, 0x11, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for inches into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitDistance_i 0x66, 0x13, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for degrees into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitRotation_deg 0x66, 0x14, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for radians into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitRotation_rad 0x66, 0x12, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for grams into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitMass_g 0x66, 0x01, 0x01
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for seconds into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitTime_s 0x66, 0x01, 0x10
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for temperature in Kelvin into a report
-//! descriptor.
-//!
-//*****************************************************************************
-#define UnitTemp_K 0x67, 0x01, 0x00, 0x01, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for temperature in Fahrenheit into a report
-//! descriptor.
-//!
-//*****************************************************************************
-#define UnitTemp_F 0x67, 0x03, 0x00, 0x01, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for velocity in cm/s into a report
-//! descriptor.
-//!
-//*****************************************************************************
-#define UnitVelocitySI 0x66, 0x11, 0xF0
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for momentum in (grams * cm)/s into a
-//! report descriptor.
-//!
-//*****************************************************************************
-#define UnitMomentumSI 0x66, 0x11, 0xF1
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for acceleration in cm/s**2 into a
-//! report descriptor.
-//!
-//*****************************************************************************
-#define UnitAccelerationSI 0x66, 0x11, 0xE0
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for force in (cm * grams)/s**2 into a
-//! report descriptor.
-//!
-//*****************************************************************************
-#define UnitForceSI 0x66, 0x11, 0xE1
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for energy in (grams * cm**2)/s**2 into a
-//! report descriptor.
-//!
-//*****************************************************************************
-#define UnitEnergySI 0x66, 0x21, 0xE1
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for angular acceleration in degrees/s**2
-//! into a report descriptor.
-//!
-//*****************************************************************************
-#define UnitAngAccelerationSI 0x66, 0x12, 0xE0
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for voltage into a a report descriptor.
-//!
-//*****************************************************************************
-#define UnitVoltage 0x67, 0x21, 0xD1, 0xF0, 0x00
-
-//*****************************************************************************
-//
-//! This macro inserts a Unit entry for voltage into a a report descriptor.
-//!
-//*****************************************************************************
-#define UnitCurrent_A 0x67, 0x01, 0x00, 0x10, 0x00
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The first few sections of this header are private defines that are used by
-// the USB HID code and are here only to help with the application
-// allocating the correct amount of memory for the HID device code.
-//
-//*****************************************************************************
-#define USBDHID_MAX_PACKET 64
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This enumeration holds the various states that the device can be in during
-// normal operation.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // Unconfigured.
- //
- eHIDStateUnconfigured,
-
- //
- // No outstanding transaction remains to be completed.
- //
- eHIDStateIdle,
-
- //
- // Waiting on completion of a send or receive transaction.
- //
- eHIDStateWaitData
-}
-tHIDState;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for
-// HID devices. The memory for this structure is included in the
-// sPrivateData field in the tUSBDHIDDevice structure passed in the
-// USBDHIDInit() function.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // The state of the HID receive channel.
- //
- volatile tHIDState iHIDRxState;
-
- //
- // The state of the HID transmit channel.
- //
- volatile tHIDState iHIDTxState;
-
- //
- // State of any pending operations that could not be handled immediately
- // upon receipt.
- //
- volatile uint16_t ui16DeferredOpFlags;
-
- //
- // Size of the HID IN report.
- //
- uint16_t ui16InReportSize;
-
- //
- // .
- //
- uint16_t ui16InReportIndex;
-
- //
- // Size of the HID OUT report.
- //
- uint16_t ui16OutReportSize;
-
- //
- // Pointer to the current HID IN report data.
- //
- uint8_t *pui8InReportData;
-
- //
- // Pointer to the current HID OUT report data.
- //
- uint8_t *pui8OutReportData;
-
- //
- // The connection status of the device.
- //
- volatile bool bConnected;
-
- //
- // Whether an IN transaction is in process.
- //
- volatile bool bSendInProgress;
-
- //
- // An HID request transaction is in process(Endpoint 0).
- //
- bool bGetRequestPending;
-
- //
- // The IN endpoint number, this is modified in composite devices.
- //
- uint8_t ui8INEndpoint;
-
- //
- // The OUT endpoint number, this is modified in composite devices.
- //
- uint8_t ui8OUTEndpoint;
-
- //
- // The bulk class interface number, this is modified in composite devices.
- //
- uint8_t ui8Interface;
-}
-tHIDInstance;
-
-//*****************************************************************************
-//
-//! The structure used to track idle time for reports. An array of these
-//! structures is passed to the HID device class driver during USBDHIDInit and
-//! is used to track automatic resending of each report (if not disabled by
-//! the host).
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The idle duration for the report expressed in units of 4mS. 0
- //! indicates infinite and informs the class driver not to send the report
- //! unless a state change occurs.
- //
- uint8_t ui8Duration4mS;
-
- //
- //! The ID of the report which this structure applies to. This is the
- //! report ID as specified using a ReportID tag in the report descriptor
- //! rather than the index of the report in the HID class descriptor array.
- //! If only a single Input report is supported and, thus, no ReportID tag
- //! is present, this field should be set to 0.
- //
- uint8_t ui8ReportID;
-
- //
- //! The number of milliseconds before we need to send a copy of a given
- //! report back to the host. This field is updated by the HID driver and
- //! used to time sending of USBD_HID_EVENT_IDLE_TIMEOUT.
- //
- uint16_t ui16TimeTillNextmS;
-
- //
- //! The number of milliseconds that have passed since the last time this
- //! report was sent. The HID class driver needs to track this since
- //! Set_Idle requests are required to take effect as if issued immediately
- //! after the last transmission of the report to which they refer.
- //
- uint32_t ui32TimeSinceReportmS;
-}
-tHIDReportIdle;
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the HID device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- uint8_t ui8PwrAttributes;
-
- //
- //! The interface subclass to publish to the server for this HID device.
- //
- uint8_t ui8Subclass;
-
- //
- //! The interface protocol to publish to the server for this HID device.
- //
- uint8_t ui8Protocol;
-
- //
- //! The number of Input reports that this device supports. This field
- //! must equal the number of reports published in the HID class descriptors
- //! for the device and also the number of entries in the array whose first
- //! element is pointed to by field pi16ReportIdle below.
- //
- uint8_t ui8NumInputReports;
-
- //
- //! A pointer to the first element in an array of structures used to track
- //! idle time for each Input report. When USBDHIDInit is called, the
- //! ui8Duration4mS and ui8ReportID fields of each of these array members
- //! should be initialized to indicate the default idle timeout for each
- //! input report. This array must be in RAM since the HID device class
- //! driver will update values in it in response to requests from the host
- //! and to track elapsed time. The number of elements in the array must
- //! match the number supplied in the ui8NumInputReports field above.
- //
- tHIDReportIdle *psReportIdle;
-
- //! A pointer to the callback function which will be called to notify
- //! the application of general events, events related to report transfers
- //! on endpoint zero and events related to reception of Output and Feature
- //! reports via the (optional) interrupt OUT endpoint.
- //
- tUSBCallback pfnRxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the receive channel callback,
- //! pfnRxCallback.
- //
- void *pvRxCBData;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events related to transmission of Input reports
- //! via the interrupt IN endpoint.
- //
- tUSBCallback pfnTxCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the transmit channel callback,
- //! pfnTxCallback.
- //
- void *pvTxCBData;
-
- //
- //! If set to true, this field indicates that the device should use a
- //! dedicated interrupt OUT endpoint to receive reports from the host. In
- //! this case, reports from the host are passed to the application via the
- //! receive callback using USB_EVENT_RX_AVAILABLE events. If false,
- //! reports from the host are received via endpoint zero and passed to the
- //! application via USBD_HID_EVENT_REPORT_SENT events.
- //
- bool bUseOutEndpoint;
-
- //
- //! The HID descriptor that the device is to publish (following the
- //! standard interface descriptor and prior to the endpoint descriptors for
- //! the interface).
- //
- const tHIDDescriptor *psHIDDescriptor;
-
- //
- //! The HID class descriptors offered by the device are defined in an
- //! array of byte pointers and this field points to that array. The
- //! order and number of elements in the array must match the associated
- //! information provided in the HID descriptor in field by
- //! pi16HIDDescriptor.
- //
- const uint8_t * const *ppui8ClassDescriptors;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1),HID
- //! Interface description string (language 1), Configuration description
- //! string (language 1), (optionally) First HID device-specific string
- //! (language 1), (optionally) Second HID device-specific string (language
- //! 1), etc.
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //!
- //! The number of HID device-specific strings is dependent upon the content
- //! of the report descriptor passed to the interface and is, thus,
- //! application controlled.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + ((5 + (num HID strings)) * (num languages)).
- //
- uint32_t ui32NumStringDescriptors;
-
- //
- // ! The configuration descriptor for this HID device.
- //
- const tConfigHeader * const *ppsConfigDescriptor;
-
- //
- //! The private instance data for this device instance. This
- //! memory must remain accessible for as long as the HID device is in
- //! use and must not be modified by any code outside the HID class driver.
- //
- tHIDInstance sPrivateData;
-}
-tUSBDHIDDevice;
-
-//*****************************************************************************
-//
-// HID-specific device class driver events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This event indicates that the host is requesting a particular report be
-//! returned via endpoint 0, the control endpoint. The ui32MsgValue parameter
-//! contains the requested report type in the high byte and report ID in the
-//! low byte (as passed in the wValue field of the USB request structure).
-//! The pvMsgData parameter contains a pointer which must be written with the
-//! address of the first byte of the requested report. The callback must
-//! return the size in bytes of the report pointed to by *pvMsgData. The
-//! memory returned in response to this event must remain unaltered until
-//! USBD_HID_EVENT_REPORT_SENT is sent.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_GET_REPORT \
- (USBD_HID_EVENT_BASE + 0)
-
-//*****************************************************************************
-//
-//! This event indicates that a report previously requested via a
-//! USBD_HID_EVENT_GET_REPORT has been successfully transmitted to the host.
-//! The application may now free or reuse the report memory passed on the
-//! previous event. Although this would seem to be an event that would be
-//! passed to the transmit channel callback, it is actually passed to the
-//! receive channel callback. This ensures that all events related to the
-//! request and transmission of reports via endpoint zero can be handled in
-//! a single function.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_REPORT_SENT \
- (USBD_HID_EVENT_BASE + 1)
-
-//*****************************************************************************
-//
-//! This event indicates that the host has sent a Set_Report request to
-//! the device and requests that the device provide a buffer into which the
-//! report can be written. The ui32MsgValue parameter contains the received
-//! report type in the high byte and report ID in the low byte (as passed in
-//! the wValue field of the USB request structure). The pvMsgData parameter
-//! contains the length of buffer requested. Note that this is the actual
-//! length value cast to a "void *" type and not a pointer in this case.
-//! The callback must return a pointer to a suitable buffer (cast to the
-//! standard "uint32_t" return type for the callback).
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_GET_REPORT_BUFFER \
- (USBD_HID_EVENT_BASE + 2)
-
-//*****************************************************************************
-//
-//! This event indicates that the host has sent the device a report via
-//! endpoint 0, the control endpoint. The ui32MsgValue field indicates the
-//! size of the report and pvMsgData points to the first byte of the report.
-//! The report buffer will previously have been returned in response to an
-//! earlier USBD_HID_EVENT_GET_REPORT_BUFFER callback. The HID device class
-//! driver will not access the memory pointed to by pvMsgData after this
-//! callback is made so the application is free to reuse or free it at this
-//! point.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_SET_REPORT \
- (USBD_HID_EVENT_BASE + 3)
-
-//*****************************************************************************
-//
-//! This event is sent in response to a Get_Protocol request from the host.
-//! The callback should provide the current protocol via the return code,
-//! USB_HID_PROTOCOL_BOOT or USB_HID_PROTOCOL_REPORT.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_GET_PROTOCOL \
- (USBD_HID_EVENT_BASE + 4)
-
-//*****************************************************************************
-//
-//! This event is sent in response to a Set_Protocol request from the host.
-//! The ui32MsgData value will contain the requested protocol,
-//! USB_HID_PROTOCOL_BOOT or USB_HID_PROTOCOL_REPORT.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_SET_PROTOCOL \
- (USBD_HID_EVENT_BASE + 5)
-
-//*****************************************************************************
-//
-//! This event indicates to an application that a report idle timeout has
-//! occurred and requests a pointer to the report that must be sent back to
-//! the host. The ui32MsgData value will contain the requested report ID and
-//! pvMsgData contains a pointer that must be written with a pointer to the
-//! report data that is to be sent. The callback must return the number of
-//! bytes in the report pointed to by *pvMsgData.
-//
-//*****************************************************************************
-#define USBD_HID_EVENT_IDLE_TIMEOUT \
- (USBD_HID_EVENT_BASE + 6)
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDHIDInit(uint32_t ui32Index, tUSBDHIDDevice *psHIDDevice);
-extern void *USBDHIDCompositeInit(uint32_t ui32Index,
- tUSBDHIDDevice *psDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDHIDTerm(void *pvHIDInstance);
-extern void *USBDHIDSetRxCBData(void *pvHIDInstance, void *pvCBData);
-extern void *USBDHIDSetTxCBData(void *pvHIDInstance, void *pvCBData);
-extern uint32_t USBDHIDReportWrite(void *pvHIDInstance, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDHIDPacketRead(void *pvHIDInstance, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-extern uint32_t USBDHIDTxPacketAvailable(void *pvHIDInstance);
-extern uint32_t USBDHIDRxPacketAvailable(void *pvHIDInstance);
-extern void USBDHIDPowerStatusSet(void *pvHIDInstance, uint8_t ui8Power);
-extern bool USBDHIDRemoteWakeupRequest(void *pvHIDInstance);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDHID_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.c
deleted file mode 100644
index f963b6cbe..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.c
+++ /dev/null
@@ -1,1316 +0,0 @@
-//*****************************************************************************
-//
-// usbdhidkeyb.c - USB HID Keyboard device class driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/usbhid.h"
-#include "usblib/device/usbdhid.h"
-#include "usblib/device/usbdhidkeyb.h"
-
-//*****************************************************************************
-//
-//! \addtogroup hid_keyboard_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// HID device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-static uint8_t g_pui8KeybDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(34), // The total size of this full structure.
- 1, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 5, // The string identifier that describes this
- // configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// The remainder of the configuration descriptor is stored in flash since we
-// don't need to modify anything in it at runtime.
-//
-//*****************************************************************************
-static uint8_t g_pui8HIDInterface[HIDINTERFACE_SIZE] =
-{
- //
- // HID Device Class Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- 0, // The index for this interface.
- 0, // The alternate setting for this interface.
- 1, // The number of endpoints used by this
- // interface.
- USB_CLASS_HID, // The interface class
- USB_HID_SCLASS_BOOT, // The interface sub-class.
- USB_HID_PROTOCOL_KEYB, // The interface protocol for the sub-class
- // specified above.
- 4, // The string index for this interface.
-};
-
-static const uint8_t g_pui8HIDInEndpoint[HIDINENDPOINT_SIZE] =
-{
- //
- // Interrupt IN endpoint descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(USB_EP_1),
- USB_EP_ATTR_INT, // Endpoint is an interrupt endpoint.
- USBShort(USBFIFOSizeToBytes(USB_FIFO_SZ_64)),
- // The maximum packet size.
- 16, // The polling interval for this endpoint.
-};
-
-static const uint8_t g_pui8HIDOutEndpoint[HIDOUTENDPOINT_SIZE] =
-{
- //
- // Interrupt OUT endpoint descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_OUT | USBEPToIndex(USB_EP_2),
- USB_EP_ATTR_INT, // Endpoint is an interrupt endpoint.
- USBShort(USBFIFOSizeToBytes(USB_FIFO_SZ_64)),
- // The maximum packet size.
- 16, // The polling interval for this endpoint.
-};
-
-//*****************************************************************************
-//
-// The following is the HID report structure definition that is passed back
-// to the host.
-//
-//*****************************************************************************
-static const uint8_t g_pui8KeybReportDescriptor[] =
-{
- UsagePage(USB_HID_GENERIC_DESKTOP),
- Usage(USB_HID_KEYBOARD),
- Collection(USB_HID_APPLICATION),
-
- //
- // Modifier keys.
- // 8 - 1 bit values indicating the modifier keys (ctrl, shift...)
- //
- ReportSize(1),
- ReportCount(8),
- UsagePage(USB_HID_USAGE_KEYCODES),
- UsageMinimum(224),
- UsageMaximum(231),
- LogicalMinimum(0),
- LogicalMaximum(1),
- Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE | USB_HID_INPUT_ABS),
-
- //
- // One byte of rsvd data required by HID spec.
- //
- ReportCount(1),
- ReportSize(8),
- Input(USB_HID_INPUT_CONSTANT),
-
- //
- // Keyboard LEDs.
- // 5 - 1 bit values.
- //
- ReportCount(5),
- ReportSize(1),
- UsagePage(USB_HID_USAGE_LEDS),
- UsageMinimum(1),
- UsageMaximum(5),
- Output(USB_HID_OUTPUT_DATA | USB_HID_OUTPUT_VARIABLE |
- USB_HID_OUTPUT_ABS),
- //
- // 1 - 3 bit value to pad out to a full byte.
- //
- ReportCount(1),
- ReportSize(3),
- Output(USB_HID_OUTPUT_CONSTANT), //LED report padding
-
- //
- // The Key buffer.
- // 6 - 8 bit values to store the current key state.
- //
- ReportCount(6),
- ReportSize(8),
- LogicalMinimum(0),
- LogicalMaximum(101),
- UsagePage(USB_HID_USAGE_KEYCODES),
- UsageMinimum (0),
- UsageMaximum (101),
- Input(USB_HID_INPUT_DATA | USB_HID_INPUT_ARRAY),
- EndCollection
-};
-
-//*****************************************************************************
-//
-// The HID descriptor for the keyboard device.
-//
-//*****************************************************************************
-static const tHIDDescriptor g_sKeybHIDDescriptor =
-{
- 9, // bLength
- USB_HID_DTYPE_HID, // bDescriptorType
- 0x111, // bcdHID (version 1.11 compliant)
- 0, // bCountryCode (not localized)
- 1, // bNumDescriptors
- {
- {
- USB_HID_DTYPE_REPORT, // Report descriptor
- sizeof(g_pui8KeybReportDescriptor)
- // Size of report descriptor
- }
- }
-};
-
-//*****************************************************************************
-//
-// The HID configuration descriptor is defined as four or five sections
-// depending upon the client's configuration choice. These sections are:
-//
-// 1. The 9 byte configuration descriptor (RAM).
-// 2. The interface descriptor (RAM).
-// 3. The HID report and physical descriptors (provided by the client)
-// (FLASH).
-// 4. The mandatory interrupt IN endpoint descriptor (FLASH).
-// 5. The optional interrupt OUT endpoint descriptor (FLASH).
-//
-//*****************************************************************************
-static const tConfigSection g_sHIDConfigSection =
-{
- sizeof(g_pui8KeybDescriptor),
- g_pui8KeybDescriptor
-};
-
-static const tConfigSection g_sHIDInterfaceSection =
-{
- sizeof(g_pui8HIDInterface),
- g_pui8HIDInterface
-};
-
-static const tConfigSection g_sHIDInEndpointSection =
-{
- sizeof(g_pui8HIDInEndpoint),
- g_pui8HIDInEndpoint
-};
-
-static const tConfigSection g_sHIDOutEndpointSection =
-{
- sizeof(g_pui8HIDOutEndpoint),
- g_pui8HIDOutEndpoint
-};
-
-//*****************************************************************************
-//
-// Place holder for the user's HID descriptor block.
-//
-//*****************************************************************************
-static tConfigSection g_sHIDDescriptorSection =
-{
- sizeof(g_sKeybHIDDescriptor),
- (const uint8_t *)&g_sKeybHIDDescriptor
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete HID configuration descriptor.
-//
-//*****************************************************************************
-static const tConfigSection *g_psHIDSections[] =
-{
- &g_sHIDConfigSection,
- &g_sHIDInterfaceSection,
- &g_sHIDDescriptorSection,
- &g_sHIDInEndpointSection,
- &g_sHIDOutEndpointSection
-};
-
-#define NUM_HID_SECTIONS ((sizeof(g_psHIDSections) / \
- sizeof(g_psHIDSections[0])) - 1)
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor. Note that this must be
-// in RAM since we need to include or exclude the final section based on
-// client supplied initialization parameters.
-//
-//*****************************************************************************
-static tConfigHeader g_sHIDConfigHeader =
-{
- NUM_HID_SECTIONS,
- g_psHIDSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-static const tConfigHeader * const g_ppsHIDConfigDescriptors[] =
-{
- &g_sHIDConfigHeader
-};
-
-//*****************************************************************************
-//
-// The HID class descriptor table. For the keyboard class, we have only a
-// single report descriptor.
-//
-//*****************************************************************************
-static const uint8_t * const g_pui8KeybClassDescriptors[] =
-{
- g_pui8KeybReportDescriptor
-};
-
-//*****************************************************************************
-//
-// Forward references for keyboard device callback functions.
-//
-//*****************************************************************************
-static uint32_t HIDKeyboardRxHandler(void *pvKeyboardDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData);
-static uint32_t HIDKeyboardTxHandler(void *pvKeyboardDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData);
-
-//*****************************************************************************
-//
-// Main HID device class event handler function.
-//
-// \param pvKeyboardDevice is the event callback pointer provided during
-// USBDHIDInit().This is a pointer to our HID device structure
-// (&g_sHIDKeybDevice).
-// \param ui32Event identifies the event we are being called back for.
-// \param ui32MsgData is an event-specific value.
-// \param pvMsgData is an event-specific pointer.
-//
-// This function is called by the HID device class driver to inform the
-// application of particular asynchronous events related to operation of the
-// keyboard HID device.
-//
-// \return Returns a value which is event-specific.
-//
-//*****************************************************************************
-static uint32_t
-HIDKeyboardRxHandler(void *pvKeyboardDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData)
-{
- tHIDKeyboardInstance *psInst;
- tUSBDHIDKeyboardDevice *psKeyboardDevice;
-
- //
- // Make sure we did not get a NULL pointer.
- //
- ASSERT(pvKeyboardDevice);
-
- //
- // Get a pointer to our instance data
- //
- psKeyboardDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
- psInst = &psKeyboardDevice->sPrivateData;
-
- //
- // Which event were we sent?
- //
- switch (ui32Event)
- {
- //
- // The host has connected to us and configured the device.
- //
- case USB_EVENT_CONNECTED:
- {
- psInst->ui8USBConfigured = true;
-
- //
- // Pass the information on to the client.
- //
- psKeyboardDevice->pfnCallback(psKeyboardDevice->pvCBData,
- USB_EVENT_CONNECTED, 0, (void *)0);
-
- break;
- }
-
- //
- // The host has disconnected from us.
- //
- case USB_EVENT_DISCONNECTED:
- {
- psInst->ui8USBConfigured = false;
-
- //
- // Pass the information on to the client.
- //
- psKeyboardDevice->pfnCallback(psKeyboardDevice->pvCBData,
- USB_EVENT_DISCONNECTED, 0,
- (void *)0);
-
- break;
- }
-
- //
- // The host is polling us for a particular report and the HID driver
- // is asking for the latest version to transmit.
- //
- case USBD_HID_EVENT_IDLE_TIMEOUT:
- case USBD_HID_EVENT_GET_REPORT:
- {
- //
- // We only support a single input report so we don't need to check
- // the ui32MsgValue parameter in this case. Set the report pointer
- // in *pvMsgData and return the length of the report in bytes.
- //
- *(uint8_t **)pvMsgData = psInst->pui8Report;
- return(KEYB_IN_REPORT_SIZE);
- }
-
- //
- // The device class driver has completed sending a report to the
- // host in response to a Get_Report request.
- //
- case USBD_HID_EVENT_REPORT_SENT:
- {
- //
- // We have nothing to do here.
- //
- break;
- }
-
- //
- // This event is sent in response to a host Set_Report request. We
- // must return a pointer to a buffer large enough to receive the
- // report into.
- //
- case USBD_HID_EVENT_GET_REPORT_BUFFER:
- {
- //
- // Are we being asked for a report that is shorter than the storage
- // we have set aside for this? The only output report we define is
- // 8 bits long so we really expect to see a length of 1 passed.
- //
- if((uint32_t)pvMsgData == KEYB_OUT_REPORT_SIZE )
- {
- //
- // Yes - return our pointer.
- //
- return((uint32_t)psInst->pui8DataBuffer);
- }
- else
- {
- //
- // We are being passed a report that is longer than the
- // only report we expect so return NULL. This causes the
- // device class driver to stall the request.
- //
- return(0);
- }
- }
-
- //
- // This event indicates that the host has sent us an Output or
- // Feature report and that the report is now in the buffer we provided
- // on the previous USBD_HID_EVENT_GET_REPORT_BUFFER callback.
- //
- case USBD_HID_EVENT_SET_REPORT:
- {
- //
- // Inform the application if the keyboard LEDs have changed.
- //
- if(psInst->ui8LEDStates != psInst->pui8DataBuffer[0])
- {
- //
- // Note the new LED states.
- //
- psInst->ui8LEDStates = psInst->pui8DataBuffer[0];
-
- //
- // Pass the information on to the client.
- //
- psKeyboardDevice->pfnCallback(
- psKeyboardDevice->pvCBData,
- USBD_HID_KEYB_EVENT_SET_LEDS,
- psInst->pui8DataBuffer[0],
- (void *)0);
- }
- break;
- }
-
- //
- // The host is asking us to set either boot or report protocol (not
- // that it makes any difference to this particular mouse).
- //
- case USBD_HID_EVENT_SET_PROTOCOL:
- {
- psInst->ui8Protocol = ui32MsgData;
- break;
- }
-
- //
- // The host is asking us to tell it which protocol we are currently
- // using, boot or request.
- //
- case USBD_HID_EVENT_GET_PROTOCOL:
- {
- return(psInst->ui8Protocol);
- }
-
- //
- // Pass ERROR, SUSPEND and RESUME to the client unchanged.
- //
- case USB_EVENT_ERROR:
- case USB_EVENT_SUSPEND:
- case USB_EVENT_RESUME:
- {
- return(psKeyboardDevice->pfnCallback(
- psKeyboardDevice->pvCBData,
- ui32Event, ui32MsgData, pvMsgData));
- }
-
- //
- // We ignore all other events.
- //
- default:
- {
- break;
- }
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-// HID device class transmit channel event handler function.
-//
-// \param pvKeyboardDevice is the event callback pointer provided during
-// USBDHIDInit(). This is a pointer to our HID device structure
-// (&g_sHIDKeybDevice).
-// \param ui32Event identifies the event we are being called back for.
-// \param ui32MsgData is an event-specific value.
-// \param pvMsgData is an event-specific pointer.
-//
-// This function is called by the HID device class driver to inform the
-// application of particular asynchronous events related to report
-// transmissions made using the interrupt IN endpoint.
-//
-// \return Returns a value which is event-specific.
-//
-//*****************************************************************************
-static uint32_t
-HIDKeyboardTxHandler(void *pvKeyboardDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData)
-{
- tHIDKeyboardInstance *psInst;
- tUSBDHIDKeyboardDevice *psHIDKbDevice;
- tUSBDHIDDevice *psHIDDevice;
- uint32_t ui32Count;
-
- //
- // Make sure we did not get a NULL pointer.
- //
- ASSERT(pvKeyboardDevice);
-
- //
- // Get a pointer to our instance data
- //
- psHIDKbDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
- psInst = &psHIDKbDevice->sPrivateData;
- psHIDDevice = &psInst->sHIDDevice;
-
- //
- // Which event were we sent?
- //
- switch (ui32Event)
- {
- //
- // A report transmitted via the interrupt IN endpoint was acknowledged
- // by the host.
- //
- case USB_EVENT_TX_COMPLETE:
- {
- //
- // Do we have any pending changes needing transmitted?
- //
- if(psInst->bChangeMade)
- {
- //
- // Yes - go ahead and send another report immediately.
- //
- ui32Count = USBDHIDReportWrite((void *)psHIDDevice,
- psInst->pui8Report,
- KEYB_IN_REPORT_SIZE, true);
-
- //
- // If we scheduled the report for transmission, clear the
- // change flag.
- //
- if(ui32Count != 0)
- {
- psInst->bChangeMade = false;
- }
- }
- else
- {
- //
- // Our last transmission is complete and we have nothing more
- // to send.
- //
- psInst->eKeyboardState = HID_KEYBOARD_STATE_IDLE;
- }
-
- //
- // Pass the event on to the client.
- //
- psHIDKbDevice->pfnCallback(psHIDKbDevice->pvCBData,
- USB_EVENT_TX_COMPLETE, ui32MsgData,
- (void *)0);
-
- break;
- }
-
- //
- // We ignore all other events related to transmission of reports via
- // the interrupt IN endpoint.
- //
- default:
- {
- break;
- }
- }
-
- return(0);
-}
-
-//*****************************************************************************
-//
-// Add the supplied usage code to the list of keys currently in the pressed
-// state.
-//
-// \param ui8UsageCode is the HID usage code of the newly pressed key.
-//
-// This function adds the supplied usage code to the global list of keys which
-// are currently pressed (assuming it is not already noted as pressed and that
-// there is space in the list to hold the new information). The return code
-// indicates success if the list did not overflow and failure if the list
-// already contains as many pressed keys as can be reported.
-//
-// \return Returns \b true if the usage code was successfully added to the
-// list or \b false if there was insufficient space to hold the new key
-// press (in which case the caller should report a roll over error to the
-// host).
-//
-//*****************************************************************************
-static bool
-AddKeyToPressedList(tHIDKeyboardInstance *psInst, uint8_t ui8UsageCode)
-{
- uint32_t ui32Loop;
- bool bRetcode;
-
- //
- // Assume all is well until we determine otherwise.
- //
- bRetcode = true;
-
- //
- // Look through the list of existing pressed keys to see if the new one
- // is already there.
- //
- for(ui32Loop = 0; ui32Loop < (uint32_t)psInst->ui8KeyCount; ui32Loop++)
- {
- //
- // Is this key already included in the list of keys in the pressed
- // state?
- //
- if(ui8UsageCode == psInst->pui8KeysPressed[ui32Loop])
- {
- //
- // Yes - drop out.
- //
- break;
- }
- }
-
- //
- // If we exited the loop at the end of the existing key presses, this
- // key does not exist already so add it if space exists.
- //
- if(ui32Loop >= psInst->ui8KeyCount)
- {
- if(psInst->ui8KeyCount < KEYB_MAX_CHARS_PER_REPORT)
- {
- //
- // We have room so store the new key press in the list.
- //
- psInst->pui8KeysPressed[psInst->ui8KeyCount] = ui8UsageCode;
- psInst->ui8KeyCount++;
- bRetcode = true;
- }
- else
- {
- //
- // We have no room for the new key - declare a rollover error.
- //
- bRetcode = false;
- }
- }
-
- return(bRetcode);
-}
-
-//*****************************************************************************
-//
-// Remove the supplied usage code from the list of keys currently in the
-// pressed state.
-//
-// \param ui8UsageCode is the HID usage code of the newly released key.
-//
-// This function removes the supplied usage code from the global list of keys
-// which are currently pressed. The return code indicates whether the key was
-// found in the list. On exit, the list will have been cleaned up to ensure
-// that all key presses are contiguous starting at the first entry.
-//
-// \return Returns \b true if the usage code was found and removed from the
-// list or \b false if the code was not found. The caller need not pass a new
-// report to the host if \b false is returned since the key list will not have
-// changed.
-//
-//*****************************************************************************
-static bool
-RemoveKeyFromPressedList(tHIDKeyboardInstance *psInst,
- uint8_t ui8UsageCode)
-{
- uint32_t ui32Loop;
- uint32_t ui32Pos;
-
- //
- // Keep the compiler happy by setting ui32Pos to something.
- //
- ui32Pos = 0;
-
- //
- // Find the usage code in the current list.
- //
- for(ui32Loop = 0; ui32Loop < KEYB_MAX_CHARS_PER_REPORT; ui32Loop++)
- {
- if(psInst->pui8KeysPressed[ui32Loop] == ui8UsageCode)
- {
- ui32Pos = ui32Loop;
- break;
- }
- }
-
- //
- // If we dropped out at the end of the loop, we could not find the code so
- // just return false.
- //
- if(ui32Loop == KEYB_MAX_CHARS_PER_REPORT)
- {
- return(false);
- }
-
- //
- // Now shuffle all the values to the right of the usage code we found
- // down one position to fill the gap left by removing it.
- //
- for(ui32Loop = (ui32Pos + 1); ui32Loop < KEYB_MAX_CHARS_PER_REPORT;
- ui32Loop++)
- {
- psInst->pui8KeysPressed[ui32Loop - 1] =
- psInst->pui8KeysPressed[ui32Loop];
- }
-
- //
- // Clear the last entry in the array and adjust the number of keys in the
- // array.
- //
- psInst->pui8KeysPressed[KEYB_MAX_CHARS_PER_REPORT - 1] =
- HID_KEYB_USAGE_RESERVED;
- psInst->ui8KeyCount--;
-
- //
- // Tell the caller we were successful.
- //
- return(true);
-}
-
-//*****************************************************************************
-//
-//! Initializes HID keyboard device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID keyboard device operation.
-//! \param psHIDKbDevice points to a structure containing parameters
-//! customizing the operation of the HID keyboard device.
-//!
-//! An application wishing to offer a USB HID keyboard interface to a USB host
-//! must call this function to initialize the USB controller and attach the
-//! keyboard device to the USB bus. This function performs all required USB
-//! initialization.
-//!
-//! On successful completion, this function will return the \e psHIDKbDevice
-//! pointer passed to it. This must be passed on all future calls to the HID
-//! keyboard device driver.
-//!
-//! When a host connects and configures the device, the application callback
-//! will receive \b USB_EVENT_CONNECTED after which calls can be made to
-//! USBDHIDKeyboardKeyStateChange() to report key presses and releases to the
-//! USB host.
-//!
-//! \note The application must not make any calls to the lower level USB device
-//! interfaces if interacting with USB via the USB HID keyboard device class
-//! API. Doing so will cause unpredictable (though almost certainly
-//! unpleasant) behavior.
-//!
-//! \return Returns NULL on failure or the psHIDKbDevice pointer on success.
-//
-//*****************************************************************************
-void *
-USBDHIDKeyboardInit(uint32_t ui32Index, tUSBDHIDKeyboardDevice *psHIDKbDevice)
-{
- void *pvRetcode;
- tUSBDHIDDevice *psHIDDevice;
- tConfigDescriptor *pConfigDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(psHIDKbDevice);
- ASSERT(psHIDKbDevice->ppui8StringDescriptors);
- ASSERT(psHIDKbDevice->pfnCallback);
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psHIDKbDevice->sPrivateData.sHIDDevice;
-
- //
- // Call the common initialization routine.
- //
- pvRetcode = USBDHIDKeyboardCompositeInit(ui32Index, psHIDKbDevice, 0);
-
- pConfigDesc = (tConfigDescriptor *)g_pui8KeybDescriptor;
- pConfigDesc->bmAttributes = psHIDKbDevice->ui8PwrAttributes;
- pConfigDesc->bMaxPower = (uint8_t)(psHIDKbDevice->ui16MaxPowermA / 2);
-
- //
- // If we initialized the HID layer successfully, pass our device pointer
- // back as the return code, otherwise return NULL to indicate an error.
- //
- if(pvRetcode)
- {
- //
- // Initialize the lower layer HID driver and pass it the various
- // structures and descriptors necessary to declare that we are a
- // keyboard.
- //
- pvRetcode = USBDHIDInit(ui32Index, psHIDDevice);
-
- return((void *)psHIDKbDevice);
- }
- else
- {
- return((void *)0);
- }
-}
-
-//*****************************************************************************
-//
-//! Initializes HID keyboard device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID keyboard device operation.
-//! \param psHIDKbDevice points to a structure containing parameters
-//! customizing the operation of the HID keyboard device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! This call is very similar to USBDKeyboardInit() except that it is used for
-//! initializing an instance of the HID keyboard device for use in a composite
-//! device. If this HID keyboard is part of a composite device, then the
-//! \e psCompEntry should point to the composite device entry to initialize.
-//! This is part of the array that is passed to the USBDCompositeInit()
-//! function.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB HID Keyboard APIs.
-//
-//*****************************************************************************
-void *
-USBDHIDKeyboardCompositeInit(uint32_t ui32Index,
- tUSBDHIDKeyboardDevice *psHIDKbDevice,
- tCompositeEntry *psCompEntry)
-{
- tHIDKeyboardInstance *psInst;
- uint32_t ui32Loop;
- tUSBDHIDDevice *psHIDDevice;
-
- //
- // Check parameter validity.
- //
- ASSERT(psHIDKbDevice);
- ASSERT(psHIDKbDevice->ppui8StringDescriptors);
- ASSERT(psHIDKbDevice->pfnCallback);
-
- //
- // Get a pointer to our instance data
- //
- psInst = &psHIDKbDevice->sPrivateData;
-
- //
- // Initialize the various fields in our instance structure.
- //
- psInst->ui8USBConfigured = 0;
- psInst->ui8Protocol = USB_HID_PROTOCOL_REPORT;
- psInst->sReportIdle.ui8Duration4mS = 125;
- psInst->sReportIdle.ui8ReportID = 0;
- psInst->sReportIdle.ui32TimeSinceReportmS = 0;
- psInst->sReportIdle.ui16TimeTillNextmS = 0;
- psInst->ui8LEDStates = 0;
- psInst->ui8KeyCount = 0;
- for(ui32Loop = 0; ui32Loop < KEYB_MAX_CHARS_PER_REPORT; ui32Loop++)
- {
- psInst->pui8KeysPressed[ui32Loop] = HID_KEYB_USAGE_RESERVED;
- }
-
- psInst->eKeyboardState = HID_KEYBOARD_STATE_UNCONFIGURED;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psInst->sHIDDevice;
-
- //
- // Initialize the HID device class instance structure based on input from
- // the caller.
- //
- psHIDDevice->ui16PID = psHIDKbDevice->ui16PID;
- psHIDDevice->ui16VID = psHIDKbDevice->ui16VID;
- psHIDDevice->ui16MaxPowermA = psHIDKbDevice->ui16MaxPowermA;
- psHIDDevice->ui8PwrAttributes = psHIDKbDevice->ui8PwrAttributes;
- psHIDDevice->ui8Subclass = USB_HID_SCLASS_BOOT;
- psHIDDevice->ui8Protocol = USB_HID_PROTOCOL_KEYB;
- psHIDDevice->ui8NumInputReports = 1;
- psHIDDevice->psReportIdle = 0;
- psHIDDevice->pfnRxCallback = HIDKeyboardRxHandler;
- psHIDDevice->pvRxCBData = (void *)psHIDKbDevice;
- psHIDDevice->pfnTxCallback = HIDKeyboardTxHandler;
- psHIDDevice->pvTxCBData = (void *)psHIDKbDevice;
- psHIDDevice->bUseOutEndpoint = false,
-
- psHIDDevice->psHIDDescriptor = &g_sKeybHIDDescriptor;
- psHIDDevice->ppui8ClassDescriptors = g_pui8KeybClassDescriptors;
- psHIDDevice->ppui8StringDescriptors =
- psHIDKbDevice->ppui8StringDescriptors;
- psHIDDevice->ui32NumStringDescriptors =
- psHIDKbDevice->ui32NumStringDescriptors;
- psHIDDevice->ppsConfigDescriptor = g_ppsHIDConfigDescriptors;
-
- psHIDDevice->psReportIdle = &psInst->sReportIdle;
-
- //
- // Initialize the lower layer HID driver and pass it the various structures
- // and descriptors necessary to declare that we are a keyboard.
- //
- return(USBDHIDCompositeInit(ui32Index, psHIDDevice, psCompEntry));
-}
-
-//*****************************************************************************
-//
-//! Shuts down the HID keyboard device.
-//!
-//! \param pvKeyboardDevice is the pointer to the device instance structure
-//! as returned by USBDHIDKeyboardInit().
-//!
-//! This function terminates HID keyboard operation for the instance supplied
-//! and removes the device from the USB bus. Following this call, the
-//! \e pvKeyboardDevice instance may not me used in any other call to the HID
-//! keyboard device other than USBDHIDKeyboardInit().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDKeyboardTerm(void *pvKeyboardDevice)
-{
- tUSBDHIDKeyboardDevice *psHIDKbDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvKeyboardDevice);
-
- //
- // Get a pointer to the device.
- //
- psHIDKbDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psHIDKbDevice->sPrivateData.sHIDDevice;
-
- //
- // Mark the device as no shorter configured.
- //
- psHIDKbDevice->sPrivateData.ui8USBConfigured = 0;
-
- //
- // Terminate the low level HID driver.
- //
- USBDHIDTerm(psHIDDevice);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer parameter for the keyboard callback.
-//!
-//! \param pvKeyboardDevice is the pointer to the device instance structure
-//! as returned by USBDHIDKeyboardInit().
-//! \param pvCBData is the pointer that client wishes to be provided on each
-//! event sent to the keyboard callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnCallback function
-//! passed on USBDHIDKeyboardInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the \e pvKeyboardDevice structure passed to
-//! USBDHIDKeyboardInit() resides in RAM. If this structure is in flash,
-//! callback data changes will not be possible.
-//!
-//! \return Returns the previous callback pointer that was set for this
-//! instance.
-//
-//*****************************************************************************
-void *
-USBDHIDKeyboardSetCBData(void *pvKeyboardDevice, void *pvCBData)
-{
- void *pvOldCBData;
- tUSBDHIDKeyboardDevice *psKeyboard;
-
- //
- // Check for a NULL pointer in the device parameter.
- //
- ASSERT(pvKeyboardDevice);
-
- //
- // Get a pointer to our keyboard device.
- //
- psKeyboard = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
-
- //
- // Save the old callback pointer and replace it with the new value.
- //
- pvOldCBData = psKeyboard->pvCBData;
- psKeyboard->pvCBData = pvCBData;
-
- //
- // Pass the old callback pointer back to the caller.
- //
- return(pvOldCBData);
-}
-
-//*****************************************************************************
-//
-//! Reports a key state change to the USB host.
-//!
-//! \param pvKeyboardDevice is the pointer to the device instance structure
-//! as returned by USBDHIDKeyboardInit().
-//! \param ui8Modifiers contains the states of each of the keyboard modifiers
-//! (left/right shift, ctrl, alt or GUI keys). Valid values are logical OR
-//! combinations of the labels \b HID_KEYB_LEFT_CTRL, \b HID_KEYB_LEFT_SHIFT,
-//! \b HID_KEYB_LEFT_ALT, \b HID_KEYB_LEFT_GUI, \b HID_KEYB_RIGHT_CTRL, \b
-//! HID_KEYB_RIGHT_SHIFT, \b HID_KEYB_RIGHT_ALT and \b HID_KEYB_RIGHT_GUI.
-//! Presence of one of these bit flags indicates that the relevant modifier
-//! key is pressed and absence indicates that it is released.
-//! \param ui8UsageCode is the usage code of the key whose state has changed.
-//! If only modifier keys have changed, \b HID_KEYB_USAGE_RESERVED should be
-//! passed in this parameter.
-//! \param bPress is \b true if the key has been pressed or \b false if it has
-//! been released. If only modifier keys have changed state, this parameter is
-//! ignored.
-//!
-//! This function adds or removes a key usage code from the list of keys
-//! currently pressed and schedules a report transmission to the host to
-//! inform it of the new keyboard state. If the maximum number of simultaneous
-//! key presses are already recorded, the report to the host will contain the
-//! rollover error code, HID_KEYB_USAGE_ROLLOVER instead of key usage codes
-//! and the caller will receive return code KEYB_ERR_TOO_MANY_KEYS.
-//!
-//! \return Returns \b KEYB_SUCCESS if the key usage code was added to or
-//! removed from the current list successfully. \b KEYB_ERR_TOO_MANY_KEYS is
-//! returned if an attempt is made to press a 7th key (the BIOS keyboard
-//! protocol can report no more than 6 simultaneously pressed keys). If called
-//! before the USB host has configured the device, \b KEYB_ERR_NOT_CONFIGURED
-//! is returned and, if an error is reported while attempting to transmit the
-//! report, \b KEYB_ERR_TX_ERROR is returned. If an attempt is made to remove
-//! a key from the pressed list (by setting parameter \e bPressed to \b false)
-//! but the key usage code is not found, \b KEYB_ERR_NOT_FOUND is returned.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDKeyboardKeyStateChange(void *pvKeyboardDevice, uint8_t ui8Modifiers,
- uint8_t ui8UsageCode, bool bPress)
-{
- bool bRetcode;
- uint32_t ui32Loop, ui32Count;
- tHIDKeyboardInstance *psInst;
- tUSBDHIDKeyboardDevice *psHIDKbDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- psHIDKbDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psHIDKbDevice->sPrivateData.sHIDDevice;
-
- //
- // Assume all is well until we determine otherwise.
- //
- bRetcode = true;
-
- //
- // Get a pointer to our instance data
- //
- psInst = &psHIDKbDevice->sPrivateData;
-
- //
- // Update the global keyboard report with the information passed.
- //
- psInst->pui8Report[0] = ui8Modifiers;
- psInst->pui8Report[1] = 0;
-
- //
- // Were we passed a usage code for a new key press or release or was
- // this call just telling us about a modifier change?
- //
- if(ui8UsageCode != HID_KEYB_USAGE_RESERVED)
- {
- //
- // Has a key been pressed or released?
- //
- if(bPress)
- {
- //
- // A key has been pressed - add it to the list if there is space an
- // and the key is not already in the list.
- //
- bRetcode = AddKeyToPressedList(psInst, ui8UsageCode);
- }
- else
- {
- //
- // A key has been released - remove it from the list.
- //
- bRetcode = RemoveKeyFromPressedList(psInst, ui8UsageCode);
-
- //
- // The return code here indicates whether the key was found. If it
- // wasn't, the list has not changes so merely exit at this point
- // without sending anything to the host.
- //
- if(!bRetcode)
- {
- return(KEYB_ERR_NOT_FOUND);
- }
- }
-
- //
- // Build the report from the current list of keys. If we added a key
- // and got a bad return code indicating a roll over error, we need to
- // send a roll over report
- //
- for(ui32Loop = 0; ui32Loop < KEYB_MAX_CHARS_PER_REPORT; ui32Loop++)
- {
- psInst->pui8Report[2 + ui32Loop] = (bRetcode ?
- psInst->pui8KeysPressed[ui32Loop] : HID_KEYB_USAGE_ROLLOVER);
- }
- }
-
- //
- // If we are not configured, return an error here before trying to send
- // anything.
- //
- if(!psInst->ui8USBConfigured)
- {
- return(KEYB_ERR_NOT_CONFIGURED);
- }
-
- //
- // Only send a report if the transmitter is currently free.
- //
- if(USBDHIDTxPacketAvailable((void *)psHIDDevice))
- {
- //
- // Send the report to the host.
- //
- psInst->eKeyboardState = HID_KEYBOARD_STATE_SEND;
- ui32Count = USBDHIDReportWrite((void *)psHIDDevice,
- psInst->pui8Report, KEYB_IN_REPORT_SIZE,
- true);
-
- //
- // Did we schedule a packet for transmission correctly?
- //
- if(!ui32Count)
- {
- //
- // No - report the error to the caller.
- //
- return(KEYB_ERR_TX_ERROR);
- }
- }
- else
- {
- //
- // We can't send the report immediately so mark the instance so that
- // it is sent next time the transmitter is free.
- //
- psInst->bChangeMade = true;
- }
-
- //
- // If we get this far, the key information was sent successfully. Are
- // too many keys currently pressed, though?
- //
- return(bRetcode ? KEYB_SUCCESS : KEYB_ERR_TOO_MANY_KEYS);
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus or self powered) to the USB library.
-//!
-//! \param pvKeyboardDevice is the pointer to the keyboard device instance
-//! structure.
-//! \param ui8Power indicates the current power status, either
-//! \b USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus or self powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the USB library to allow correct responses to be provided
-//! when the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDKeyboardPowerStatusSet(void *pvKeyboardDevice, uint8_t ui8Power)
-{
- tUSBDHIDKeyboardDevice *psHIDKbDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvKeyboardDevice);
-
- //
- // Get the keyboard device pointer.
- //
- psHIDKbDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
-
- //
- // Get a pointer to the HID device data.
-
- psHIDDevice = &psHIDKbDevice->sPrivateData.sHIDDevice;
-
- //
- // Pass the request through to the lower layer.
- //
- USBDHIDPowerStatusSet((void *)psHIDDevice, ui8Power);
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wake up to resume communication when in suspended state.
-//!
-//! \param pvKeyboardDevice is the pointer to the keyboard device instance
-//! structure.
-//!
-//! When the bus is suspended, an application which supports remote wake up
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wake up signaling to the host. If the remote
-//! wake up feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wake up,
-//! \b false will be returned to indicate that the wake up request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wake up is not disabled and the
-//! signaling was started or \b false if remote wake up is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDHIDKeyboardRemoteWakeupRequest(void *pvKeyboardDevice)
-{
- tUSBDHIDKeyboardDevice *psHIDKbDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvKeyboardDevice);
-
- //
- // Get the keyboard device pointer.
- //
- psHIDKbDevice = (tUSBDHIDKeyboardDevice *)pvKeyboardDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psHIDKbDevice->sPrivateData.sHIDDevice;
-
- //
- // Pass the request through to the lower layer.
- //
- return(USBDHIDRemoteWakeupRequest((void *)psHIDDevice));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.h
deleted file mode 100644
index 97f298af6..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidkeyb.h
+++ /dev/null
@@ -1,364 +0,0 @@
-//*****************************************************************************
-//
-// usbdhidkeyb.h - Definitions used by HID keyboard class devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDHIDKEYB_H__
-#define __USBDHIDKEYB_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup hid_keyboard_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! The maximum number of simultaneously-pressed, non-modifier keys that the
-//! HID BIOS keyboard protocol can send at once. Attempts to send more pressed
-//! keys than this will result in a rollover error being reported to the host
-//! and KEYB_ERR_TOO_MANY_KEYS being returned from
-//! USBDHIDKeyboardKeyStateChange.
-//
-//*****************************************************************************
-#define KEYB_MAX_CHARS_PER_REPORT \
- 6
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The first few sections of this header are private defines that are used by
-// the USB HID keyboard code and are here only to help with the application
-// allocating the correct amount of memory for the USB HID Keyboard device
-// code.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This enumeration holds the various states that the keyboard can be in during
-// normal operation.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // Unconfigured.
- //
- HID_KEYBOARD_STATE_UNCONFIGURED,
-
- //
- // No keys to send and not waiting on data.
- //
- HID_KEYBOARD_STATE_IDLE,
-
- //
- // Waiting on report data from the host.
- //
- HID_KEYBOARD_STATE_WAIT_DATA,
-
- //
- // Waiting on data to be sent out.
- //
- HID_KEYBOARD_STATE_SEND
-}
-tKeyboardState;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The size of the keyboard input and output reports.
-//
-//*****************************************************************************
-#define KEYB_IN_REPORT_SIZE 8
-#define KEYB_OUT_REPORT_SIZE 1
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data structure for the USB HID
-// keyboard device. This structure forms the RAM workspace used by each
-// instance of the keyboard.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The USB configuration number set by the host or 0 of the device is
- // currently unconfigured.
- //
- uint8_t ui8USBConfigured;
-
- //
- // The protocol requested by the host, USB_HID_PROTOCOL_BOOT or
- // USB_HID_PROTOCOL_REPORT.
- //
- uint8_t ui8Protocol;
-
- //
- // The current states that the keyboard LEDs are to be set to.
- //
- volatile uint8_t ui8LEDStates;
-
- //
- // The total number of keys currently pressed. This indicates the number
- // of key press entries in the pui8KeysPressed array.
- //
- uint8_t ui8KeyCount;
-
- //
- // The current state of the keyboard interrupt IN endpoint.
- //
- volatile tKeyboardState eKeyboardState;
-
- //
- // A flag to indicate that the application pressed or released a key
- // but that we couldn't send the report immediately.
- //
- volatile bool bChangeMade;
-
- //
- // A buffer used to receive output reports from the host.
- //
- uint8_t pui8DataBuffer[KEYB_OUT_REPORT_SIZE];
-
- //
- // A buffer used to hold the last input report sent to the host.
- //
- uint8_t pui8Report[KEYB_IN_REPORT_SIZE];
-
- //
- // A buffer containing the usage codes of all non-modifier keys currently
- // in the pressed state.
- //
- uint8_t pui8KeysPressed[KEYB_MAX_CHARS_PER_REPORT];
-
- //
- // The idle timeout control structure for our input report. This is
- // required by the lower level HID driver.
- //
- tHIDReportIdle sReportIdle;
-
- //
- // This is needed for the lower level HID driver.
- //
- tUSBDHIDDevice sHIDDevice;
-}
-tHIDKeyboardInstance;
-
-//*****************************************************************************
-//
-//! This structure is used by the application to define operating parameters
-//! for the HID keyboard device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //! A pointer to the callback function which will be called to notify
- //! the application of general events and those related to reception of
- //! Output and Feature reports via the (optional) interrupt OUT endpoint.
- //
- const tUSBCallback pfnCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the keyboard callback,
- //! pfnCallback.
- //
- void *pvCBData;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1),HID
- //! Interface description string (language 1), Configuration description
- //! string (language 1).
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be (1 + (5 * (num languages))).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The private instance data for this device. This memory must
- //! remain accessible for as long as the keyboard device is in use and
- //! must not be modified by any code outside the HID keyboard driver.
- //
- tHIDKeyboardInstance sPrivateData;
-}
-tUSBDHIDKeyboardDevice;
-
-//*****************************************************************************
-//
-// Keyboard-specific device class driver events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This event indicates that the keyboard LED states are to be set. The
-//! ui32MsgValue parameter contains the requested state for each of the LEDs
-//! defined as a collection of ORed bits where a 1 indicates that the LED is
-//! to be turned on and a 0 indicates that it should be turned off. The
-//! individual LED bits are defined using labels HID_KEYB_NUM_LOCK,
-//! HID_KEYB_CAPS_LOCK, HID_KEYB_SCROLL_LOCK, HID_KEYB_COMPOSE and
-//! HID_KEYB_KANA.
-//
-//*****************************************************************************
-#define USBD_HID_KEYB_EVENT_SET_LEDS \
- USBD_HID_KEYB_EVENT_BASE
-
-//*****************************************************************************
-//
-//! This return code from USBDHIDKeyboardKeyStateChange indicates success.
-//
-//*****************************************************************************
-#define KEYB_SUCCESS 0
-
-//*****************************************************************************
-//
-//! This return code from USBDHIDKeyboardKeyStateChange indicates that an
-//! attempt has been made to record more than 6 simultaneously pressed,
-//! non-modifier keys. The USB HID BIOS keyboard protocol allows no more than
-//! 6 pressed keys to be reported at one time. Until at least one key is
-//! released, the device will report a roll over error to the host each time it
-//! is asked for the keyboard input report.
-//
-//*****************************************************************************
-#define KEYB_ERR_TOO_MANY_KEYS 1
-
-//*****************************************************************************
-//
-//! This return code from USBDHIDKeyboardKeyStateChange indicates that an
-//! error was reported while attempting to send a report to the host. A client
-//! should assume that the host has disconnected if this return code is seen.
-//
-//*****************************************************************************
-#define KEYB_ERR_TX_ERROR 2
-
-//*****************************************************************************
-//
-//! USBDHIDKeyboardKeyStateChange returns this value if it is called with the
-//! bPress parameter set to false but with a ui8UsageCode parameter which does
-//! does not indicate a key that is currently recorded as being pressed. This
-//! may occur if an attempt was previously made to report more than 6 pressed
-//! keys and the earlier pressed keys are released before the later ones. This
-//! condition is benign and should not be used to indicate a host disconnection
-//! or serious error.
-//
-//*****************************************************************************
-#define KEYB_ERR_NOT_FOUND 3
-
-//*****************************************************************************
-//
-//! USBDHIDKeyboardKeyStateChange returns this value if it is called before the
-//! USB host has connected and configured the device. Any key usage code
-//! passed will be stored and passed to the host once configuration completes.
-//
-//*****************************************************************************
-#define KEYB_ERR_NOT_CONFIGURED 4
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDHIDKeyboardInit(uint32_t ui32Index,
- tUSBDHIDKeyboardDevice *psHIDKbDevice);
-extern void *USBDHIDKeyboardCompositeInit(uint32_t ui32Index,
- tUSBDHIDKeyboardDevice *psHIDKbDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDHIDKeyboardTerm(void *pvKeyboardInstance);
-extern void *USBDHIDKeyboardSetCBData(void *pvKeyboardInstance,
- void *pvCBData);
-extern uint32_t USBDHIDKeyboardKeyStateChange(void *pvKeyboardInstance,
- uint8_t ui8Modifiers,
- uint8_t ui8UsageCode,
- bool bPressed);
-extern void USBDHIDKeyboardPowerStatusSet(void *pvKeyboardInstance,
- uint8_t ui8Power);
-extern bool USBDHIDKeyboardRemoteWakeupRequest(void *pvKeyboardInstance);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDHIDKEYB_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.c
deleted file mode 100644
index 8954c33e0..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.c
+++ /dev/null
@@ -1,1011 +0,0 @@
-//*****************************************************************************
-//
-// usbdhidmouse.c - USB HID Mouse device class driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/usbhid.h"
-#include "usblib/device/usbdhid.h"
-#include "usblib/device/usbdhidmouse.h"
-
-//*****************************************************************************
-//
-//! \addtogroup hid_mouse_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// HID device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-uint8_t g_pui8MouseDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(34), // The total size of this full structure.
- 1, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 5, // The string identifier that describes this
- // configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// The remainder of the configuration descriptor is stored in flash since we
-// don't need to modify anything in it at runtime.
-//
-//*****************************************************************************
-uint8_t g_pui8HIDInterface[HIDINTERFACE_SIZE] =
-{
- //
- // HID Device Class Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- 0, // The index for this interface.
- 0, // The alternate setting for this interface.
- 1, // The number of endpoints used by this
- // interface.
- USB_CLASS_HID, // The interface class
- USB_HID_SCLASS_BOOT, // The interface sub-class.
- USB_HID_PROTOCOL_MOUSE, // The interface protocol for the sub-class
- // specified above.
- 4, // The string index for this interface.
-};
-
-const uint8_t g_pui8HIDInEndpoint[HIDINENDPOINT_SIZE] =
-{
- //
- // Interrupt IN endpoint descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(USB_EP_1),
- USB_EP_ATTR_INT, // Endpoint is an interrupt endpoint.
- USBShort(USBFIFOSizeToBytes(USB_FIFO_SZ_64)),
- // The maximum packet size.
- 16, // The polling interval for this endpoint.
-};
-
-//*****************************************************************************
-//
-// The report descriptor for the mouse class device.
-//
-//*****************************************************************************
-static const uint8_t g_pui8MouseReportDescriptor[] =
-{
- UsagePage(USB_HID_GENERIC_DESKTOP),
- Usage(USB_HID_MOUSE),
- Collection(USB_HID_APPLICATION),
- Usage(USB_HID_POINTER),
- Collection(USB_HID_PHYSICAL),
-
- //
- // The buttons.
- //
- UsagePage(USB_HID_BUTTONS),
- UsageMinimum(1),
- UsageMaximum(3),
- LogicalMinimum(0),
- LogicalMaximum(1),
-
- //
- // 3 - 1 bit values for the buttons.
- //
- ReportSize(1),
- ReportCount(3),
- Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
- USB_HID_INPUT_ABS),
-
- //
- // 1 - 5 bit unused constant value to fill the 8 bits.
- //
- ReportSize(5),
- ReportCount(1),
- Input(USB_HID_INPUT_CONSTANT | USB_HID_INPUT_ARRAY |
- USB_HID_INPUT_ABS),
-
- //
- // The X and Y axis.
- //
- UsagePage(USB_HID_GENERIC_DESKTOP),
- Usage(USB_HID_X),
- Usage(USB_HID_Y),
- LogicalMinimum(-127),
- LogicalMaximum(127),
-
- //
- // 2 - 8 bit Values for x and y.
- //
- ReportSize(8),
- ReportCount(2),
- Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
- USB_HID_INPUT_RELATIVE),
-
- //
- // 2 - 8 bit Values for x and y. // Padding
- //
- ReportSize(8),
- ReportCount(MOUSE_REPORT_SIZE - 3),
- Input(USB_HID_INPUT_CONSTANT | USB_HID_INPUT_ARRAY |
- USB_HID_INPUT_ABS),
-
- EndCollection,
- EndCollection,
-};
-
-//*****************************************************************************
-//
-// The HID descriptor for the mouse device.
-//
-//*****************************************************************************
-static const tHIDDescriptor g_sMouseHIDDescriptor =
-{
- 9, // bLength
- USB_HID_DTYPE_HID, // bDescriptorType
- 0x111, // bcdHID (version 1.11 compliant)
- 0, // bCountryCode (not localized)
- 1, // bNumDescriptors
- {
- {
- USB_HID_DTYPE_REPORT, // Report descriptor
- sizeof(g_pui8MouseReportDescriptor)
- // Size of report descriptor
- }
- }
-};
-
-//*****************************************************************************
-//
-// The HID configuration descriptor is defined as four or five sections
-// depending upon the client's configuration choice. These sections are:
-//
-// 1. The 9 byte configuration descriptor (RAM).
-// 2. The interface descriptor (RAM).
-// 3. The HID report and physical descriptors (provided by the client)
-// (FLASH).
-// 4. The mandatory interrupt IN endpoint descriptor (FLASH).
-// 5. The optional interrupt OUT endpoint descriptor (FLASH).
-//
-//*****************************************************************************
-const tConfigSection g_sHIDConfigSection =
-{
- sizeof(g_pui8MouseDescriptor),
- g_pui8MouseDescriptor
-};
-
-const tConfigSection g_sHIDInterfaceSection =
-{
- sizeof(g_pui8HIDInterface),
- g_pui8HIDInterface
-};
-
-const tConfigSection g_sHIDInEndpointSection =
-{
- sizeof(g_pui8HIDInEndpoint),
- g_pui8HIDInEndpoint
-};
-
-//*****************************************************************************
-//
-// Place holder for the user's HID descriptor block.
-//
-//*****************************************************************************
-tConfigSection g_sHIDDescriptorSection =
-{
- sizeof(g_sMouseHIDDescriptor),
- (const uint8_t *)&g_sMouseHIDDescriptor
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete HID configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psHIDSections[] =
-{
- &g_sHIDConfigSection,
- &g_sHIDInterfaceSection,
- &g_sHIDDescriptorSection,
- &g_sHIDInEndpointSection,
-};
-
-#define NUM_HID_SECTIONS (sizeof(g_psHIDSections) / \
- sizeof(g_psHIDSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor. Note that this must be
-// in RAM since we need to include or exclude the final section based on
-// client supplied initialization parameters.
-//
-//*****************************************************************************
-tConfigHeader g_sHIDConfigHeader =
-{
- NUM_HID_SECTIONS,
- g_psHIDSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppsHIDConfigDescriptors[] =
-{
- &g_sHIDConfigHeader
-};
-
-//*****************************************************************************
-//
-// The HID class descriptor table. For the mouse class, we have only a single
-// report descriptor.
-//
-//*****************************************************************************
-static const uint8_t * const g_pui8MouseClassDescriptors[] =
-{
- g_pui8MouseReportDescriptor
-};
-
-//*****************************************************************************
-//
-// Forward references for mouse device callback functions.
-//
-//*****************************************************************************
-static uint32_t HIDMouseRxHandler(void *pvMouseDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData);
-static uint32_t HIDMouseTxHandler(void *pvMouseDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData);
-
-//*****************************************************************************
-//
-// The HID mouse report offsets for this mouse application.
-//
-//*****************************************************************************
-#define HID_REPORT_BUTTONS 0
-#define HID_REPORT_X 1
-#define HID_REPORT_Y 2
-
-//*****************************************************************************
-//
-// Main HID device class event handler function.
-//
-// \param pvMouseDevice is the event callback pointer provided during
-// USBDHIDInit(). This is a pointer to our HID device structure
-// (&g_sHIDMouseDevice).
-// \param ui32Event identifies the event we are being called back for.
-// \param ui32MsgData is an event-specific value.
-// \param pvMsgData is an event-specific pointer.
-//
-// This function is called by the HID device class driver to inform the
-// application of particular asynchronous events related to operation of the
-// mouse HID device.
-//
-// \return Returns a value which is event-specific.
-//
-//*****************************************************************************
-static uint32_t
-HIDMouseRxHandler(void *pvMouseDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData)
-{
- tHIDMouseInstance *psInst;
- tUSBDHIDMouseDevice *psMouseDevice;
-
- //
- // Make sure we did not get a NULL pointer.
- //
- ASSERT(pvMouseDevice);
-
- //
- // Get a pointer to our instance data
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
- psInst = &psMouseDevice->sPrivateData;
-
- //
- // Which event were we sent?
- //
- switch(ui32Event)
- {
- //
- // The host has connected to us and configured the device.
- //
- case USB_EVENT_CONNECTED:
- {
- psInst->ui8USBConfigured = true;
-
- //
- // Pass the information on to the client.
- //
- psMouseDevice->pfnCallback(psMouseDevice->pvCBData,
- USB_EVENT_CONNECTED, 0, (void *)0);
-
- break;
- }
-
- //
- // The host has disconnected from us.
- //
- case USB_EVENT_DISCONNECTED:
- {
- psInst->ui8USBConfigured = false;
-
- //
- // Pass the information on to the client.
- //
- psMouseDevice->pfnCallback(psMouseDevice->pvCBData,
- USB_EVENT_DISCONNECTED, 0, (void *)0);
-
- break;
- }
-
- //
- // The host is polling us for a particular report and the HID driver
- // is asking for the latest version to transmit.
- //
- case USBD_HID_EVENT_IDLE_TIMEOUT:
- case USBD_HID_EVENT_GET_REPORT:
- {
- //
- // We only support a single input report so we don't need to check
- // the ui32MsgValue parameter in this case. Set the report pointer
- // in *pvMsgData and return the length of the report in bytes.
- //
- *(uint8_t **)pvMsgData = psInst->pui8Report;
- return(8);
- }
-
- //
- // The device class driver has completed sending a report to the
- // host in response to a Get_Report request.
- //
- case USBD_HID_EVENT_REPORT_SENT:
- {
- //
- // We have nothing to do here.
- //
- break;
- }
-
- //
- // This event is sent in response to a host Set_Report request. The
- // mouse device has no output reports so we return a NULL pointer and
- // zero length to cause this request to be stalled.
- //
- case USBD_HID_EVENT_GET_REPORT_BUFFER:
- {
- //
- // We are being asked for a report that does not exist for
- // this device. Return 0 to indicate that we are not providing
- // a buffer.
- //
- return(0);
- }
-
- //
- // The host is asking us to set either boot or report protocol (not
- // that it makes any difference to this particular mouse).
- //
- case USBD_HID_EVENT_SET_PROTOCOL:
- {
- psInst->ui8Protocol = ui32MsgData;
- break;
- }
-
- //
- // The host is asking us to tell it which protocol we are currently
- // using, boot or request.
- //
- case USBD_HID_EVENT_GET_PROTOCOL:
- {
- return(psInst->ui8Protocol);
- }
-
- //
- // Pass ERROR, SUSPEND and RESUME to the client unchanged.
- //
- case USB_EVENT_ERROR:
- case USB_EVENT_SUSPEND:
- case USB_EVENT_RESUME:
- {
- return(psMouseDevice->pfnCallback(psMouseDevice->pvCBData,
- ui32Event, ui32MsgData,
- pvMsgData));
- }
-
- //
- // We ignore all other events.
- //
- default:
- {
- break;
- }
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-// HID device class transmit channel event handler function.
-//
-// \param pvMouseDevice is the event callback pointer provided during
-// USBDHIDInit(). This is a pointer to our HID device structure
-// (&g_sHIDMouseDevice).
-// \param ui32Event identifies the event we are being called back for.
-// \param ui32MsgData is an event-specific value.
-// \param pvMsgData is an event-specific pointer.
-//
-// This function is called by the HID device class driver to inform the
-// application of particular asynchronous events related to report
-// transmissions made using the interrupt IN endpoint.
-//
-// \return Returns a value which is event-specific.
-//
-//*****************************************************************************
-static uint32_t
-HIDMouseTxHandler(void *pvMouseDevice, uint32_t ui32Event,
- uint32_t ui32MsgData, void *pvMsgData)
-{
- tHIDMouseInstance *psInst;
- tUSBDHIDMouseDevice *psMouseDevice;
-
- //
- // Make sure we did not get a NULL pointer.
- //
- ASSERT(pvMouseDevice);
-
- //
- // Get a pointer to our instance data
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
- psInst = &psMouseDevice->sPrivateData;
-
- //
- // Which event were we sent?
- //
- switch (ui32Event)
- {
- //
- // A report transmitted via the interrupt IN endpoint was acknowledged
- // by the host.
- //
- case USB_EVENT_TX_COMPLETE:
- {
- //
- // Our last transmission is complete.
- //
- psInst->iMouseState = eHIDMouseStateIdle;
-
- //
- // Pass the event on to the client.
- //
- psMouseDevice->pfnCallback(psMouseDevice->pvCBData,
- USB_EVENT_TX_COMPLETE, ui32MsgData,
- (void *)0);
-
- break;
- }
-
- //
- // We ignore all other events related to transmission of reports via
- // the interrupt IN endpoint.
- //
- default:
- {
- break;
- }
- }
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! Initializes HID mouse device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID mouse device operation.
-//! \param psMouseDevice points to a structure containing parameters
-//! customizing the operation of the HID mouse device.
-//!
-//! An application wishing to offer a USB HID mouse interface to a USB host
-//! must call this function to initialize the USB controller and attach the
-//! mouse device to the USB bus. This function performs all required USB
-//! initialization.
-//!
-//! On successful completion, this function will return the \e psMouseDevice
-//! pointer passed to it. This must be passed on all future calls to the HID
-//! mouse device driver.
-//!
-//! When a host connects and configures the device, the application callback
-//! will receive \b USB_EVENT_CONNECTED after which calls can be made to
-//! USBDHIDMouseStateChange() to report pointer movement and button presses
-//! to the host.
-//!
-//! \note The application must not make any calls to the lower level USB device
-//! interfaces if interacting with USB via the USB HID mouse device API.
-//! Doing so will cause unpredictable (though almost certainly unpleasant)
-//! behavior.
-//!
-//! \return Returns NULL on failure or the psMouseDevice pointer on success.
-//
-//*****************************************************************************
-void *
-USBDHIDMouseInit(uint32_t ui32Index, tUSBDHIDMouseDevice *psMouseDevice)
-{
- void *pvRetcode;
- tUSBDHIDDevice *psHIDDevice;
- tConfigDescriptor *pConfigDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(psMouseDevice);
- ASSERT(psMouseDevice->ppui8StringDescriptors);
- ASSERT(psMouseDevice->pfnCallback);
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- pConfigDesc = (tConfigDescriptor *)g_pui8MouseDescriptor;
- pConfigDesc->bmAttributes = psMouseDevice->ui8PwrAttributes;
- pConfigDesc->bMaxPower = (uint8_t)(psMouseDevice->ui16MaxPowermA / 2);
-
- //
- // Call the common initialization routine.
- //
- pvRetcode = USBDHIDMouseCompositeInit(ui32Index, psMouseDevice, 0);
-
- //
- // If we initialized the HID layer successfully, pass our device pointer
- // back as the return code, otherwise return NULL to indicate an error.
- //
- if(pvRetcode)
- {
- //
- // Initialize the lower layer HID driver and pass it the various
- // structures and descriptors necessary to declare that we are a
- // keyboard.
- //
- pvRetcode = USBDHIDInit(ui32Index, psHIDDevice);
-
- return((void *)psMouseDevice);
- }
- else
- {
- return((void *)0);
- }
-}
-
-//*****************************************************************************
-//
-//! Initializes HID mouse device operation for a given USB controller.
-//!
-//! \param ui32Index is the index of the USB controller which is to be
-//! initialized for HID mouse device operation.
-//! \param psMouseDevice points to a structure containing parameters
-//! customizing the operation of the HID mouse device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! This call is very similar to USBDHIDMouseInit() except that it is used for
-//! initializing an instance of the HID mouse device for use in a composite
-//! device. If this HID mouse is part of a composite device, then the
-//! \e psCompEntry should point to the composite device entry to initialize.
-//! This is part of the array that is passed to the USBDCompositeInit()
-//! function.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB HID Mouse APIs.
-//
-//*****************************************************************************
-void *
-USBDHIDMouseCompositeInit(uint32_t ui32Index,
- tUSBDHIDMouseDevice *psMouseDevice,
- tCompositeEntry *psCompEntry)
-{
- tHIDMouseInstance *psInst;
- tUSBDHIDDevice *psHIDDevice;
-
-
- //
- // Check parameter validity.
- //
- ASSERT(psMouseDevice);
- ASSERT(psMouseDevice->ppui8StringDescriptors);
- ASSERT(psMouseDevice->pfnCallback);
-
- //
- // Get a pointer to our instance data
- //
- psInst = &psMouseDevice->sPrivateData;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- //
- // Initialize the various fields in our instance structure.
- //
- psInst->ui8USBConfigured = 0;
- psInst->ui8Protocol = USB_HID_PROTOCOL_REPORT;
- psInst->sReportIdle.ui8Duration4mS = 0;
- psInst->sReportIdle.ui8ReportID = 0;
- psInst->sReportIdle.ui32TimeSinceReportmS = 0;
- psInst->sReportIdle.ui16TimeTillNextmS = 0;
- psInst->iMouseState = eHIDMouseStateUnconfigured;
-
- //
- // Initialize the HID device class instance structure based on input from
- // the caller.
- //
- psHIDDevice->ui16PID = psMouseDevice->ui16PID;
- psHIDDevice->ui16VID = psMouseDevice->ui16VID;
- psHIDDevice->ui16MaxPowermA = psMouseDevice->ui16MaxPowermA;
- psHIDDevice->ui8PwrAttributes = psMouseDevice->ui8PwrAttributes;
- psHIDDevice->ui8Subclass = USB_HID_SCLASS_BOOT;
- psHIDDevice->ui8Protocol = USB_HID_PROTOCOL_MOUSE;
- psHIDDevice->ui8NumInputReports = 1;
- psHIDDevice->psReportIdle = &psInst->sReportIdle;
- psHIDDevice->pfnRxCallback = HIDMouseRxHandler;
- psHIDDevice->pvRxCBData = (void *)psMouseDevice;
- psHIDDevice->pfnTxCallback = HIDMouseTxHandler;
- psHIDDevice->pvTxCBData = (void *)psMouseDevice;
- psHIDDevice->bUseOutEndpoint = false;
- psHIDDevice->psHIDDescriptor = &g_sMouseHIDDescriptor;
- psHIDDevice->ppui8ClassDescriptors = g_pui8MouseClassDescriptors;
- psHIDDevice->ppui8StringDescriptors =
- psMouseDevice->ppui8StringDescriptors;
- psHIDDevice->ui32NumStringDescriptors =
- psMouseDevice->ui32NumStringDescriptors;
- psHIDDevice->ppsConfigDescriptor = g_ppsHIDConfigDescriptors;
-
- //
- // Initialize the lower layer HID driver and pass it the various structures
- // and descriptors necessary to declare that we are a keyboard.
- //
- return(USBDHIDCompositeInit(ui32Index, psHIDDevice, psCompEntry));
-}
-
-//*****************************************************************************
-//
-//! Shuts down the HID mouse device.
-//!
-//! \param pvMouseDevice is the pointer to the device instance structure.
-//!
-//! This function terminates HID mouse operation for the instance supplied
-//! and removes the device from the USB bus. Following this call, the
-//! \e pvMouseDevice instance may not me used in any other call to the HID
-//! mouse device other than USBDHIDMouseInit().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDMouseTerm(void *pvMouseDevice)
-{
- tUSBDHIDMouseDevice *psMouseDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvMouseDevice);
-
- //
- // Get a pointer to the device.
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- //
- // Mark our device as no longer configured.
- //
- psMouseDevice->sPrivateData.ui8USBConfigured = 0;
-
- //
- // Terminate the low level HID driver.
- //
- USBDHIDTerm(psHIDDevice);
-}
-
-//*****************************************************************************
-//
-//! Sets the client-specific pointer parameter for the mouse callback.
-//!
-//! \param pvMouseDevice is the pointer to the mouse device instance structure.
-//! \param pvCBData is the pointer that client wishes to be provided on
-//! each event sent to the mouse callback function.
-//!
-//! The client uses this function to change the callback pointer passed in
-//! the first parameter on all callbacks to the \e pfnCallback function
-//! passed on USBDHIDMouseInit().
-//!
-//! If a client wants to make runtime changes in the callback pointer, it must
-//! ensure that the pvMouseDevice structure passed to USBDHIDMouseInit()
-//! resides in RAM. If this structure is in flash, callback data changes are
-//! not possible.
-//!
-//! \return Returns the previous callback pointer that was set for this
-//! instance.
-//
-//*****************************************************************************
-void *
-USBDHIDMouseSetCBData(void *pvMouseDevice, void *pvCBData)
-{
- void *pvOldCBData;
- tUSBDHIDMouseDevice *psMouse;
-
- //
- // Check for a NULL pointer in the device parameter.
- //
- ASSERT(pvMouseDevice);
-
- //
- // Get a pointer to our mouse device.
- //
- psMouse = (tUSBDHIDMouseDevice *)pvMouseDevice;
-
- //
- // Save the old callback pointer and replace it with the new value.
- //
- pvOldCBData = psMouse->pvCBData;
- psMouse->pvCBData = pvCBData;
-
- //
- // Pass the old callback pointer back to the caller.
- //
- return(pvOldCBData);
-}
-
-//*****************************************************************************
-//
-//! Reports a mouse state change, pointer movement or button press, to the USB
-//! host.
-//!
-//! \param pvMouseDevice is the pointer to the mouse device instance structure.
-//! \param i8DeltaX is the relative horizontal pointer movement that the
-//! application wishes to report. Valid values are in the range [-127, 127]
-//! with positive values indicating movement to the right.
-//! \param i8DeltaY is the relative vertical pointer movement that the
-//! application wishes to report. Valid values are in the range [-127, 127]
-//! with positive values indicating downward movement.
-//! \param ui8Buttons is a bit mask indicating which (if any) of the three
-//! mouse buttons is pressed. Valid values are logical OR combinations of
-//! \b MOUSE_REPORT_BUTTON_1, \b MOUSE_REPORT_BUTTON_2 and
-//! \b MOUSE_REPORT_BUTTON_3.
-//!
-//! This function is called to report changes in the mouse state to the USB
-//! host. These changes can be movement of the pointer, reported relative to
-//! its previous position, or changes in the states of up to 3 buttons that
-//! the mouse may support. The return code indicates whether or not the
-//! mouse report could be sent to the host. In cases where a previous
-//! report is still being transmitted, \b MOUSE_ERR_TX_ERROR will be returned
-//! and the state change will be ignored.
-//!
-//! \return Returns \b MOUSE_SUCCESS on success, \b MOUSE_ERR_TX_ERROR if an
-//! error occurred while attempting to schedule transmission of the mouse
-//! report to the host (typically due to a previous report which has not yet
-//! completed transmission or due to disconnection of the host) or \b
-//! MOUSE_ERR_NOT_CONFIGURED if called before a host has connected to and
-//! configured the device.
-//
-//*****************************************************************************
-uint32_t
-USBDHIDMouseStateChange(void *pvMouseDevice, int8_t i8DeltaX, int8_t i8DeltaY,
- uint8_t ui8Buttons)
-{
- uint32_t ui32Retcode, ui32Count;
- tHIDMouseInstance *psInst;
- tUSBDHIDMouseDevice *psMouseDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- //
- // Get a pointer to the device.
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- //
- // Get a pointer to our instance data
- //
- psInst = &psMouseDevice->sPrivateData;
-
- //
- // Update the global mouse report with the information passed.
- //
- psInst->pui8Report[HID_REPORT_BUTTONS] = ui8Buttons;
- psInst->pui8Report[HID_REPORT_X] = (uint8_t)i8DeltaX;
- psInst->pui8Report[HID_REPORT_Y] = (uint8_t)i8DeltaY;
-
- //
- // If we are not configured, return an error here before trying to send
- // anything.
- //
- if(!psInst->ui8USBConfigured)
- {
- return(MOUSE_ERR_NOT_CONFIGURED);
- }
-
- //
- // Only send a report if the transmitter is currently free.
- //
- if(USBDHIDTxPacketAvailable((void *)psHIDDevice))
- {
- //
- // Send the report to the host.
- //
- psInst->iMouseState = eHIDMouseStateSend;
- ui32Count = USBDHIDReportWrite((void *)psHIDDevice,
- psInst->pui8Report, MOUSE_REPORT_SIZE,
- true);
-
- //
- // Did we schedule a packet for transmission correctly?
- //
- if(!ui32Count)
- {
- //
- // No - report the error to the caller.
- //
- ui32Retcode = MOUSE_ERR_TX_ERROR;
- }
- else
- {
- ui32Retcode = MOUSE_SUCCESS;
- }
- }
- else
- {
- ui32Retcode = MOUSE_ERR_TX_ERROR;
- }
- //
- // Return the relevant error code to the caller.
- //
- return(ui32Retcode);
-}
-
-//*****************************************************************************
-//
-//! Reports the device power status (bus- or self-powered) to the USB library.
-//!
-//! \param pvMouseDevice is the pointer to the mouse device instance structure.
-//! \param ui8Power indicates the current power status, either \b
-//! USB_STATUS_SELF_PWR or \b USB_STATUS_BUS_PWR.
-//!
-//! Applications which support switching between bus- or self-powered
-//! operation should call this function whenever the power source changes
-//! to indicate the current power status to the USB library. This information
-//! is required by the USB library to allow correct responses to be provided
-//! when the host requests status from the device.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDHIDMousePowerStatusSet(void *pvMouseDevice, uint8_t ui8Power)
-{
- tUSBDHIDMouseDevice *psMouseDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvMouseDevice);
-
- //
- // Get the keyboard device pointer.
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- //
- // Pass the request through to the lower layer.
- //
- USBDHIDPowerStatusSet((void *)psHIDDevice, ui8Power);
-}
-
-//*****************************************************************************
-//
-//! Requests a remote wake up to resume communication when in suspended state.
-//!
-//! \param pvMouseDevice is the pointer to the mouse device instance structure.
-//!
-//! When the bus is suspended, an application which supports remote wake up
-//! (advertised to the host via the configuration descriptor) may call this
-//! function to initiate remote wake up signaling to the host. If the remote
-//! wake up feature has not been disabled by the host, this will cause the bus
-//! to resume operation within 20mS. If the host has disabled remote wake up,
-//! \b false will be returned to indicate that the wake up request was not
-//! successful.
-//!
-//! \return Returns \b true if the remote wake up is not disabled and the
-//! signaling was started or \b false if remote wake up is disabled or if
-//! signaling is currently ongoing following a previous call to this function.
-//
-//*****************************************************************************
-bool
-USBDHIDMouseRemoteWakeupRequest(void *pvMouseDevice)
-{
- tUSBDHIDMouseDevice *psMouseDevice;
- tUSBDHIDDevice *psHIDDevice;
-
- ASSERT(pvMouseDevice);
-
- //
- // Get the keyboard device pointer.
- //
- psMouseDevice = (tUSBDHIDMouseDevice *)pvMouseDevice;
-
- //
- // Get a pointer to the HID device data.
- //
- psHIDDevice = &psMouseDevice->sPrivateData.sHIDDevice;
-
- //
- // Pass the request through to the lower layer.
- //
- return(USBDHIDRemoteWakeupRequest((void *)&psHIDDevice));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.h
deleted file mode 100644
index 2c7f09c88..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdhidmouse.h
+++ /dev/null
@@ -1,299 +0,0 @@
-//*****************************************************************************
-//
-// usbdhidmouse.h - Public header file for the USB HID Mouse device class
-// driver
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDHIDMOUSE_H__
-#define __USBDHIDMOUSE_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup hid_mouse_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The first few sections of this header are private defines that are used by
-// the USB HID mouse code and are here only to help with the application
-// allocating the correct amount of memory for the HID mouse device code.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// The size of the mouse input report sent to the host.
-//
-//*****************************************************************************
-#define MOUSE_REPORT_SIZE 3
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This enumeration holds the various states that the mouse can be in during
-// normal operation.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // Unconfigured.
- //
- eHIDMouseStateUnconfigured,
-
- //
- // No keys to send and not waiting on data.
- //
- eHIDMouseStateIdle,
-
- //
- // Waiting on report data from the host.
- //
- eHIDMouseStateWaitData,
-
- //
- // Waiting on data to be sent out.
- //
- eHIDMouseStateSend
-}
-tMouseState;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure provides the private instance data structure for the USB
-// HID Mouse device. This structure forms the RAM workspace used by each
-// instance of the mouse.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The USB configuration number set by the host or 0 of the device is
- // currently unconfigured.
- //
- uint8_t ui8USBConfigured;
-
- //
- // The protocol requested by the host, USB_HID_PROTOCOL_BOOT or
- // USB_HID_PROTOCOL_REPORT.
- //
- uint8_t ui8Protocol;
-
- //
- // A buffer used to hold the last input report sent to the host.
- //
- uint8_t pui8Report[MOUSE_REPORT_SIZE];
-
- //
- // The current state of the mouse interrupt IN endpoint.
- //
- volatile tMouseState iMouseState;
-
- //
- // The idle timeout control structure for our input report. This is
- // required by the lower level HID driver.
- //
- tHIDReportIdle sReportIdle;
-
- //
- // This is needed for the lower level HID driver.
- //
- tUSBDHIDDevice sHIDDevice;
-}
-tHIDMouseInstance;
-
-//*****************************************************************************
-//
-//! This structure is used by the application to define operating parameters
-//! for the HID mouse device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self- or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of events relating to the operation of the mouse.
- //
- const tUSBCallback pfnCallback;
-
- //
- //! A client-supplied pointer which will be sent as the first
- //! parameter in all calls made to the mouse callback, pfnCallback.
- //
- void *pvCBData;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1),HID
- //! Interface description string (language 1), Configuration description
- //! string (language 1).
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be (1 + (5 * (num languages))).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! The private instance data for this device. This memory must
- //! remain accessible for as long as the mouse device is in use and must
- //! not be modified by any code outside the HID mouse driver.
- //
- tHIDMouseInstance sPrivateData;
-}
-tUSBDHIDMouseDevice;
-
-//*****************************************************************************
-//
-//! This return code from USBDHIDMouseStateChange indicates success.
-//
-//*****************************************************************************
-#define MOUSE_SUCCESS 0
-
-//*****************************************************************************
-//
-//! This return code from USBDHIDMouseStateChange indicates that an error was
-//! reported while attempting to send a report to the host. A client should
-//! assume that the host has disconnected if this return code is seen.
-//
-//*****************************************************************************
-#define MOUSE_ERR_TX_ERROR 2
-
-//*****************************************************************************
-//
-//! USBDHIDMouseStateChange returns this value if it is called before the
-//! USB host has connected and configured the device. All mouse state
-//! information passed on the call will have been ignored.
-//
-//*****************************************************************************
-#define MOUSE_ERR_NOT_CONFIGURED \
- 4
-
-//*****************************************************************************
-//
-//! Setting this bit in the ui8Buttons parameter to USBDHIDMouseStateChange
-//! indicates to the USB host that button 1 on the mouse is pressed.
-//
-//*****************************************************************************
-#define MOUSE_REPORT_BUTTON_1 0x01
-
-//*****************************************************************************
-//
-//! Setting this bit in the ui8Buttons parameter to USBDHIDMouseStateChange
-//! indicates to the USB host that button 2 on the mouse is pressed.
-//
-//*****************************************************************************
-#define MOUSE_REPORT_BUTTON_2 0x02
-
-//*****************************************************************************
-//
-//! Setting this bit in the ui8Buttons parameter to USBDHIDMouseStateChange
-//! indicates to the USB host that button 3 on the mouse is pressed.
-//
-//*****************************************************************************
-#define MOUSE_REPORT_BUTTON_3 0x04
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDHIDMouseInit(uint32_t ui32Index,
- tUSBDHIDMouseDevice *psMouseDevice);
-extern void *USBDHIDMouseCompositeInit(uint32_t ui32Index,
- tUSBDHIDMouseDevice *psMouseDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDHIDMouseTerm(void *pvMouseDevice);
-extern void *USBDHIDMouseSetCBData(void *pvMouseDevice, void *pvCBData);
-extern uint32_t USBDHIDMouseStateChange(void *pvMouseDevice, int8_t i8DeltaX,
- int8_t i8DeltaY, uint8_t ui8Buttons);
-extern void USBDHIDMousePowerStatusSet(void *pvMouseDevice,
- uint8_t ui8Power);
-extern bool USBDHIDMouseRemoteWakeupRequest(void *pvMouseDevice);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBDHIDMOUSE_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.c
deleted file mode 100644
index c2acf192c..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.c
+++ /dev/null
@@ -1,2129 +0,0 @@
-//*****************************************************************************
-//
-// usbdmsc.c - USB mass storage device class driver.
-//
-// Copyright (c) 2009-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbmsc.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/device/usbdmsc.h"
-
-//*****************************************************************************
-//
-//! \addtogroup msc_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// These are the internal flags used with the ui32Flags member variable.
-//
-//*****************************************************************************
-#define USBD_FLAG_DMA_IN 0x00000001
-#define USBD_FLAG_DMA_OUT 0x00000002
-
-//*****************************************************************************
-//
-// The subset of endpoint status flags that we consider to be reception
-// errors. These are passed to the client via USB_EVENT_ERROR if seen.
-//
-//*****************************************************************************
-#define USB_RX_ERROR_FLAGS (USBERR_DEV_RX_DATA_ERROR | \
- USBERR_DEV_RX_OVERRUN | \
- USBERR_DEV_RX_FIFO_FULL)
-
-//*****************************************************************************
-//
-// These are fields that are used by the USB descriptors for the Mass Storage
-// Class.
-//
-//*****************************************************************************
-#define USB_MSC_SUBCLASS_SCSI 0x6
-#define USB_MSC_PROTO_BULKONLY 0x50
-
-//*****************************************************************************
-//
-// Endpoints to use for each of the required endpoints in the driver.
-//
-//*****************************************************************************
-#define DATA_IN_ENDPOINT USB_EP_1
-#define DATA_OUT_ENDPOINT USB_EP_1
-
-//*****************************************************************************
-//
-// Maximum packet size for the bulk endpoints is 64 bytes.
-//
-//*****************************************************************************
-#define DATA_IN_EP_MAX_SIZE 64
-#define DATA_OUT_EP_MAX_SIZE 64
-
-//*****************************************************************************
-//
-// These defines control the sizes of USB transfers for data and commands.
-//
-//*****************************************************************************
-#define MAX_TRANSFER_SIZE 512
-#define COMMAND_BUFFER_SIZE 64
-
-//*****************************************************************************
-//
-// The local buffer used to read in commands and process them.
-//
-//*****************************************************************************
-static uint8_t g_pui8Command[COMMAND_BUFFER_SIZE];
-
-//*****************************************************************************
-//
-// The current transfer state is held in these variables.
-//
-//*****************************************************************************
-static tMSCCSW g_sSCSICSW;
-
-//*****************************************************************************
-//
-// The current state for the SCSI commands that are being handled and are
-// stored in the tMSCInstance.ui8SCSIState structure member.
-//
-//*****************************************************************************
-
-//
-// No command in process.
-//
-#define STATE_SCSI_IDLE 0x00
-
-//
-// Sending and reading logical blocks.
-//
-#define STATE_SCSI_SEND_BLOCKS 0x01
-
-//
-// Receiving and writing logical blocks.
-//
-#define STATE_SCSI_RECEIVE_BLOCKS 0x02
-
-//
-// Send the status once the previous transfer is complete.
-//
-#define STATE_SCSI_SEND_STATUS 0x03
-
-//
-// Status was prepared to be sent and now waiting for it to have gone out.
-//
-#define STATE_SCSI_SENT_STATUS 0x04
-
-//*****************************************************************************
-//
-// Device Descriptor. This is stored in RAM to allow several fields to be
-// changed at runtime based on the client's requirements.
-//
-//*****************************************************************************
-static uint8_t g_pui8MSCDeviceDescriptor[] =
-{
- 18, // Size of this structure.
- USB_DTYPE_DEVICE, // Type of this structure.
- USBShort(0x110), // USB version 1.1 (if we say 2.0, hosts
- // assume
- // high-speed - see USB 2.0 spec 9.2.6.6)
- 0, // USB Device Class (spec 5.1.1)
- 0, // USB Device Sub-class (spec 5.1.1)
- 0, // USB Device protocol (spec 5.1.1)
- 64, // Maximum packet size for default pipe.
- USBShort(0), // Vendor ID (filled in during
- // USBDCDCInit).
- USBShort(0), // Product ID (filled in during
- // USBDCDCInit).
- USBShort(0x100), // Device Version BCD.
- 1, // Manufacturer string identifier.
- 2, // Product string identifier.
- 3, // Product serial number.
- 1 // Number of configurations.
-};
-
-//*****************************************************************************
-//
-// Mass storage device configuration descriptor.
-//
-// It is vital that the configuration descriptor bConfigurationValue field
-// (byte 6) is 1 for the first configuration and increments by 1 for each
-// additional configuration defined here. This relationship is assumed in the
-// device stack for simplicity even though the USB 2.0 specification imposes
-// no such restriction on the bConfigurationValue values.
-//
-// Note that this structure is deliberately located in RAM since we need to
-// be able to patch some values in it based on client requirements.
-//
-//*****************************************************************************
-static uint8_t g_pui8MSCDescriptor[] =
-{
- //
- // Configuration descriptor header.
- //
- 9, // Size of the configuration descriptor.
- USB_DTYPE_CONFIGURATION, // Type of this descriptor.
- USBShort(32), // The total size of this full structure.
- 1, // The number of interfaces in this
- // configuration.
- 1, // The unique value for this configuration.
- 0, // The string identifier that describes
- // this configuration.
- USB_CONF_ATTR_SELF_PWR, // Bus Powered, Self Powered, remote wake
- // up.
- 250, // The maximum power in 2mA increments.
-};
-
-//*****************************************************************************
-//
-// The remainder of the configuration descriptor is stored in flash since we
-// don't need to modify anything in it at runtime.
-//
-//*****************************************************************************
-const uint8_t g_pui8MSCInterface[MSCINTERFACE_SIZE] =
-{
- //
- // Vendor-specific Interface Descriptor.
- //
- 9, // Size of the interface descriptor.
- USB_DTYPE_INTERFACE, // Type of this descriptor.
- 0, // The index for this interface.
- 0, // The alternate setting for this
- // interface.
- 2, // The number of endpoints used by this
- // interface.
- USB_CLASS_MASS_STORAGE, // The interface class
- USB_MSC_SUBCLASS_SCSI, // The interface sub-class.
- USB_MSC_PROTO_BULKONLY, // The interface protocol for the sub-class
- // specified above.
- 0, // The string index for this interface.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_IN | USBEPToIndex(DATA_IN_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_IN_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-
- //
- // Endpoint Descriptor
- //
- 7, // The size of the endpoint descriptor.
- USB_DTYPE_ENDPOINT, // Descriptor type is an endpoint.
- USB_EP_DESC_OUT | USBEPToIndex(DATA_OUT_ENDPOINT),
- USB_EP_ATTR_BULK, // Endpoint is a bulk endpoint.
- USBShort(DATA_OUT_EP_MAX_SIZE), // The maximum packet size.
- 0, // The polling interval for this endpoint.
-};
-
-//*****************************************************************************
-//
-// The mass storage configuration descriptor is defined as two sections,
-// one containing just the 9 byte USB configuration descriptor and the other
-// containing everything else that is sent to the host along with it.
-//
-//*****************************************************************************
-const tConfigSection g_sMSCConfigSection =
-{
- sizeof(g_pui8MSCDescriptor),
- g_pui8MSCDescriptor
-};
-
-const tConfigSection g_sMSCInterfaceSection =
-{
- sizeof(g_pui8MSCInterface),
- g_pui8MSCInterface
-};
-
-//*****************************************************************************
-//
-// This array lists all the sections that must be concatenated to make a
-// single, complete bulk device configuration descriptor.
-//
-//*****************************************************************************
-const tConfigSection *g_psMSCSections[] =
-{
- &g_sMSCConfigSection,
- &g_sMSCInterfaceSection
-};
-
-#define NUM_MSC_SECTIONS (sizeof(g_psMSCSections) / \
- sizeof(g_psMSCSections[0]))
-
-//*****************************************************************************
-//
-// The header for the single configuration we support. This is the root of
-// the data structure that defines all the bits and pieces that are pulled
-// together to generate the configuration descriptor.
-//
-//*****************************************************************************
-const tConfigHeader g_sMSCConfigHeader =
-{
- NUM_MSC_SECTIONS,
- g_psMSCSections
-};
-
-//*****************************************************************************
-//
-// Configuration Descriptor.
-//
-//*****************************************************************************
-const tConfigHeader * const g_ppsMSCConfigDescriptors[] =
-{
- &g_sMSCConfigHeader
-};
-
-//*****************************************************************************
-//
-// Various internal handlers needed by this class.
-//
-//*****************************************************************************
-static void HandleDisconnect(void *pvMSCDevice);
-static void ConfigChangeHandler(void *pvMSCDevice, uint32_t ui32Value);
-static void HandleEndpoints(void *pvMSCDevice, uint32_t ui32Status);
-static void HandleRequests(void *pvMSCDevice, tUSBRequest *psUSBRequest);
-static void USBDSCSISendStatus(tUSBDMSCDevice *psMSCDevice);
-uint32_t USBDSCSICommand(tUSBDMSCDevice *psMSCDevice, tMSCCBW *psSCSICBW);
-static void HandleDevice(void *pvMSCDevice, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-// The device information structure for the USB MSC device.
-//
-//*****************************************************************************
-const tCustomHandlers g_sMSCHandlers =
-{
- //
- // GetDescriptor
- //
- 0,
-
- //
- // RequestHandler
- //
- HandleRequests,
-
- //
- // InterfaceChange
- //
- 0,
-
- //
- // ConfigChange
- //
- ConfigChangeHandler,
-
- //
- // DataReceived
- //
- 0,
-
- //
- // DataSentCallback
- //
- 0,
-
- //
- // ResetHandler
- //
- 0,
-
- //
- // SuspendHandler
- //
- 0,
-
- //
- // ResumeHandler
- //
- 0,
-
- //
- // DisconnectHandler
- //
- HandleDisconnect,
-
- //
- // EndpointHandler
- //
- HandleEndpoints,
-
- //
- // Device handler
- //
- HandleDevice
-};
-
-//*****************************************************************************
-//
-//! This function is used by an application if it can detect insertion or
-//! removal of the media.
-//!
-//! \param pvMSCDevice is the mass storage device instance that had a media
-//! change.
-//! \param iMediaStatus is the updated status for the media.
-//!
-//! This function should be called by an application when it detects a change
-//! in the status of the media in use by the USB mass storage class. The
-//! \e iMediaStatus parameter will indicate the new status of the media and
-//! can also indicate that the application has no knowledge of the media state.
-//!
-//! There are currently the three following values for the \e iMediaStatus
-//! parameter:
-//! - eUSBDMSCMediaPresent indicates that the media is present or has been
-//! added.
-//! - eUSBDMSCMediaNotPresent indicates that the media is not present or was
-//! removed.
-//! - eUSBDMSCMediaUnknown indicates that the application has no knowledge of
-//! the media state and the USB mass storage class.
-//!
-//! It will be left up to the application to call this function whenever it
-//! detects a change or simply call it once with eUSBDMSCMediaUnknown and
-//! allow the mass storage class to infer the state from the remaining device
-//! APIs.
-//!
-//! \note It is recommended that the application use this function to inform
-//! the mass storage class of media state changes as it will lead to a more
-//! responsive system.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDMSCMediaChange(void *pvMSCDevice, tUSBDMSCMediaStatus iMediaStatus)
-{
- tUSBDMSCDevice *psMSCDevice;
-
- //
- // Create a device instance pointer.
- //
- psMSCDevice = pvMSCDevice;
-
- //
- // Save the current media status.
- //
- psMSCDevice->sPrivateData.iMediaStatus = iMediaStatus;
-}
-
-//*****************************************************************************
-//
-// This function is called to handle the interrupts on the Bulk endpoints for
-// the mass storage class.
-//
-//*****************************************************************************
-static void
-HandleEndpoints(void *pvMSCDevice, uint32_t ui32Status)
-{
- tUSBDMSCDevice *psMSCDevice;
- tMSCInstance *psInst;
- tMSCCBW *psSCSICBW;
- uint32_t ui32EPStatus, ui32Size;
-
- ASSERT(pvMSCDevice != 0);
-
- //
- // Determine if the serial device is in single or composite mode because
- // the meaning of ui32Index is different in both cases.
- //
- psMSCDevice = pvMSCDevice;
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // Get the endpoints status.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, psInst->ui8OUTEndpoint);
-
- //
- // Handler for the bulk IN data endpoint.
- //
- if((ui32Status & (1 << USBEPToIndex(psInst->ui8INEndpoint))) ||
- ((psInst->ui32Flags & USBD_FLAG_DMA_IN) &&
- (USBLibDMAChannelStatus(psInst->psDMAInstance, psInst->ui8INDMA) &
- USBLIBSTATUS_DMA_COMPLETE)))
- {
- switch(psInst->ui8SCSIState)
- {
- //
- // Handle the case where we are sending out data due to a read
- // command.
- //
- case STATE_SCSI_SEND_BLOCKS:
- {
- //
- // Decrement the number of bytes left to send.
- //
- psInst->ui32BytesToTransfer -= MAX_TRANSFER_SIZE;
-
- //
- // If we are done then move on to the status phase.
- //
- if(psInst->ui32BytesToTransfer == 0)
- {
- //
- // Set the status so that it can be sent when this
- // response has has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // DMA has completed for the IN endpoint.
- //
- psInst->ui32Flags &= ~USBD_FLAG_DMA_IN;
-
- //
- // Disable uDMA on the endpoint
- //
- MAP_USBEndpointDMADisable(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
-
- if(psMSCDevice->pfnEventCallback)
- {
- psMSCDevice->pfnEventCallback(0, USBD_MSC_EVENT_IDLE,
- 0, 0);
- }
-
- //
- // Make sure that the transfer has actually finished. If
- // it has not there will be another interrupt to send
- // out the status.
- //
- if(USBEndpointStatus(USB0_BASE,psInst->ui8INEndpoint) &
- USB_DEV_TX_TXPKTRDY)
- {
- //
- // Send back the status once this transfer is complete.
- //
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
- }
- else
- {
- //
- // Indicate success and no extra data coming.
- //
- USBDSCSISendStatus(psMSCDevice);
- }
-
- //
- // The transfer is complete so don't read anymore data.
- //
- break;
- }
-
- //
- // Move on to the next Logical Block.
- //
- psInst->ui32CurrentLBA++;
-
- //
- // Read the new data and send it out.
- //
- if(psMSCDevice->sMediaFunctions.pfnBlockRead(psInst->pvMedia,
- (uint8_t *)psInst->pui32Buffer,
- psInst->ui32CurrentLBA, 1) == 0)
- {
- }
-
- //
- // Configure and enable DMA for the IN transfer.
- //
- USBLibDMATransfer(psInst->psDMAInstance,
- psInst->ui8INDMA, psInst->pui32Buffer,
- MAX_TRANSFER_SIZE);
-
- //
- // Start the DMA transfer.
- //
- USBLibDMAChannelEnable(psInst->psDMAInstance,
- psInst->ui8INDMA);
-
- break;
- }
-
- //
- // Handle sending status.
- //
- case STATE_SCSI_SEND_STATUS:
- {
- //
- // Indicate success and no extra data coming.
- //
- USBDSCSISendStatus(psMSCDevice);
-
- break;
- }
-
- //
- // Handle completing sending status.
- //
- case STATE_SCSI_SENT_STATUS:
- {
- psInst->ui8SCSIState = STATE_SCSI_IDLE;
-
- break;
- }
-
- //
- // These cases should not occur as the being in the IDLE state due
- // to an IN interrupt is invalid.
- //
- case STATE_SCSI_IDLE:
- default:
- {
- break;
- }
- }
- }
-
- //
- // Handler for the bulk OUT data endpoint.
- //
- if((ui32Status & (0x10000 << USBEPToIndex(psInst->ui8OUTEndpoint))) ||
- ((psInst->ui32Flags & USBD_FLAG_DMA_OUT) &&
- (USBLibDMAChannelStatus(psInst->psDMAInstance, psInst->ui8OUTDMA) &
- USBLIBSTATUS_DMA_COMPLETE)))
- {
- //
- // Get the endpoint status to see why we were called.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE,
- psInst->ui8OUTEndpoint);
-
- switch(psInst->ui8SCSIState)
- {
- //
- // Receiving and writing bytes to the storage device.
- //
- case STATE_SCSI_RECEIVE_BLOCKS:
- {
- //
- // Update the current status for the buffer.
- //
- psInst->ui32BytesToTransfer -= MAX_TRANSFER_SIZE;
-
- //
- // Write the new data.
- //
- psMSCDevice->sMediaFunctions.pfnBlockWrite(psInst->pvMedia,
- (uint8_t *)psInst->pui32Buffer,
- psInst->ui32CurrentLBA, 1);
-
- //
- // Move on to the next Logical Block.
- //
- psInst->ui32CurrentLBA++;
-
- //
- // Check if all bytes have been received.
- //
- if(psInst->ui32BytesToTransfer == 0)
- {
- //
- // Set the status so that it can be sent when this response
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // DMA has completed for the OUT endpoint.
- //
- psInst->ui32Flags &= ~USBD_FLAG_DMA_OUT;
-
- //
- // Indicate success and no extra data coming.
- //
- USBDSCSISendStatus(psMSCDevice);
-
- //
- // Disable uDMA on the endpoint
- //
- MAP_USBEndpointDMADisable(USB0_BASE,
- psInst->ui8OUTEndpoint,
- USB_EP_DEV_OUT);
-
- //
- // If there is an event callback then call it to notify
- // that last operation has completed.
- //
- if(psMSCDevice->pfnEventCallback)
- {
- psMSCDevice->pfnEventCallback(0, USBD_MSC_EVENT_IDLE,
- 0, 0);
- }
- }
- else
- {
- //
- // Configure and enable DMA for the OUT transfer.
- //
- USBLibDMATransfer(psInst->psDMAInstance,
- psInst->ui8OUTDMA, psInst->pui32Buffer,
- MAX_TRANSFER_SIZE);
- }
-
- break;
- }
-
- //
- // If there is an OUT transfer in idle state then it was a new
- // command.
- //
- case STATE_SCSI_IDLE:
- {
- //
- // Attempt to handle the new command.
- //
-
- //
- // Receive the command.
- //
- ui32Size = COMMAND_BUFFER_SIZE;
- MAP_USBEndpointDataGet(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint,
- g_pui8Command, &ui32Size);
- psSCSICBW = (tMSCCBW *)g_pui8Command;
-
- //
- // Acknowledge the OUT data packet.
- //
- MAP_USBDevEndpointDataAck(psInst->ui32USBBase,
- psInst->ui8OUTEndpoint, false);
-
- //
- // If this is a valid CBW then handle it.
- //
- if(psSCSICBW->dCBWSignature == CBW_SIGNATURE)
- {
- g_sSCSICSW.dCSWSignature = CSW_SIGNATURE;
- g_sSCSICSW.dCSWTag = psSCSICBW->dCBWTag;
- g_sSCSICSW.dCSWDataResidue = 0;
- g_sSCSICSW.bCSWStatus = 0;
-
- USBDSCSICommand(psMSCDevice, psSCSICBW);
- }
- else
- {
- //
- // Just return to the idle state since we are now out of
- // sync with the host. This should not happen, but this
- // should allow the device to synchronize with the host
- // controller.
- //
- psInst->ui8SCSIState = STATE_SCSI_IDLE;
- }
-
- break;
- }
- default:
- {
- break;
- }
- }
-
- //
- // Clear the status bits.
- //
- MAP_USBDevEndpointStatusClear(USB0_BASE, psInst->ui8OUTEndpoint,
- ui32EPStatus);
- }
-}
-
-//*****************************************************************************
-//
-// Device instance specific handler.
-//
-//*****************************************************************************
-static void
-HandleDevice(void *pvMSCDevice, uint32_t ui32Request, void *pvRequestData)
-{
- tMSCInstance *psInst;
- uint8_t *pui8Data;
-
- //
- // Get the instance data pointers.
- //
- psInst = &((tUSBDMSCDevice *)pvMSCDevice)->sPrivateData;
-
- //
- // Create the 8-bit array used by the events supported by the USB MSC
- // class.
- //
- pui8Data = (uint8_t *)pvRequestData;
-
- switch(ui32Request)
- {
- //
- // This was an interface change event.
- //
- case USB_EVENT_COMP_IFACE_CHANGE:
- {
- psInst->ui8Interface = pui8Data[1];
- break;
- }
-
- //
- // This was an endpoint change event.
- //
- case USB_EVENT_COMP_EP_CHANGE:
- {
- //
- // Determine if this is an IN or OUT endpoint that has changed.
- //
- if(pui8Data[0] & USB_EP_DESC_IN)
- {
- psInst->ui8INEndpoint = IndexToUSBEP((pui8Data[1] & 0x7f));
-
- //
- // If the DMA channel has already been allocated then clear
- // that channel and prepare to possibly use a new one.
- //
- if(psInst->ui8INDMA != 0)
- {
- USBLibDMAChannelRelease(psInst->psDMAInstance,
- psInst->ui8INDMA);
- }
-
- //
- // Allocate a DMA channel to the endpoint.
- //
- psInst->ui8INDMA =
- USBLibDMAChannelAllocate(psInst->psDMAInstance,
- psInst->ui8INEndpoint, 0,
- USB_DMA_EP_TX |
- USB_DMA_EP_DEVICE);
-
- //
- // Set the DMA individual transfer size.
- //
- USBLibDMAUnitSizeSet(psInst->psDMAInstance, psInst->ui8INDMA,
- 32);
-
- //
- // Set the DMA arbitration size.
- //
- USBLibDMAArbSizeSet(psInst->psDMAInstance, psInst->ui8INDMA,
- 16);
- }
- else
- {
- //
- // If the DMA channel has already been allocated then clear
- // that channel and prepare to possibly use a new one.
- //
- if(psInst->ui8OUTDMA != 0)
- {
- USBLibDMAChannelRelease(psInst->psDMAInstance,
- psInst->ui8OUTDMA);
- }
-
- //
- // Allocate a DMA channel to the endpoint.
- //
- psInst->ui8OUTDMA =
- USBLibDMAChannelAllocate(psInst->psDMAInstance,
- psInst->ui8OUTEndpoint, 0,
- USB_DMA_EP_RX |
- USB_DMA_EP_DEVICE);
-
- //
- // Set the DMA individual transfer size.
- //
- USBLibDMAUnitSizeSet(psInst->psDMAInstance, psInst->ui8OUTDMA,
- 32);
-
- //
- // Set the DMA arbitration size.
- //
- USBLibDMAArbSizeSet(psInst->psDMAInstance, psInst->ui8OUTDMA,
- 16);
- }
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device is
-// disconnected from the host.
-//
-//*****************************************************************************
-static void
-HandleDisconnect(void *pvMSCDevice)
-{
- tUSBDMSCDevice *psMSCDevice;
-
- ASSERT(pvMSCDevice != 0);
-
- //
- // Create the instance pointer.
- //
- psMSCDevice = (tUSBDMSCDevice *)pvMSCDevice;
-
- //
- // Close the drive requested.
- //
- if(psMSCDevice->sPrivateData.pvMedia != 0)
- {
- psMSCDevice->sPrivateData.pvMedia = 0;
- psMSCDevice->sMediaFunctions.pfnClose(0);
- }
-
- //
- // If we have a control callback, let the client know we are open for
- // business.
- //
- if(psMSCDevice->pfnEventCallback)
- {
- //
- // Pass the connected event to the client.
- //
- psMSCDevice->pfnEventCallback(pvMSCDevice, USB_EVENT_DISCONNECTED, 0,
- 0);
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever the device
-// configuration changes.
-//
-//*****************************************************************************
-static void
-ConfigChangeHandler(void *pvMSCDevice, uint32_t ui32Value)
-{
- tUSBDMSCDevice *psMSCDevice;
-
- ASSERT(pvMSCDevice != 0);
-
- //
- // Create the instance pointer.
- //
- psMSCDevice = (tUSBDMSCDevice *)pvMSCDevice;
-
- //
- // If the DMA channel has already been allocated then clear
- // that channel and prepare to possibly use a new one.
- //
- if(psMSCDevice->sPrivateData.ui8OUTDMA != 0)
- {
- USBLibDMAChannelRelease(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8OUTDMA);
- }
-
- //
- // Configure the DMA for the OUT endpoint.
- //
- psMSCDevice->sPrivateData.ui8OUTDMA =
- USBLibDMAChannelAllocate(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8OUTEndpoint, 64,
- USB_DMA_EP_RX | USB_DMA_EP_DEVICE);
-
- USBLibDMAUnitSizeSet(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8OUTDMA, 32);
-
- USBLibDMAArbSizeSet(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8OUTDMA, 16);
-
- //
- // If the DMA channel has already been allocated then clear
- // that channel and prepare to possibly use a new one.
- //
- if(psMSCDevice->sPrivateData.ui8INDMA != 0)
- {
- USBLibDMAChannelRelease(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8INDMA);
- }
-
- //
- // Configure the DMA for the IN endpoint.
- //
- psMSCDevice->sPrivateData.ui8INDMA =
- USBLibDMAChannelAllocate(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8INEndpoint, 64,
- USB_DMA_EP_TX | USB_DMA_EP_DEVICE);
-
- USBLibDMAUnitSizeSet(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8INDMA, 32);
-
- USBLibDMAArbSizeSet(psMSCDevice->sPrivateData.psDMAInstance,
- psMSCDevice->sPrivateData.ui8INDMA, 16);
-
- //
- // If we have a control callback, let the client know we are open for
- // business.
- //
- if(psMSCDevice->pfnEventCallback)
- {
- //
- // Pass the connected event to the client.
- //
- psMSCDevice->pfnEventCallback(pvMSCDevice, USB_EVENT_CONNECTED, 0, 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function should be called once for the mass storage class device to
-//! initialized basic operation and prepare for enumeration.
-//!
-//! \param ui32Index is the index of the USB controller to initialize for
-//! mass storage class device operation.
-//! \param psMSCDevice points to a structure containing parameters customizing
-//! the operation of the mass storage device.
-//!
-//! In order for an application to initialize the USB device mass storage
-//! class, it must first call this function with the a valid mass storage
-//! device class structure in the \e psMSCDevice parameter. This allows this
-//! function to initialize the USB controller and device code to be prepared to
-//! enumerate and function as a USB mass storage device.
-//!
-//! This function returns a void pointer that must be passed in to all other
-//! APIs used by the mass storage class.
-//!
-//! See the documentation on the tUSBDMSCDevice structure for more information
-//! on how to properly fill the structure members.
-//!
-//! \return Returns 0 on failure or a non-zero void pointer on success.
-//
-//*****************************************************************************
-void *
-USBDMSCInit(uint32_t ui32Index, tUSBDMSCDevice *psMSCDevice)
-{
- tDeviceDescriptor *psDevDesc;
- tConfigDescriptor *pConfDesc;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psMSCDevice);
- ASSERT(psMSCDevice->ppui8StringDescriptors);
-
- USBDMSCCompositeInit(ui32Index, psMSCDevice, 0);
-
- //
- // Fix up the device descriptor with the client-supplied values.
- //
- psDevDesc = (tDeviceDescriptor *)g_pui8MSCDeviceDescriptor;
- psDevDesc->idVendor = psMSCDevice->ui16VID;
- psDevDesc->idProduct = psMSCDevice->ui16PID;
-
- //
- // Fix up the configuration descriptor with client-supplied values.
- //
- pConfDesc = (tConfigDescriptor *)g_pui8MSCDescriptor;
- pConfDesc->bmAttributes = psMSCDevice->ui8PwrAttributes;
- pConfDesc->bMaxPower = (uint8_t)(psMSCDevice->ui16MaxPowermA / 2);
-
- //
- // All is well so now pass the descriptors to the lower layer and put
- // the bulk device on the bus.
- //
- USBDCDInit(ui32Index, &psMSCDevice->sPrivateData.sDevInfo,
- (void *)psMSCDevice);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psMSCDevice);
-}
-
-//*****************************************************************************
-//
-//! This function should be called once for the mass storage class device to
-//! initialized basic operation and prepare for enumeration.
-//!
-//! \param ui32Index is the index of the USB controller to initialize for
-//! mass storage class device operation.
-//! \param psMSCDevice points to a structure containing parameters customizing
-//! the operation of the mass storage device.
-//! \param psCompEntry is the composite device entry to initialize when
-//! creating a composite device.
-//!
-//! In order for an application to initialize the USB device mass storage
-//! class, it must first call this function with the a valid mass storage
-//! device class structure in the \e psMSCDevice parameter. This allows this
-//! function to initialize the USB controller and device code to be prepared to
-//! enumerate and function as a USB mass storage device. If this mass storage
-//! device is part of a composite device, then the \e psCompEntry should
-//! point to the composite device entry to initialize. This is part of the
-//! array that is passed to the USBDCompositeInit() function.
-//!
-//! This function returns a void pointer that must be passed in to all other
-//! APIs used by the mass storage class.
-//!
-//! See the documentation on the tUSBDMSCDevice structure for more information
-//! on how to properly fill the structure members.
-//!
-//! \return Returns zero on failure or a non-zero instance value that should be
-//! used with the remaining USB mass storage APIs.
-//
-//*****************************************************************************
-void *
-USBDMSCCompositeInit(uint32_t ui32Index, tUSBDMSCDevice *psMSCDevice,
- tCompositeEntry *psCompEntry)
-{
- tMSCInstance *psInst;
-
- //
- // Check parameter validity.
- //
- ASSERT(ui32Index == 0);
- ASSERT(psMSCDevice);
- ASSERT(psMSCDevice->ppui8StringDescriptors);
- ASSERT(psCompEntry != 0);
-
- //
- // Initialize the workspace in the passed instance structure.
- //
- psInst = &psMSCDevice->sPrivateData;
- psInst->ui32USBBase = USB0_BASE;
- psInst->bConnected = false;
- psInst->iMediaStatus = eUSBDMSCMediaUnknown;
-
- //
- // Initialize the composite entry that is used by the composite device
- // class.
- //
- if(psCompEntry != 0)
- {
- psCompEntry->psDevInfo = &psInst->sDevInfo;
- psCompEntry->pvInstance = (void *)psMSCDevice;
- }
-
- //
- // Initialize the device information structure.
- //
- psInst->sDevInfo.psCallbacks = &g_sMSCHandlers;
- psInst->sDevInfo.pui8DeviceDescriptor = g_pui8MSCDeviceDescriptor;
- psInst->sDevInfo.ppsConfigDescriptors = g_ppsMSCConfigDescriptors;
- psInst->sDevInfo.ppui8StringDescriptors = 0;
- psInst->sDevInfo.ui32NumStringDescriptors = 0;
-
- //
- // Initialize the device info structure for the mass storage device.
- //
- USBDCDDeviceInfoInit(0, &psInst->sDevInfo);
-
- //
- // Set the initial interface and endpoints.
- //
- psInst->ui8Interface = 0;
- psInst->ui8OUTEndpoint = DATA_OUT_ENDPOINT;
- psInst->ui8INEndpoint = DATA_IN_ENDPOINT;
-
- //
- // Set the initial SCSI state to idle.
- //
- psInst->ui8SCSIState = STATE_SCSI_IDLE;
-
- //
- // Plug in the client's string stable to the device information
- // structure.
- //
- psInst->sDevInfo.ppui8StringDescriptors =
- psMSCDevice->ppui8StringDescriptors;
- psInst->sDevInfo.ui32NumStringDescriptors =
- psMSCDevice->ui32NumStringDescriptors;
-
- //
- // Open the drive requested.
- //
- psInst->pvMedia = psMSCDevice->sMediaFunctions.pfnOpen(0);
-
- if(psInst->pvMedia == 0)
- {
- //
- // There is no media currently present.
- //
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
- }
- else
- {
- //
- // Media is now ready for use.
- //
- psInst->ui8SenseKey = SCSI_RS_KEY_UNIT_ATTN;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOTRDY2RDY;
- }
-
- //
- // Enable Clocking to the USB controller.
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
-
- //
- // Turn on USB Phy clock.
- //
- MAP_SysCtlUSBPLLEnable();
-
- //
- // Get the DMA instance pointer.
- //
- psInst->psDMAInstance = USBLibDMAInit(0);
-
- //
- // Return the pointer to the instance indicating that everything went well.
- //
- return((void *)psMSCDevice);
-}
-
-//*****************************************************************************
-//
-//! Shuts down the mass storage device.
-//!
-//! \param pvMSCDevice is the pointer to the device instance structure as
-//! returned by USBDMSCInit() or USBDMSCInitComposite().
-//!
-//! This function terminates mass storage operation for the instance supplied
-//! and removes the device from the USB bus. Following this call, the
-//! \e pvMSCDevice instance may not me used in any other call to the mass
-//! storage device other than USBDMSCInit() or USBDMSCInitComposite().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDMSCTerm(void *pvMSCDevice)
-{
- tUSBDMSCDevice *psMSCDevice;
-
- ASSERT(pvMSCDevice != 0);
-
- //
- // Cleanly exit device mode.
- //
- USBDCDTerm(0);
-
- //
- // Create a device instance pointer.
- //
- psMSCDevice = pvMSCDevice;
-
- //
- // If the media was opened the close it out.
- //
- if(psMSCDevice->sPrivateData.pvMedia != 0)
- {
- psMSCDevice->sPrivateData.pvMedia = 0;
- psMSCDevice->sMediaFunctions.pfnClose(0);
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB device stack whenever a non-standard
-// request is received.
-//
-// \param pvMSCDevice is instance data for this request.
-// \param pUSBRequest points to the request received.
-//
-// This call parses the provided request structure to determine the command.
-// The only mass storage command supported over endpoint 0 is the Get Max LUN
-// command.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-HandleRequests(void *pvMSCDevice, tUSBRequest *pUSBRequest)
-{
- //
- // This class only support a single LUN.
- //
- static const uint8_t ui8MaxLun = 0;
-
- ASSERT(pvMSCDevice != 0);
-
- //
- // Determine the type of request.
- //
- switch(pUSBRequest->bRequest)
- {
- //
- // A Set Report request is received from the host when it sends an
- // Output report via endpoint 0.
- //
- case USBREQ_GET_MAX_LUN:
- {
- //
- // Send our response to the host.
- //
- USBDCDSendDataEP0(0, (uint8_t *)&ui8MaxLun, 1);
-
- break;
- }
-
- //
- // This request was not recognized so stall.
- //
- default:
- {
- USBDCDStallEP0(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Inquiry command when it is received
-// from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIInquiry(tUSBDMSCDevice *psMSCDevice)
-{
- int32_t i32Idx;
- tMSCInstance *psInst;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)g_pui8Command;
-
- //
- // Create the serial instance data.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // Direct Access device, Removable storage and SCSI 1 responses.
- //
- pui32Data[0] = SCSI_INQ_PDT_SBC | (SCSI_INQ_RMB << 8);
-
- //
- // Additional Length is fixed at 31 bytes.
- //
- pui32Data[1] = 31;
-
- //
- // Copy the Vendor string.
- //
- for(i32Idx = 0; i32Idx < 8; i32Idx++)
- {
- g_pui8Command[i32Idx + 8] = psMSCDevice->pui8Vendor[i32Idx];
- }
-
- //
- // Copy the Product string.
- //
- for(i32Idx = 0; i32Idx < 16; i32Idx++)
- {
- g_pui8Command[i32Idx + 16] = psMSCDevice->pui8Product[i32Idx];
- }
-
- //
- // Copy the Version string.
- //
- for(i32Idx = 0; i32Idx < 4; i32Idx++)
- {
- g_pui8Command[i32Idx + 32] = psMSCDevice->pui8Version[i32Idx];
- }
-
- //
- // Send the SCSI Inquiry Response.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint, g_pui8Command,
- 36);
-
- //
- // Send the data to the host.
- //
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint, USB_TRANS_IN);
-
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Read Capacities command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIReadCapacities(tUSBDMSCDevice *psMSCDevice)
-{
- uint32_t ui32Blocks;
- tMSCInstance *psInst;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)g_pui8Command;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- if(psInst->pvMedia != 0)
- {
- ui32Blocks =
- psMSCDevice->sMediaFunctions.pfnNumBlocks(psInst->pvMedia);
-
- pui32Data[0] = 0x08000000;
-
- //
- // Fill in the number of blocks, the bytes endianness must be changed.
- //
- g_pui8Command[4] = ui32Blocks >> 24;
- g_pui8Command[5] = 0xff & (ui32Blocks >> 16);
- g_pui8Command[6] = 0xff & (ui32Blocks >> 8);
- g_pui8Command[7] = 0xff & (ui32Blocks);
-
- //
- // Current media capacity
- //
- g_pui8Command[8] = 0x2;
-
- //
- // Fill in the block size, which is fixed at DEVICE_BLOCK_SIZE.
- //
- g_pui8Command[9] = 0xff & (DEVICE_BLOCK_SIZE >> 16);
- g_pui8Command[10] = 0xff & (DEVICE_BLOCK_SIZE >> 8);
- g_pui8Command[11] = 0xff & DEVICE_BLOCK_SIZE;
-
- //
- // Send out the 12 bytes that are in this response.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint, g_pui8Command,
- 12);
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint,
- USB_TRANS_IN);
-
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
- }
- else
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
-
- //
- // Mark the sense code as valid and indicate that these is no media
- // present.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
- }
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Read Capacity command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIReadCapacity(tUSBDMSCDevice *psMSCDevice)
-{
- uint32_t ui32Blocks;
- tMSCInstance *psInst;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- ui32Blocks = psMSCDevice->sMediaFunctions.pfnNumBlocks(psInst->pvMedia);
-
- //
- // Only decrement if any blocks were found.
- //
- if(ui32Blocks != 0)
- {
- //
- // One less than the maximum number is the last addressable
- // block.
- //
- ui32Blocks--;
- }
-
- if(psInst->pvMedia != 0)
- {
- //
- // Fill in the number of blocks, the bytes endianness must be changed.
- //
- g_pui8Command[0] = 0xff & (ui32Blocks >> 24);
- g_pui8Command[1] = 0xff & (ui32Blocks >> 16);
- g_pui8Command[2] = 0xff & (ui32Blocks >> 8);
- g_pui8Command[3] = 0xff & (ui32Blocks);
-
- g_pui8Command[4] = 0;
-
- //
- // Fill in the block size, which is fixed at DEVICE_BLOCK_SIZE.
- //
- g_pui8Command[5] = 0xff & (DEVICE_BLOCK_SIZE >> 16);
- g_pui8Command[6] = 0xff & (DEVICE_BLOCK_SIZE >> 8);
- g_pui8Command[7] = 0xff & DEVICE_BLOCK_SIZE;
-
- //
- // Send the SCSI Inquiry Response.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint, g_pui8Command,
- 8);
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint,
- USB_TRANS_IN);
-
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
- }
- else
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
-
- //
- // Mark the sense code as valid and indicate that these is no media
- // present.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
- }
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Request Sense command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIRequestSense(tUSBDMSCDevice *psMSCDevice)
-{
- tMSCInstance *psInst;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // The request sense response.
- //
- g_pui8Command[0] = psInst->ui8ErrorCode;
- g_pui8Command[1] = 0;
- g_pui8Command[2] = psInst->ui8SenseKey;
- *(uint32_t *)&g_pui8Command[3] = 0;
-
- //
- // There are 10 more bytes of data.
- //
- g_pui8Command[7] = 10;
-
- *(uint32_t *)&g_pui8Command[8] = 0;
-
- //
- // Transition from not ready to ready.
- //
- *(uint16_t *)&g_pui8Command[12] = psInst->ui16AddSenseCode;
- *(uint32_t *)&g_pui8Command[14] = 0;
-
- //
- // Send the SCSI Inquiry Response.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint, g_pui8Command,
- 18);
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint, USB_TRANS_IN);
-
- //
- // Reset the valid flag on errors.
- //
- psInst->ui8ErrorCode = SCSI_RS_CUR_ERRORS;
-
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Move on to the status phase.
- //
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Read 10 command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIRead10(tUSBDMSCDevice *psMSCDevice, tMSCCBW *psSCSICBW)
-{
- uint16_t ui16NumBlocks;
- tMSCInstance *psInst;
-
- //
- // Default the number of blocks.
- //
- ui16NumBlocks = 0;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- if(psInst->pvMedia != 0)
- {
- //
- // Get the logical block from the CBW structure. This switching
- // is required to convert from big to little endian.
- //
- psInst->ui32CurrentLBA = (psSCSICBW->CBWCB[2] << 24) |
- (psSCSICBW->CBWCB[3] << 16) |
- (psSCSICBW->CBWCB[4] << 8) |
- (psSCSICBW->CBWCB[5] << 0);
-
- //
- // More bytes to read.
- //
- ui16NumBlocks = (psSCSICBW->CBWCB[7] << 8) | psSCSICBW->CBWCB[8];
-
- //
- // Read the next logical block from the storage device.
- //
- if(psMSCDevice->sMediaFunctions.pfnBlockRead(psInst->pvMedia,
- (uint8_t *)psInst->pui32Buffer, psInst->ui32CurrentLBA, 1) == 0)
- {
- psInst->pvMedia = 0;
- psMSCDevice->sMediaFunctions.pfnClose(0);
- }
- }
-
- //
- // If there is media present then start transferring the data.
- //
- if(psInst->pvMedia != 0)
- {
- //
- // Configure and DMA for the IN transfer.
- //
- USBLibDMATransfer(psInst->psDMAInstance, psInst->ui8INDMA,
- psInst->pui32Buffer, MAX_TRANSFER_SIZE);
-
- //
- // Remember that a DMA is in progress.
- //
- psInst->ui32Flags |= USBD_FLAG_DMA_IN;
-
- //
- // Schedule the remaining bytes to send.
- //
- psInst->ui32BytesToTransfer = (DEVICE_BLOCK_SIZE * ui16NumBlocks);
-
- //
- // Move on and start sending blocks.
- //
- psInst->ui8SCSIState = STATE_SCSI_SEND_BLOCKS;
-
- if(psMSCDevice->pfnEventCallback)
- {
- psMSCDevice->pfnEventCallback(0, USBD_MSC_EVENT_READING, 0, 0);
- }
- }
- else
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
-
- //
- // Mark the sense code as valid and indicate that these is no media
- // present.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
- }
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Read 10 command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIWrite10(tUSBDMSCDevice *psMSCDevice, tMSCCBW *psSCSICBW)
-{
- uint16_t ui16NumBlocks;
- tMSCInstance *psInst;
-
- //
- // Get instance data pointers.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // If there is media present then start transferring the data.
- //
- if(psInst->pvMedia != 0)
- {
- //
- // Get the logical block from the CBW structure. This switching
- // is required to convert from big to little endian.
- //
- psInst->ui32CurrentLBA = (psSCSICBW->CBWCB[2] << 24) |
- (psSCSICBW->CBWCB[3] << 16) |
- (psSCSICBW->CBWCB[4] << 8) |
- (psSCSICBW->CBWCB[5] << 0);
-
- //
- // More bytes to read.
- //
- ui16NumBlocks = (psSCSICBW->CBWCB[7] << 8) | psSCSICBW->CBWCB[8];
-
- psInst->ui32BytesToTransfer = DEVICE_BLOCK_SIZE * ui16NumBlocks;
-
- //
- // Start sending logical blocks, these are always multiples of
- // DEVICE_BLOCK_SIZE bytes.
- //
- psInst->ui8SCSIState = STATE_SCSI_RECEIVE_BLOCKS;
-
- //
- // Configure and enable DMA for the OUT transfer.
- //
- USBLibDMATransfer(psInst->psDMAInstance, psInst->ui8OUTDMA,
- psInst->pui32Buffer, MAX_TRANSFER_SIZE);
-
- //
- // Remember that a DMA is in progress.
- //
- psInst->ui32Flags |= USBD_FLAG_DMA_OUT;
-
- //
- // Notify the application of the write event.
- //
- if(psMSCDevice->pfnEventCallback)
- {
- psMSCDevice->pfnEventCallback(0, USBD_MSC_EVENT_WRITING, 0, 0);
- }
- }
- else
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8OUTEndpoint,
- USB_EP_DEV_OUT);
-
- //
- // Mark the sense code as valid and indicate that these is no media
- // present.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
- }
-}
-
-//*****************************************************************************
-//
-// This function is used to handle the SCSI Mode Sense 6 command when it is
-// received from the host.
-//
-//*****************************************************************************
-static void
-USBDSCSIModeSense6(tUSBDMSCDevice *psMSCDevice, tMSCCBW *psSCSICBW)
-{
- tMSCInstance *psInst;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // If there is media present send the response.
- //
- if(psInst->pvMedia != 0)
- {
- //
- // Three extra bytes in this response.
- //
- g_pui8Command[0] = 3;
- g_pui8Command[1] = 0;
- g_pui8Command[2] = 0;
- g_pui8Command[3] = 0;
-
- //
- // Manually send the response back to the host.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint, g_pui8Command,
- 4);
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint,
- USB_TRANS_IN);
-
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 0;
- g_sSCSICSW.dCSWDataResidue = psSCSICBW->dCBWDataTransferLength - 4;
- }
- else
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = 0;
-
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
-
- //
- // Mark the sense code as valid and indicate that these is no media
- // present.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_NOT_READY;
- psInst->ui16AddSenseCode = SCSI_RS_MED_NOT_PRSNT;
- }
-
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to send out the response data based on the current
-// status of the mass storage class.
-//
-//*****************************************************************************
-static void
-USBDSCSISendStatus(tUSBDMSCDevice *psMSCDevice)
-{
- tMSCInstance *psInst;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // Respond with the requested status.
- //
- MAP_USBEndpointDataPut(USB0_BASE, psInst->ui8INEndpoint,
- (uint8_t *)&g_sSCSICSW, 13);
- MAP_USBEndpointDataSend(USB0_BASE, psInst->ui8INEndpoint, USB_TRANS_IN);
-
- //
- // Move the state to status sent so that the next interrupt will move the
- // statue to idle.
- //
- psInst->ui8SCSIState = STATE_SCSI_SENT_STATUS;
-}
-
-//*****************************************************************************
-//
-// This function is used to handle all SCSI commands.
-//
-//*****************************************************************************
-uint32_t
-USBDSCSICommand(tUSBDMSCDevice *psMSCDevice, tMSCCBW *psSCSICBW)
-{
- uint32_t ui32RetCode, ui32TransferLength;
- tMSCInstance *psInst;
-
- //
- // Get our instance data pointer.
- //
- psInst = &psMSCDevice->sPrivateData;
-
- //
- // Initialize the return code.
- //
- ui32RetCode = 1;
-
- //
- // Save the transfer length because it may be overwritten by some calls.
- //
- ui32TransferLength = psSCSICBW->dCBWDataTransferLength;
-
- switch(psSCSICBW->CBWCB[0])
- {
- //
- // Respond to the SCSI Inquiry command.
- //
- case SCSI_INQUIRY_CMD:
- {
- USBDSCSIInquiry(psMSCDevice);
-
- break;
- }
-
- //
- // Respond to the test unit ready command.
- //
- case SCSI_TEST_UNIT_READY:
- {
- g_sSCSICSW.dCSWDataResidue = 0;
-
- if(psInst->pvMedia != 0)
- {
- //
- // Set the status to success for now, this could be different
- // if there is no media present.
- //
- g_sSCSICSW.bCSWStatus = 0;
- }
- else
- {
- //
- // Since there was no media, check for media here.
- //
- psInst->pvMedia = psMSCDevice->sMediaFunctions.pfnOpen(0);
-
- //
- // If it is still not present then fail this command.
- //
- if(psInst->pvMedia != 0)
- {
- g_sSCSICSW.bCSWStatus = 0;
- }
- else
- {
- g_sSCSICSW.bCSWStatus = 1;
- }
- }
- break;
- }
-
- //
- // Handle the Read Capacities command.
- //
- case SCSI_READ_CAPACITIES:
- {
- USBDSCSIReadCapacities(psMSCDevice);
-
- break;
- }
-
- //
- // Handle the Read Capacity command.
- //
- case SCSI_READ_CAPACITY:
- {
- USBDSCSIReadCapacity(psMSCDevice);
-
- break;
- }
-
- //
- // Handle the Request Sense command.
- //
- case SCSI_REQUEST_SENSE:
- {
- USBDSCSIRequestSense(psMSCDevice);
-
- break;
- }
-
- //
- // Handle the Read 10 command.
- //
- case SCSI_READ_10:
- {
- USBDSCSIRead10(psMSCDevice, psSCSICBW);
-
- break;
- }
-
- //
- // Handle the Write 10 command.
- //
- case SCSI_WRITE_10:
- {
- USBDSCSIWrite10(psMSCDevice, psSCSICBW);
-
- break;
- }
-
- //
- // Handle the Mode Sense 6 command.
- //
- case SCSI_MODE_SENSE_6:
- {
- USBDSCSIModeSense6(psMSCDevice, psSCSICBW);
-
- break;
- }
- default:
- {
- //
- // Set the status so that it can be sent when this response has
- // has be successfully sent.
- //
- g_sSCSICSW.bCSWStatus = 1;
- g_sSCSICSW.dCSWDataResidue = psSCSICBW->dCBWDataTransferLength;
-
- //
- // If there is data then there is more work to do.
- //
- if(psSCSICBW->dCBWDataTransferLength != 0)
- {
- if(psSCSICBW->bmCBWFlags & CBWFLAGS_DIR_IN)
- {
- //
- // Stall the IN endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8INEndpoint,
- USB_EP_DEV_IN);
- }
- else
- {
- //
- // Stall the OUT endpoint
- //
- MAP_USBDevEndpointStall(USB0_BASE, psInst->ui8OUTEndpoint,
- USB_EP_DEV_OUT);
-
- }
- //
- // Send the status once the stall occurs.
- //
- psInst->ui8SCSIState = STATE_SCSI_SEND_STATUS;
- }
-
- //
- // Set the sense codes.
- //
- psInst->ui8ErrorCode = SCSI_RS_VALID | SCSI_RS_CUR_ERRORS;
- psInst->ui8SenseKey = SCSI_RS_KEY_ILGL_RQST;
- psInst->ui16AddSenseCode = SCSI_RS_PV_INVALID;
-
- break;
- }
- }
-
- //
- // If there is no data then send out the current status.
- //
- if(ui32TransferLength == 0)
- {
- USBDSCSISendStatus(psMSCDevice);
- }
- return(ui32RetCode);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.h
deleted file mode 100644
index 437d63e96..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/device/usbdmsc.h
+++ /dev/null
@@ -1,429 +0,0 @@
-//*****************************************************************************
-//
-// usbdmsc.h - USB mass storage device class driver.
-//
-// Copyright (c) 2009-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDMSC_H__
-#define __USBDMSC_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup msc_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Media Access functions.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! This function is used to initialize and open the physical drive number
- //! associated with the parameter ui32Drive. The function will return zero
- //! if the drive could not be opened for some reason. In the case of
- //! removable device like an SD card this function should return zero if
- //! the SD card is not present.
- //! The function returns a pointer to data that should be passed to other
- //! APIs or it will return 0 if no drive was found.
- //
- void *(*pfnOpen)(uint32_t ui32Drive);
-
- //*************************************************************************
- //
- // This function close the drive number in use by the mass storage class
- // device.
- //
- // /param pvDrive is the pointer that was returned from a call to
- // USBDMSCStorageOpen().
- //
- // This function is used to close the physical drive number associated with
- // the parameter \e pvDrive. This function will return 0 if the drive was
- // closed successfully and any other value will indicate a failure.
- //
- // /return Returns 0 if the drive was successfully closed or non-zero for a
- // failure.
- //
- //*************************************************************************
- void (*pfnClose)(void *pvDrive);
-
- //*************************************************************************
- //
- // This function will read a block from a device opened by the
- // USBDMSCStorageOpen() call.
- //
- // /param pvDrive is the pointer that was returned from a call to
- // USBDMSCStorageOpen().
- // /param pui8Data is the buffer that data will be written into.
- // /param ui32Sector is the block address to read.
- // /param ui32NumBlocks is the number of blocks to read.
- //
- // This function is use to read blocks from a physical device and return
- // them in the \e pui8Data buffer. The data area pointed to by \e pui8Data
- // should be at least \e ui32NumBlocks * Block Size bytes to prevent
- // overwriting data.
- //
- // /return Returns the number of bytes that were read from the device.
- //
- //*************************************************************************
- uint32_t (*pfnBlockRead)(void *pvDrive, uint8_t *pui8Data,
- uint32_t ui32Sector, uint32_t ui32NumBlocks);
-
- //*************************************************************************
- //
- // This function will write a block to a device opened by the
- // USBDMSCStorageOpen() call.
- //
- // /param pvDrive is the pointer that was returned from a call to
- // USBDMSCStorageOpen().
- // /param pui8Data is the buffer that data will be used for writing.
- // /param ui32NumBlocks is the number of blocks to write.
- //
- // This function is use to write blocks to a physical device from the
- // buffer pointed to by the \e pui8Data buffer. If the number of blocks is
- // greater than one then the block address will increment and write to the
- // next block until \e ui32NumBlocks * Block Size bytes have been written.
- //
- // /return Returns the number of bytes that were written to the device.
- //
- //*************************************************************************
- uint32_t (*pfnBlockWrite)(void *pvDrive, uint8_t *pui8Data,
- uint32_t ui32Sector, uint32_t ui32NumBlocks);
-
- //*************************************************************************
- //
- // This function will return the number of blocks present on a device.
- //
- // /param pvDrive is the pointer that was returned from a call to
- // USBDMSCStorageOpen().
- //
- // This function is used to return the total number of blocks on a physical
- // device based on the \e pvDrive parameter.
- //
- // /return Returns the number of blocks that are present in a device.
- //
- //*************************************************************************
- uint32_t (*pfnNumBlocks)(void *pvDrive);
-}
-tMSCDMedia;
-
-//*****************************************************************************
-//
-// These defines control the sizes of USB transfers for data and commands.
-//
-//*****************************************************************************
-#define DEVICE_BLOCK_SIZE 512
-
-//*****************************************************************************
-//
-// USBDMSCMediaChange() tUSBDMSCMediaStatus values.
-//
-//*****************************************************************************
-typedef enum
-{
- eUSBDMSCMediaPresent,
- eUSBDMSCMediaNotPresent,
- eUSBDMSCMediaUnknown
-}
-tUSBDMSCMediaStatus;
-
-//*****************************************************************************
-//
-// PRIVATE
-//
-// This structure defines the private instance data and state variables for the
-// mass storage class. The memory for this structure is in the the
-// sPrivateData field in the tUSBDMSCDevice structure passed on
-// USBDMSCInit() and should not be modified by any code outside of the mass
-// storage device code.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Base address for the USB controller.
- //
- uint32_t ui32USBBase;
-
- //
- // The device info to interact with the lower level DCD code.
- //
- tDeviceInfo sDevInfo;
-
- //
- // These three values are used to return the current sense data for an
- // instance of the mass storage class.
- //
- uint8_t ui8ErrorCode;
- uint8_t ui8SenseKey;
- uint16_t ui16AddSenseCode;
-
- //
- // The pointer to the instance returned from the Open call to the media.
- //
- void *pvMedia;
-
- //
- // The connection status of the device.
- //
- volatile bool bConnected;
-
- //
- // Holds the flag settings for this instance.
- //
- uint32_t ui32Flags;
-
- //
- // Holds the current media status.
- //
- tUSBDMSCMediaStatus iMediaStatus;
-
- //
- // MSC block buffer.
- //
- uint32_t pui32Buffer[DEVICE_BLOCK_SIZE>>2];
-
- //
- // Current number of bytes to transfer.
- //
- uint32_t ui32BytesToTransfer;
-
- //
- // The LBA for the current transfer.
- //
- uint32_t ui32CurrentLBA;
-
- //
- // The IN endpoint number, this is modified in composite devices.
- //
- uint8_t ui8INEndpoint;
-
- //
- // The IN DMA channel.
- //
- uint8_t ui8INDMA;
-
- //
- // The OUT endpoint number, this is modified in composite devices.
- //
- uint8_t ui8OUTEndpoint;
-
- //
- // The OUT DMA channel.
- //
- uint8_t ui8OUTDMA;
-
- //
- // The bulk class interface number, this is modified in composite devices.
- //
- uint8_t ui8Interface;
-
- //
- // Active SCSI state.
- //
- uint8_t ui8SCSIState;
-
- //
- // A copy of the DMA instance data used with calls to USBLibDMA functions.
- //
- tUSBDMAInstance *psDMAInstance;
-}
-tMSCInstance;
-
-//*****************************************************************************
-//
-// This is the size of the g_pui8MSCInterface array in bytes.
-//
-//*****************************************************************************
-#define MSCINTERFACE_SIZE (23)
-
-//*****************************************************************************
-//
-//! The size of the memory that should be allocated to create a configuration
-//! descriptor for a single instance of the USB Audio Device.
-//! This does not include the configuration descriptor which is automatically
-//! ignored by the composite device class.
-//
-//
-//*****************************************************************************
-#define COMPOSITE_DMSC_SIZE (MSCINTERFACE_SIZE)
-
-//*****************************************************************************
-//
-//! The structure used by the application to define operating parameters for
-//! the mass storage device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The vendor ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16VID;
-
- //
- //! The product ID that this device is to present in the device descriptor.
- //
- const uint16_t ui16PID;
-
- //
- //! 8 byte vendor string.
- //
- const uint8_t pui8Vendor[8];
-
- //
- //! 16 byte vendor string.
- //
- const uint8_t pui8Product[16];
-
- //
- //! 4 byte vendor string.
- //
- const uint8_t pui8Version[4];
-
- //
- //! The maximum power consumption of the device, expressed in milliamps.
- //
- const uint16_t ui16MaxPowermA;
-
- //
- //! Indicates whether the device is self or bus-powered and whether or not
- //! it supports remote wakeup. Valid values are USB_CONF_ATTR_SELF_PWR or
- //! USB_CONF_ATTR_BUS_PWR, optionally ORed with USB_CONF_ATTR_RWAKE.
- //
- const uint8_t ui8PwrAttributes;
-
- //
- //! A pointer to the string descriptor array for this device. This array
- //! must contain the following string descriptor pointers in this order.
- //! Language descriptor, Manufacturer name string (language 1), Product
- //! name string (language 1), Serial number string (language 1), MSC
- //! Interface description string (language 1), Configuration description
- //! string (language 1).
- //!
- //! If supporting more than 1 language, the descriptor block (except for
- //! string descriptor 0) must be repeated for each language defined in the
- //! language descriptor.
- //!
- //
- const uint8_t * const *ppui8StringDescriptors;
-
- //
- //! The number of descriptors provided in the ppStringDescriptors
- //! array. This must be 1 + ((5 + (num HID strings)) * (num languages)).
- //
- const uint32_t ui32NumStringDescriptors;
-
- //
- //! This structure holds the access functions for the media used by this
- //! instance of the mass storage class device. All of the functions in
- //! this structure are required to be filled out with valid functions.
- //
- const tMSCDMedia sMediaFunctions;
-
- //
- //! This is the callback function for various events that occur during
- //! mass storage class operation.
- //
- const tUSBCallback pfnEventCallback;
-
- //
- //! The private instance data for this device. This memory
- //! must remain accessible for as long as the MSC device is in use and
- //! must not be modified by any code outside the MSC class driver.
- //
- tMSCInstance sPrivateData;
-}
-tUSBDMSCDevice;
-
-//*****************************************************************************
-//
-// MSC-specific device class driver events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This event indicates that the host has completed other operations and is
-//! no longer accessing the device.
-//
-//*****************************************************************************
-#define USBD_MSC_EVENT_IDLE (USBD_MSC_EVENT_BASE + 0)
-
-//*****************************************************************************
-//
-//! This event indicates that the host is reading the storage media.
-//
-//*****************************************************************************
-#define USBD_MSC_EVENT_READING (USBD_MSC_EVENT_BASE + 1)
-
-//*****************************************************************************
-//
-//! This event indicates that the host is writing to the storage media.
-//
-//*****************************************************************************
-#define USBD_MSC_EVENT_WRITING (USBD_MSC_EVENT_BASE + 2)
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern void *USBDMSCInit(uint32_t ui32Index,
- tUSBDMSCDevice *psMSCDevice);
-extern void *USBDMSCCompositeInit(uint32_t ui32Index,
- tUSBDMSCDevice *psMSCDevice,
- tCompositeEntry *psCompEntry);
-extern void USBDMSCTerm(void *pvInstance);
-extern void USBDMSCMediaChange(void *pvInstance,
- tUSBDMSCMediaStatus eMediaStatus);
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.c
deleted file mode 100644
index 6ceff9522..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.c
+++ /dev/null
@@ -1,1497 +0,0 @@
-//*****************************************************************************
-//
-// usbhaudio.c - USB host audio driver.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbaudio.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/host/usbhaudio.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// These defines are used with the USBHostAudioFormatSet()
-// USBHostAudioFormatGet() to parse out interface number and alternate
-// setting number for an interface.
-//
-//*****************************************************************************
-#define INTERFACE_NUM_M 0x000000FF
-#define INTERFACE_ALTSETTING_M 0x0000FF00
-#define INTERFACE_ALTSETTING_S 8
-
-//*****************************************************************************
-//
-// Used to indicate an invalid interface descriptor number.
-//
-//*****************************************************************************
-#define INVALID_INTERFACE 0xffffffff
-
-//*****************************************************************************
-//
-// Forward declarations for the driver open and close calls.
-//
-//*****************************************************************************
-static void *USBAudioOpen(tUSBHostDevice *psDevice);
-static void USBAudioClose(void *pvInstance);
-
-//*****************************************************************************
-//
-// This is the structure for an instance of a USB host audio driver.
-//
-//*****************************************************************************
-struct tUSBHostAudioInstance
-{
- //
- // Save the device instance.
- //
- tUSBHostDevice *psDevice;
-
- //
- // Used to save the call back.
- //
- tUSBHostAudioCallback pfnCallback;
-
- //
- // This is the control interface.
- //
- uint8_t ui8IControl;
-
- //
- // This is the output streaming interface.
- //
- uint8_t ui8OutInterface;
-
- //
- // This is the currently selected active output interface used with
- // ui8OutInterface interface.
- //
- uint8_t ui8OutAltSetting;
-
- //
- // This is the streaming interface.
- //
- uint8_t ui8InInterface;
-
- //
- // This is the currently selected active input interface used with
- // ui8InInterface interface.
- //
- uint8_t ui8InAltSetting;
-
- //
- // The Isochronous endpoint addresses.
- //
- uint8_t ui8IsochInAddress;
- uint8_t ui8IsochOutAddress;
-
- tACInputTerminal *psInTerminal;
- tACOutputTerminal *psOutTerminal;
-
- //
- // Holds the identifier for the Feature Unit for controlling volume.
- //
- uint8_t ui8VolumeID;
-
- tACFeatureUnit *psFeatureUnit;
-
- //
- // Holds what types of controls are enabled on the device.
- //
- uint16_t pui16Controls[3];
-
- //
- // Isochronous IN pipe.
- //
- uint32_t ui32IsochInPipe;
- uint16_t ui16PipeSizeIn;
- tUSBHostAudioCallback pfnInCallback;
- void *pvInBuffer;
-
- //
- // Isochronous OUT pipe.
- //
- uint32_t ui32IsochOutPipe;
- uint16_t ui16PipeSizeOut;
- tUSBHostAudioCallback pfnOutCallback;
- void *pvOutBuffer;
-
- //
- // State flags for this audio instance.
- //
- uint32_t ui32Flags;
-};
-
-//*****************************************************************************
-//
-// The internal flags for an audio interface.
-//
-//*****************************************************************************
-#define AUDIO_FLAG_OUT_ACTIVE 1 // Audio output is active.
-#define AUDIO_FLAG_IN_ACTIVE 2 // Audio input is active.
-
-//*****************************************************************************
-//
-// The USB Host audio instance.
-//
-//*****************************************************************************
-static tUSBHostAudioInstance g_sAudioDevice =
-{
- 0
-};
-
-//*****************************************************************************
-//
-//! This constant global structure defines the Audio Class Driver that is
-//! provided with the USB library.
-//
-//*****************************************************************************
-const tUSBHostClassDriver g_sUSBHostAudioClassDriver =
-{
- USB_CLASS_AUDIO,
- USBAudioOpen,
- USBAudioClose,
- 0
-};
-
-//*****************************************************************************
-//
-// This is the internal function that handles callbacks from the USB IN pipe.
-//
-//*****************************************************************************
-static void
-PipeCallbackIN(uint32_t ui32Pipe, uint32_t ui32Event)
-{
- //
- // Only handle the data available callback and pass it on to the
- // application.
- //
- if(ui32Event == USB_EVENT_RX_AVAILABLE)
- {
- if(g_sAudioDevice.pfnInCallback)
- {
- g_sAudioDevice.pfnInCallback(&g_sAudioDevice,
- USB_EVENT_RX_AVAILABLE, 0,
- g_sAudioDevice.pvInBuffer);
- }
- }
-}
-
-//*****************************************************************************
-//
-// This is the internal function that handles callbacks from the USB OUT pipe.
-//
-//*****************************************************************************
-static void
-PipeCallbackOUT(uint32_t ui32Pipe, uint32_t ui32Event)
-{
- //
- // Only handle the transmit complete callback and pass it on to the
- // application.
- //
- if(ui32Event == USB_EVENT_TX_COMPLETE)
- {
- if(g_sAudioDevice.pfnOutCallback)
- {
- g_sAudioDevice.pfnOutCallback(&g_sAudioDevice,
- USB_EVENT_TX_COMPLETE, 0,
- g_sAudioDevice.pvOutBuffer);
- }
- }
-}
-
-//*****************************************************************************
-//
-// Finds a given terminal and type in an audio configuration descriptor.
-//
-//*****************************************************************************
-static tDescriptorHeader *
-AudioTerminalGet(tConfigDescriptor *psConfigDesc, uint32_t ui32Terminal,
- uint32_t ui32TerminalType)
-{
- tACOutputTerminal *psOutput;
- tDescriptorHeader *psHeader;
- int32_t i32BytesRemaining;
-
- psHeader = (tDescriptorHeader *)psConfigDesc;
- i32BytesRemaining = psConfigDesc->wTotalLength;
-
- while(i32BytesRemaining > 0)
- {
- //
- // Output and input terminals are the same past the bDescriptorSubtype
- // and wTerminalType that are being searched for.
- //
- psOutput = (tACOutputTerminal *)psHeader;
-
- //
- // Only CS_INTERFACE descriptors can be a terminal.
- //
- if((psHeader->bDescriptorType == USB_DTYPE_CS_INTERFACE) &&
- (ui32Terminal == psOutput->bDescriptorSubtype))
- {
- if((psOutput->bDescriptorSubtype == USB_AI_OUTPUT_TERMINAL) ||
- (psOutput->bDescriptorSubtype == USB_AI_INPUT_TERMINAL))
-
- {
- //
- // If this was the terminal type that was requested, the
- // return it.
- //
- if(psOutput->wTerminalType == ui32TerminalType)
- {
- return(psHeader);
- }
- }
- else if(psOutput->bDescriptorSubtype == USB_AI_FEATURE_UNIT)
- {
- return(psHeader);
- }
- }
-
- //
- // Decrease the bytes remaining by the size of this descriptor.
- //
- i32BytesRemaining -= psHeader->bLength;
-
- //
- // Move the pointer to the next header.
- //
- psHeader = (tDescriptorHeader *)((uint32_t)psHeader +
- psHeader->bLength);
- }
- return((tDescriptorHeader *)0);
-}
-
-//*****************************************************************************
-//
-// This function returns the interface number for the control interface
-// in the structure passed in the psConfigDesc.
-//
-// \param psConfigDescriptor is a pointer to the memory containing a valid
-// configuration descriptor for a device.
-//
-// This function searches a configuration descriptor for a control interface
-// descriptor. The function only search for the first descriptor and then
-// returns when it finds one.
-//
-// \return The first control interface descriptor number for an audio device
-// or INVALID_INTERFACE if no control interface descriptor was found.
-//
-//*****************************************************************************
-static uint32_t
-AudioControlGet(tConfigDescriptor *psConfigDesc)
-{
- tDescriptorHeader *psHeader;
- tInterfaceDescriptor *psInterface;
- uint32_t ui32Interface;
- int32_t i32Bytes;
-
- psHeader = (tDescriptorHeader *)psConfigDesc;
- i32Bytes = psConfigDesc->wTotalLength;
-
- //
- // Initialize the interface number to an invalid value.
- //
- ui32Interface = INVALID_INTERFACE;
-
- //
- // Search the whole configuration descriptor.
- //
- while(i32Bytes > 0)
- {
- //
- // Find an interface descriptor and see if it is a control interface.
- //
- if(psHeader->bDescriptorType == USB_DTYPE_INTERFACE)
- {
- psInterface = (tInterfaceDescriptor *)psHeader;
-
- //
- // If this is the control interface then return the value to the
- // caller.
- //
- if(psInterface->bInterfaceSubClass == USB_ASC_AUDIO_CONTROL)
- {
- ui32Interface = psInterface->bInterfaceNumber;
-
- break;
- }
- }
-
- //
- // Decrease the bytes remaining by the size of this descriptor.
- //
- i32Bytes -= psHeader->bLength;
-
- //
- // Move the pointer to the next header.
- //
- psHeader = (tDescriptorHeader*)((uint32_t)psHeader +
- psHeader->bLength);
- }
- return(ui32Interface);
-}
-
-//*****************************************************************************
-//
-// If it exists, finds the correct audio interface for a given audio format.
-//
-//*****************************************************************************
-static uint32_t
-AudioGetInterface(tUSBHostAudioInstance *psAudioDevice, uint16_t ui16Format,
- uint32_t ui32SampleRate, uint32_t ui32Bytes,
- uint32_t ui32Channels, uint32_t ui32Flags)
-{
- tDescriptorHeader *psHeader;
- tInterfaceDescriptor *psInterface;
- tEndpointDescriptor *pINEndpoint, *pOUTEndpoint;
- tACHeader *pACHeader;
- tACGeneral *pGeneral;
- tASFormat *pFormat;
- tEndpointDescriptor *pEndpoint;
- uint8_t *pui8Value;
- uint32_t ui32Value;
- int32_t i32Bytes, i32Idx;
-
- //
- // Initialize the Interface pointer to null.
- //
- psInterface = 0;
- pINEndpoint = 0;
- pOUTEndpoint = 0;
-
- //
- // Start at the top of the configuration descriptor.
- //
- psHeader = (tDescriptorHeader *)psAudioDevice->psDevice->psConfigDescriptor;
-
- i32Bytes = psAudioDevice->psDevice->psConfigDescriptor->wTotalLength;
-
- while(i32Bytes > 0)
- {
- if(psHeader->bDescriptorType == USB_DTYPE_INTERFACE)
- {
- //
- // If a new interface was found and the last one satisfied all
- // requirements then a valid interface was found so break out.
- //
- if(psInterface)
- {
- break;
- }
-
- //
- // Get the new interface pointer.
- //
- psInterface = (tInterfaceDescriptor *)psHeader;
-
- //
- // Reset the endpoints on finding a new interface descriptor.
- //
- pINEndpoint = 0;
- pOUTEndpoint = 0;
-
- //
- // If this is not a valid audio streaming interface then reset
- // the interface pointer to null.
- //
- if((psInterface->bNumEndpoints == 0) ||
- (psInterface->bInterfaceClass != USB_CLASS_AUDIO) ||
- (psInterface->bInterfaceSubClass != USB_ASC_AUDIO_STREAMING))
- {
- psInterface = 0;
- }
- }
- if((psInterface) &&
- (psHeader->bDescriptorType == USB_DTYPE_CS_INTERFACE))
- {
- pACHeader = (tACHeader *)psHeader;
-
- //
- // If this is a General descriptor the check if the format matches.
- //
- if(pACHeader->bDescriptorSubtype == USB_AS_GENERAL)
- {
- //
- // Just save the pointer to the format descriptor.
- //
- pGeneral = (tACGeneral *)psHeader;
-
- //
- // If this interface has the wrong format then set it to null
- // so that the rest of this interface is ignored.
- //
- if(pGeneral->wFormatTag != ui16Format)
- {
- psInterface = 0;
- }
- }
- else if(pACHeader->bDescriptorSubtype == USB_AS_FORMAT_TYPE)
- {
- pFormat = (tASFormat *)psHeader;
-
- //
- // If the number of bytes per sample and number of channels do
- // not match then reset the interface pointer so that the rest
- // of this interface is ignored.
- //
- if((pFormat->bNrChannels != ui32Channels) ||
- (pFormat->bSubFrameSize != ui32Bytes))
- {
- psInterface = 0;
- }
- else
- {
- pui8Value = &pFormat->tSamFreq;
-
- //
- // Attempt to find the sample rate in the sample rate
- // table for this interface.
- //
- for(i32Idx = 0; i32Idx < pFormat->bSamFreqType; i32Idx++)
- {
- ui32Value = (*((uint32_t *)&pui8Value[i32Idx * 3]) &
- 0xffffff);
-
- if(ui32Value == ui32SampleRate)
- {
- break;
- }
- }
-
- //
- // If the sample rate was not found then set the interface
- // pointer to null so that the rest of this interface is
- // ignored.
- //
- if(i32Idx == pFormat->bSamFreqType)
- {
- psInterface = 0;
- }
- }
- }
- }
- else if((psInterface) &&
- (psHeader->bDescriptorType == USB_DTYPE_ENDPOINT))
- {
- pEndpoint = (tEndpointDescriptor *)psHeader;
-
- //
- // See what direction is being requested.
- //
- if(ui32Flags & USBH_AUDIO_FORMAT_IN)
- {
- //
- // If this is an input endpoint and is just a feed back input
- // then ignore it.
- //
- if(pEndpoint->bEndpointAddress & USB_EP_DESC_IN)
- {
- if((pEndpoint->bmAttributes & USB_EP_ATTR_USAGE_M)
- == USB_EP_ATTR_USAGE_FEEDBACK)
- {
- psInterface = 0;
- }
- else
- {
- //
- // Save this endpoint as a possible valid endpoint
- //
- pINEndpoint = pEndpoint;
- }
- }
- }
- else
- {
- //
- // If this is an output endpoint and is just a feed back input
- // then ignore it.
- //
- if((pEndpoint->bEndpointAddress & USB_EP_DESC_IN) == 0)
- {
- if((pEndpoint->bmAttributes & USB_EP_ATTR_USAGE_M)
- == USB_EP_ATTR_USAGE_FEEDBACK)
- {
- psInterface = 0;
- }
- else
- {
- //
- // Save this endpoint as a possible valid endpoint;
- //
- pOUTEndpoint = pEndpoint;
- }
- }
- }
- }
-
- //
- // Decrease the bytes remaining by the size of this descriptor.
- //
- i32Bytes -= psHeader->bLength;
-
- //
- // Move the pointer to the next header.
- //
- psHeader = (tDescriptorHeader*)((uint32_t)psHeader +
- psHeader->bLength);
- }
-
- //
- // If there is still a valid interface then return the values.
- //
- if(psInterface)
- {
- //
- // Check a valid IN endpoint descriptor.
- //
- if(pINEndpoint)
- {
- //
- // Save the endpoint address.
- //
- g_sAudioDevice.ui8IsochInAddress = pINEndpoint->bEndpointAddress &
- USB_EP_DESC_NUM_M;
-
- //
- // If there is no current pipe then just allocate a new one with
- // the settings for this interface.
- //
- if(g_sAudioDevice.ui32IsochInPipe == 0)
- {
- //
- // Allocate the USB Pipe for this Isochronous IN end point.
- //
- g_sAudioDevice.ui32IsochInPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_IN_DMA,
- g_sAudioDevice.psDevice,
- pINEndpoint->wMaxPacketSize,
- PipeCallbackIN);
- }
- else if(g_sAudioDevice.ui16PipeSizeIn < pINEndpoint->wMaxPacketSize)
- {
- //
- // Free the old endpoint and allocate a new one.
- //
- USBHCDPipeFree(g_sAudioDevice.ui32IsochInPipe);
-
- //
- // Allocate the USB Pipe for this Isochronous IN end point.
- //
- g_sAudioDevice.ui32IsochInPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_IN_DMA,
- g_sAudioDevice.psDevice,
- pINEndpoint->wMaxPacketSize,
- PipeCallbackIN);
-
- //
- // Save the new size of the maximum packet size for this
- // USB pipe.
- //
- g_sAudioDevice.ui16PipeSizeIn = pINEndpoint->wMaxPacketSize;
- }
-
- //
- // Configure the USB pipe as a Isochronous IN end point.
- //
- USBHCDPipeConfig(g_sAudioDevice.ui32IsochInPipe,
- pINEndpoint->wMaxPacketSize,
- 0,
- g_sAudioDevice.ui8IsochInAddress);
- }
-
- //
- // Check a valid OUT endpoint descriptor.
- //
- if(pOUTEndpoint)
- {
- //
- // Save the endpoint address.
- //
- g_sAudioDevice.ui8IsochOutAddress =
- pOUTEndpoint->bEndpointAddress & USB_EP_DESC_NUM_M;
-
- //
- // If there is no current pipe then just allocate a new one with
- // the settings for this interface.
- //
- if(g_sAudioDevice.ui32IsochOutPipe == 0)
- {
- //
- // Allocate the USB Pipe for this Isochronous OUT end point.
- //
- g_sAudioDevice.ui32IsochOutPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_OUT_DMA,
- g_sAudioDevice.psDevice,
- pOUTEndpoint->wMaxPacketSize,
- PipeCallbackOUT);
- }
- else if(g_sAudioDevice.ui16PipeSizeOut <
- pOUTEndpoint->wMaxPacketSize)
- {
- //
- // Free the old endpoint and allocate a new one.
- //
- USBHCDPipeFree(g_sAudioDevice.ui32IsochOutPipe);
-
- //
- // Allocate the USB Pipe for this Isochronous OUT end point.
- //
- g_sAudioDevice.ui32IsochOutPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_OUT_DMA,
- g_sAudioDevice.psDevice,
- pOUTEndpoint->wMaxPacketSize,
- PipeCallbackOUT);
-
- //
- // Save the new size of the maximum packet size for this
- // USB pipe.
- //
- g_sAudioDevice.ui16PipeSizeOut = pOUTEndpoint->wMaxPacketSize;
- }
-
- //
- // Configure the USB pipe as a Isochronous OUT end point.
- //
- USBHCDPipeConfig(g_sAudioDevice.ui32IsochOutPipe,
- pOUTEndpoint->wMaxPacketSize, 0,
- g_sAudioDevice.ui8IsochOutAddress);
- }
-
- return(psInterface->bInterfaceNumber |
- (psInterface->bAlternateSetting << INTERFACE_ALTSETTING_S));
- }
- return(INVALID_INTERFACE);
-}
-
-//*****************************************************************************
-//
-// This function is used to open an instance of the USB host audio driver.
-//
-// \param psDevice is a pointer to the device information structure.
-//
-// This function attempts to open an instance of the USB host audio driver
-// based on the information contained in the psDevice structure. This call
-// fails if there are not sufficient resources to open the device. The
-// function returns a value that should be passed back into USBHostAudioClose()
-// when the driver is no longer needed.
-//
-// \return The function returns a pointer to a USB host audio driver
-// instance.
-//
-//*****************************************************************************
-static void *
-USBAudioOpen(tUSBHostDevice *psDevice)
-{
- uint32_t ui32Temp;
- tConfigDescriptor *psConfigDesc;
-
- //
- // Don't allow the device to be opened without closing first.
- //
- if(g_sAudioDevice.psDevice)
- {
- return(0);
- }
-
- //
- // Save the Host device pointer.
- //
- g_sAudioDevice.psDevice = psDevice;
-
- //
- // Save a shorter name for the configuration descriptor.
- //
- psConfigDesc = psDevice->psConfigDescriptor;
-
- //
- // Find the input terminal.
- //
- g_sAudioDevice.psInTerminal =
- (tACInputTerminal *)AudioTerminalGet(psConfigDesc,
- USB_AI_INPUT_TERMINAL,
- USB_TTYPE_STREAMING);
-
- //
- // Find the output terminal.
- //
- g_sAudioDevice.psOutTerminal =
- (tACOutputTerminal *)AudioTerminalGet(psConfigDesc,
- USB_AI_OUTPUT_TERMINAL,
- USB_TTYPE_STREAMING);
-
- //
- // Find the feature unit.
- g_sAudioDevice.psFeatureUnit =
- (tACFeatureUnit *)AudioTerminalGet(psConfigDesc,
- USB_AI_FEATURE_UNIT, 0);
-
- //
- // Need some kind of terminal to send or receive audio from.
- //
- if((g_sAudioDevice.psOutTerminal == 0) &&
- (g_sAudioDevice.psInTerminal == 0))
- {
- return(0);
- }
-
- //
- // Find the Audio control interface.
- //
- ui32Temp = AudioControlGet(psConfigDesc);
-
- if(ui32Temp == INVALID_INTERFACE)
- {
- return(0);
- }
-
- //
- // Save the control interface index and increment the number
- // of interfaces that have been found.
- //
- g_sAudioDevice.ui8IControl = (uint8_t)ui32Temp;
-
- //
- // If the call back exists, call it with an Open event.
- //
- if(g_sAudioDevice.pfnCallback != 0)
- {
- g_sAudioDevice.pfnCallback(&g_sAudioDevice,
- USBH_AUDIO_EVENT_OPEN, 0, 0);
- }
-
- //
- // If a feature unit was found, save the ID
- //
- if(g_sAudioDevice.psFeatureUnit != 0)
- {
- g_sAudioDevice.ui8VolumeID = g_sAudioDevice.psFeatureUnit->bUnitID;
- }
-
- //
- // Allocate the USB Pipe for this Isochronous IN end point.
- //
- g_sAudioDevice.ui32IsochInPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_IN_DMA,
- g_sAudioDevice.psDevice, 256, PipeCallbackIN);
- g_sAudioDevice.ui16PipeSizeIn = 256;
-
- //
- // Allocate the USB Pipe for this Isochronous OUT end point.
- //
- g_sAudioDevice.ui32IsochOutPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_ISOC_OUT_DMA,
- g_sAudioDevice.psDevice, 256, PipeCallbackOUT);
- g_sAudioDevice.ui16PipeSizeOut = 256;
-
- //
- // Clear the flags.
- //
- g_sAudioDevice.ui32Flags = 0;
-
- //
- // Return the only instance of this device.
- //
- return(&g_sAudioDevice);
-}
-
-//*****************************************************************************
-//
-// This function is used to release an instance of the USB host audio driver.
-//
-// \param pvAudioDevice is an instance pointer that needs to be released.
-//
-// This function frees up any resources in use by the USB host audio
-// driver instance that is passed in. The \e pvAudioDevice pointer should be a
-// valid value that was returned from a call to USBHostAudioOpen().
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBAudioClose(void *pvAudioDevice)
-{
- tUSBHostAudioInstance *psAudioDevice;
-
- psAudioDevice = (tUSBHostAudioInstance *)pvAudioDevice;
-
- //
- // Do nothing if there is not a driver open.
- //
- if(psAudioDevice->psDevice == 0)
- {
- return;
- }
-
- //
- // Reset the device pointer.
- //
- psAudioDevice->psDevice = 0;
-
- //
- // Free the Isochronous IN pipe.
- //
- if(psAudioDevice->ui32IsochInPipe != 0)
- {
- USBHCDPipeFree(psAudioDevice->ui32IsochInPipe);
- }
-
- //
- // Free the Isochronous OUT pipe.
- //
- if(psAudioDevice->ui32IsochOutPipe != 0)
- {
- USBHCDPipeFree(psAudioDevice->ui32IsochOutPipe);
- }
-
- //
- // If the call back exists then call it.
- //
- if(psAudioDevice->pfnCallback != 0)
- {
- psAudioDevice->pfnCallback(psAudioDevice, USBH_AUDIO_EVENT_CLOSE, 0,
- 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function should be called before any devices are present to enable
-//! the host audio class driver.
-//!
-//! \param ui32Index is the audio device to open (currently only 0 is
-//! supported).
-//! \param pfnCallback is the driver call back for host audio events.
-//!
-//! This function is called to open an instance of a host audio device and
-//! should provide a valid callback function for host audio events in the
-//! \e pfnCallback parameter. This function must be called before the USB
-//! host code can successfully enumerate an audio device.
-//!
-//! \return This function returns the driver instance to use for the other
-//! host audio functions. If there is no instance available at the time of
-//! this call, this function returns zero.
-//
-//*****************************************************************************
-tUSBHostAudioInstance *
-USBHostAudioOpen(uint32_t ui32Index, tUSBHostAudioCallback pfnCallback)
-{
- //
- // Only one audio device is supported at this time and on one instance
- // is supported so if there is already a call back then fail.
- //
- if((ui32Index != 0) || (g_sAudioDevice.pfnCallback))
- {
- return(0);
- }
-
- //
- // Save the call back.
- //
- g_sAudioDevice.pfnCallback = pfnCallback;
-
- //
- // Return the requested device instance.
- //
- return(&g_sAudioDevice);
-}
-
-//*****************************************************************************
-//
-//! This function should be called to release an audio device instance.
-//!
-//! \param psAudioInstance is the device instance that is to be released.
-//!
-//! This function is called when a host audio device needs to be released.
-//! This could be in preparation for shutdown or a switch to USB device mode,
-//! for example. Following this call, the audio device is available and can
-//! be opened again using a call to USBHostAudioOpen(). After calling this
-//! function, the host audio driver will no longer provide any callbacks or
-//! accept calls to other audio driver APIs.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHostAudioClose(tUSBHostAudioInstance *psAudioInstance)
-{
- //
- // Close the audio device.
- //
- USBAudioClose(psAudioInstance);
-
- //
- // Clear the call back indicating that the device is now closed.
- //
- psAudioInstance->pfnCallback = 0;
-}
-
-//*****************************************************************************
-//
-// This function is used to request settings from a given audio interface.
-//
-// \param psAudioDevice is the audio device instance to access.
-// \param ui32Interface is the interface to access.
-// \param ui32Channel is the channel number to access.
-// \param ui32Request is the audio device request.
-//
-// This function is used to get volume control parameters from a given
-// interface and on a given channel. The \e ui32Interface is the interface to
-// make the request specified by \e ui32Channel and \e ui32Request. The
-// \e ui32Request parameter must be one of the USB_AC_GET_* values.
-//
-// \return This function returns the requested value.
-//
-//*****************************************************************************
-static uint32_t
-VolumeSettingGet(tUSBHostAudioInstance *psAudioDevice, uint32_t ui32Interface,
- uint32_t ui32Channel, uint32_t ui32Request)
-{
- uint32_t ui32Value;
- tUSBRequest sSetupPacket;
-
- ui32Value = 0;
-
- //
- // This is a Class specific Interface IN request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_IN | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = (ui32Request & 0xff);
-
- //
- // Request for a string descriptor.
- //
- sSetupPacket.wValue = VOLUME_CONTROL | (ui32Channel & 0xff);
-
- //
- // Set the language ID.
- //
- sSetupPacket.wIndex = (psAudioDevice->ui8VolumeID << 8) |
- (ui32Interface & 0xff);
-
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = 2;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psAudioDevice->psDevice,
- (uint8_t *)&ui32Value, 4,
- psAudioDevice->psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- return(ui32Value);
-}
-
-//*****************************************************************************
-//
-//! This function is used to get the current volume setting for a given
-//! audio device.
-//!
-//! \param psAudioInstance is an instance of the USB audio device.
-//! \param ui32Interface is the interface number to use to query the current
-//! volume setting.
-//! \param ui32Channel is the 0 based channel number to query.
-//!
-//! The function is used to retrieve the current volume setting for an audio
-//! device on the channel specified by \e ui32Channel. The \e ui32Interface is
-//! ignored for now and should be set to 0 to access the default audio control
-//! interface. The \e ui32Channel value starts with 0 which is the master
-//! audio volume control interface. The remaining \e ui32Channel values
-//! provide access to various other audio channels, with 1 and 2 being left and
-//! right audio channels.
-//!
-//! \note On devices that do not support volume control interfaces, this
-//! call returns 0, indicating a 0db setting.
-//!
-//! \return Returns the current volume setting for the requested interface.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioVolumeGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel)
-{
- return(VolumeSettingGet(psAudioInstance, ui32Interface, ui32Channel,
- USB_AC_GET_CUR));
-}
-
-//*****************************************************************************
-//
-//! This function is used to get the maximum volume setting for a given
-//! audio device.
-//!
-//! \param psAudioInstance is an instance of the USB audio device.
-//! \param ui32Interface is the interface number to use to query the maximum
-//! volume control value.
-//! \param ui32Channel is the 0 based channel number to query.
-//!
-//! The function is used to retrieve the maximum volume setting for an audio
-//! device on the channel specified by \e ui32Channel. The \e ui32Interface is
-//! ignored for now and should be set to 0 to access the default audio control
-//! interface. The \e ui32Channel value starts with 0 which is the master
-//! audio volume control interface. The remaining \e ui32Channel values
-//! provide access to various other audio channels, with 1 and 2 being left and
-//! right audio channels.
-//!
-//! \note On devices that do not support volume control interfaces, this
-//! call returns 0, indicating a 0db setting.
-//!
-//! \return Returns the maximum volume setting for the requested interface.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioVolumeMaxGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel)
-{
- return(VolumeSettingGet(psAudioInstance, ui32Interface, ui32Channel,
- USB_AC_GET_MAX));
-}
-
-//*****************************************************************************
-//
-//! This function is used to get the minimum volume setting for a given
-//! audio device.
-//!
-//! \param psAudioInstance is an instance of the USB audio device.
-//! \param ui32Interface is the interface number to use to query the minimum
-//! volume control value.
-//! \param ui32Channel is the 0 based channel number to query.
-//!
-//! The function is used to retrieve the minimum volume setting for an audio
-//! device on the channel specified by \e ui32Channel. The \e ui32Interface is
-//! ignored for now and should be set to 0 to access the default audio control
-//! interface. The \e ui32Channel value starts with 0 which is the master
-//! audio volume control interface. The remaining \e ui32Channel values
-//! provide access to various other audio channels, with 1 and 2 being left and
-//! right audio channels.
-//!
-//! \note On devices that do not support volume control interfaces, this
-//! call returns 0, indicating a 0db setting.
-//!
-//! \return Returns the minimum volume setting for the requested interface.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioVolumeMinGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel)
-{
- return(VolumeSettingGet(psAudioInstance, ui32Interface, ui32Channel,
- USB_AC_GET_MIN));
-}
-
-//*****************************************************************************
-//
-//! This function is used to get the volume control resolution for a given
-//! audio device.
-//!
-//! \param psAudioInstance is an instance of the USB audio device.
-//! \param ui32Interface is the interface number to use to query the resolution
-//! for the volume control.
-//! \param ui32Channel is the 0 based channel number to query.
-//!
-//! The function is used to retrieve the volume control resolution for an audio
-//! device on the channel specified by \e ui32Channel. The \e ui32Interface is
-//! ignored for now and should be set to 0 to access the default audio control
-//! interface. The \e ui32Channel value starts with 0 which is the master
-//! audio volume control interface. The remaining \e ui32Channel values
-//! provide access to various other audio channels, with 1 and 2 being left and
-//! right audio channels.
-//!
-//! \note On devices that do not support volume control interfaces, this
-//! call returns 0, indicating a 0db setting.
-//!
-//! \return Returns the volume control resolution for the requested interface.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioVolumeResGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel)
-{
- return(VolumeSettingGet(psAudioInstance, ui32Interface, ui32Channel,
- USB_AC_GET_RES));
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the current volume setting for a given
-//! audio device.
-//!
-//! \param psAudioInstance is an instance of the USB audio device.
-//! \param ui32Interface is the interface number to use to set the current
-//! volume setting.
-//! \param ui32Channel is the 0 based channel number to query.
-//! \param ui32Value is the value to write to the USB audio device.
-//!
-//! The function is used to set the current volume setting for an audio
-//! device on the channel specified by \e ui32Channel. The \e ui32Interface is
-//! ignored for now and should be set to 0 to access the default audio control
-//! interface. The \e ui32Channel value starts with 0 which is the master
-//! audio volume control interface. The remaining \e ui32Channel values
-//! provide access to various other audio channels, with 1 and 2 being left and
-//! right audio channels.
-//!
-//! \note On devices that do not support volume control interfaces, this
-//! call returns 0, indicating a 0db setting.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHostAudioVolumeSet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel,
- uint32_t ui32Value)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a Class specific Interface OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE;
-
- //
- // Request is to set the current value.
- //
- sSetupPacket.bRequest = USB_AC_SET_CUR;
-
- //
- // Request the volume control.
- //
- sSetupPacket.wValue = VOLUME_CONTROL | (ui32Channel & 0xff);
-
- //
- // Set Volume control ID and interface to 0.
- //
- sSetupPacket.wIndex = psAudioInstance->ui8VolumeID << 8;
-
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = 2;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psAudioInstance->psDevice,
- (uint8_t *)&ui32Value, 2,
- psAudioInstance->psDevice->sDeviceDescriptor.bMaxPacketSize0);
-}
-
-//*****************************************************************************
-//
-//! This function is called to determine if an audio format is supported by the
-//! connected USB Audio device.
-//!
-//! \param psAudioInstance is the device instance for this call.
-//! \param ui32SampleRate is the sample rate of the audio stream.
-//! \param ui32Bits is the number of bits per sample in the audio stream.
-//! \param ui32Channels is the number of channels in the audio stream.
-//! \param ui32Flags is a set of flags to determine what type of interface to
-//! retrieve.
-//!
-//! This function is called when an application needs to determine which audio
-//! formats are supported by a USB audio device that has been connected. The
-//! \e psAudioInstance value that is used with this call is the value that was
-//! returned from the USBHostAudioOpen() function. This call checks the
-//! USB audio device to determine if it can support the values provided in the
-//! \e ui32SampleRate, \e ui32Bits, and \e ui32Channels values. The
-//! \e ui32Flags currently only supports either the \b USBH_AUDIO_FORMAT_IN or
-//! \b USBH_AUDIO_FORMAT_OUT values that indicates if a request is for an
-//! audio input and an audio output. If the format is supported this
-//! function returns zero, and this function returns a non-zero value if the
-//! format is not supported. This function does not set the current output or
-//! input format.
-//!
-//! \return A value of zero indicates the supplied format is supported and
-//! a non-zero value indicates that the format is not supported.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioFormatGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32SampleRate, uint32_t ui32Bits,
- uint32_t ui32Channels, uint32_t ui32Flags)
-{
- //
- // Look for the requested format.
- //
- if(AudioGetInterface(psAudioInstance, USB_ADF_PCM, ui32SampleRate,
- ui32Bits >> 3, ui32Channels, ui32Flags) !=
- INVALID_INTERFACE)
- {
- return(0);
- }
- return(1);
-}
-
-//*****************************************************************************
-//
-//! This function is called to set the current sample rate on an audio
-//! interface.
-//!
-//! \param psAudioInstance specifies the device instance for this call.
-//! \param ui32SampleRate is the sample rate in Hz.
-//! \param ui32Bits is the number of bits per sample.
-//! \param ui32Channels is then number of audio channels.
-//! \param ui32Flags is a set of flags that determine the access type.
-//!
-//! This function is called when to set the current audio output or input
-//! format for a USB audio device. The \e psAudioInstance value that is used
-//! with this call is the value that was returned from the USBHostAudioOpen()
-//! function. The application can use this call to insure that the audio
-//! format is supported and set the format at the same time. If the
-//! application is just checking for supported rates, then it should call the
-//! USBHostAudioFormatGet().
-//!
-//! \note This function must be called before attempting to send or receive
-//! audio with the USBHostAudioPlay() or USBHostAudioRecord() functions.
-//!
-//! \return A non-zero value indicates the supplied format is not supported and
-//! a zero value indicates that the format was supported and has been
-//! configured.
-//
-//*****************************************************************************
-uint32_t
-USBHostAudioFormatSet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32SampleRate, uint32_t ui32Bits,
- uint32_t ui32Channels, uint32_t ui32Flags)
-{
- uint32_t ui32Interface;
-
- //
- // Look for the requested format.
- //
- ui32Interface = AudioGetInterface(psAudioInstance, USB_ADF_PCM,
- ui32SampleRate, ui32Bits >> 3,
- ui32Channels, ui32Flags);
-
- if(ui32Interface == INVALID_INTERFACE)
- {
- return(1);
- }
-
- //
- // Determine if this is an input or output request.
- //
- if(ui32Flags & USBH_AUDIO_FORMAT_IN)
- {
- //
- // Get the active interface number and alternate setting for this
- // format.
- //
- psAudioInstance->ui8InInterface =
- (uint8_t)(ui32Interface & INTERFACE_NUM_M);
- psAudioInstance->ui8InAltSetting =
- (uint8_t)((ui32Interface & INTERFACE_ALTSETTING_M) >>
- INTERFACE_ALTSETTING_S);
- }
- else
- {
- //
- // Get the active interface number and alternate setting for this
- // format.
- //
- psAudioInstance->ui8OutInterface =
- (uint8_t)(ui32Interface & INTERFACE_NUM_M);
- psAudioInstance->ui8OutAltSetting =
- (uint8_t)((ui32Interface & INTERFACE_ALTSETTING_M) >>
- INTERFACE_ALTSETTING_S);
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is called to send an audio buffer to the USB audio device.
-//!
-//! \param psAudioInstance specifies the device instance for this call.
-//! \param pvBuffer is the audio buffer to send.
-//! \param ui32Size is the size of the buffer in bytes.
-//! \param pfnCallback is a pointer to a callback function that is called
-//! when the buffer can be used again.
-//!
-//! This function is called when an application needs to schedule a new buffer
-//! for output to the USB audio device. Since this call schedules the transfer
-//! and returns immediately, the application should provide a \e pfnCallback
-//! function to be notified when the buffer can be used again by the
-//! application. The \e pfnCallback function provided is called with the
-//! \e pvBuffer parameter set to the \e pvBuffer provided by this call, the
-//! \e ui32Param can be ignored and the \e ui32Event parameter is
-//! \b USB_EVENT_TX_COMPLETE.
-//!
-//! \return This function returns the number of bytes that were scheduled
-//! to be sent. If this function returns zero then there was no USB audio
-//! device present or the request could not be satisfied at this time.
-//
-//*****************************************************************************
-int32_t
-USBHostAudioPlay(tUSBHostAudioInstance *psAudioInstance, void *pvBuffer,
- uint32_t ui32Size, tUSBHostAudioCallback pfnCallback)
-{
- uint32_t ui32Bytes;
-
- //
- // Make sure that there is a device present.
- //
- if(psAudioInstance->psDevice == 0)
- {
- return(0);
- }
-
- //
- // If the audio output interface is not active then select the current
- // active audio interface.
- //
- if(HWREGBITW(&psAudioInstance->ui32Flags, AUDIO_FLAG_OUT_ACTIVE) == 0)
- {
- //
- // Indicate the active audio interface has been selected.
- //
- HWREGBITW(&psAudioInstance->ui32Flags, AUDIO_FLAG_OUT_ACTIVE) = 1;
-
- //
- // Configure the USB audio device to use the selected audio interface.
- //
- USBHCDSetInterface(0, (uint32_t)psAudioInstance->psDevice,
- psAudioInstance->ui8OutInterface,
- psAudioInstance->ui8OutAltSetting);
- }
-
- //
- // Save the callback function and the buffer pointer.
- //
- psAudioInstance->pfnOutCallback = pfnCallback;
- psAudioInstance->pvOutBuffer = (void *)pvBuffer;
-
- //
- // Schedule the data to be written out to the FIFO.
- //
- ui32Bytes = USBHCDPipeSchedule(psAudioInstance->ui32IsochOutPipe, pvBuffer,
- ui32Size);
-
- //
- // Return the number of bytes scheduled to be sent.
- //
- return(ui32Bytes);
-}
-
-//*****************************************************************************
-//
-//! This function is called to provide an audio buffer to the USB audio device
-//! for audio input.
-//!
-//! \param psAudioInstance specifies the device instance for this call.
-//! \param pvBuffer is the audio buffer to send.
-//! \param ui32Size is the size of the buffer in bytes.
-//! \param pfnCallback is a pointer to a callback function that is called
-//! when the buffer has been filled.
-//!
-//! This function is called when an application needs to schedule a new buffer
-//! for input from the USB audio device. Since this call schedules the
-//! transfer and returns immediately, the application should provide a
-//! \e pfnCallback function to be notified when the buffer has been filled with
-//! audio data. When the \e pfnCallback function is called, the \e pvBuffer
-//! parameter is set to \e pvBuffer provided in this call, the \e ui32Param is
-//! the number of valid bytes in the pvBuffer and the \e ui32Event is set to
-//! \b USB_EVENT_RX_AVAILABLE.
-//!
-//! \return This function returns the number of bytes that were scheduled
-//! to be sent. If this function returns zero then there was no USB audio
-//! device present or the device does not support audio input.
-//
-//*****************************************************************************
-int32_t
-USBHostAudioRecord(tUSBHostAudioInstance *psAudioInstance, void *pvBuffer,
- uint32_t ui32Size, tUSBHostAudioCallback pfnCallback)
-{
- uint32_t ui32Bytes;
-
- //
- // Make sure that there is a device present.
- //
- if(psAudioInstance->psDevice == 0)
- {
- return(0);
- }
-
- //
- // If the audio input interface is not active then select the current
- // active audio interface.
- //
- if(HWREGBITW(&psAudioInstance->ui32Flags, AUDIO_FLAG_IN_ACTIVE) == 0)
- {
- //
- // Indicate the active audio interface has been selected.
- //
- HWREGBITW(&psAudioInstance->ui32Flags, AUDIO_FLAG_IN_ACTIVE) = 1;
-
- //
- // Configure the USB audio device to use the selected audio interface.
- //
- USBHCDSetInterface(0, (uint32_t)psAudioInstance->psDevice,
- psAudioInstance->ui8InInterface,
- psAudioInstance->ui8InAltSetting);
- }
-
- //
- // Save the callback function and the buffer pointer.
- //
- psAudioInstance->pfnInCallback = pfnCallback;
- psAudioInstance->pvInBuffer = (void *)pvBuffer;
-
- //
- // Schedule the data to be written out to the FIFO.
- //
- ui32Bytes = USBHCDPipeSchedule(psAudioInstance->ui32IsochInPipe, pvBuffer,
- ui32Size);
-
- //
- // Return the number of bytes scheduled to be sent.
- //
- return(ui32Bytes);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.h
deleted file mode 100644
index 028f0394d..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhaudio.h
+++ /dev/null
@@ -1,161 +0,0 @@
-//*****************************************************************************
-//
-// usbhaudio.h - USB host audio class driver.
-//
-// Copyright (c) 2010-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHAUDIO_H__
-#define __USBHAUDIO_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// USB host audio specific events
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This USB host audio event indicates that the device is connected and
-//! ready to send or receive buffers. The \e pvBuffer and \e ui32Param
-//! values are not used in this event.
-//
-//*****************************************************************************
-#define USBH_AUDIO_EVENT_OPEN (USBH_AUDIO_EVENT_BASE + 0)
-
-//*****************************************************************************
-//
-//! This USB host audio event indicates that the previously connected device
-//! has been disconnected. The \e pvBuffer and \e ui32Param values are not used
-//! in this event.
-//
-//*****************************************************************************
-#define USBH_AUDIO_EVENT_CLOSE (USBH_AUDIO_EVENT_BASE + 1)
-
-//*****************************************************************************
-//
-// This definition is used with the USBHostAudioFormatGet() and
-// USBHostAudioFormatSet() API's to determine if the audio input is being
-// accesses(USBH_AUDIO_FORMAT_IN set) or audio output(USBH_AUDIO_FORMAT clear).
-//
-//*****************************************************************************
-#define USBH_AUDIO_FORMAT_IN 0x00000001
-#define USBH_AUDIO_FORMAT_OUT 0x00000000
-
-typedef struct
-{
- uint8_t ui8Channels;
- uint8_t ui8Bits;
- uint32_t ui32SampleRate;
-}
-tUSBAudioFormat;
-
-typedef struct tUSBHostAudioInstance tUSBHostAudioInstance;
-
-//*****************************************************************************
-//
-// The prototype for the host USB Audio driver callback function.
-//
-//*****************************************************************************
-typedef void (*tUSBHostAudioCallback)(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Event,
- uint32_t ui32MsgParam,
- void *pvMsgData);
-
-//*****************************************************************************
-//
-// API Function Prototypes
-//
-//*****************************************************************************
-extern tUSBHostAudioInstance * USBHostAudioOpen(uint32_t ui32Index,
- tUSBHostAudioCallback pfnCallback);
-extern void USBHostAudioClose(tUSBHostAudioInstance *psAudioInstance);
-extern int32_t USBHostAudioPlay(tUSBHostAudioInstance *psAudioInstance,
- void *pvBuffer, uint32_t ui32Size,
- tUSBHostAudioCallback pfnCallback);
-
-extern uint32_t USBHostAudioFormatGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32SampleRate,
- uint32_t ui32Bits, uint32_t ui32Channels,
- uint32_t ui32Flags);
-extern uint32_t USBHostAudioFormatSet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32SampleRate,
- uint32_t ui32Bits, uint32_t ui32Channels,
- uint32_t ui32Flags);
-
-extern int32_t USBHostAudioRecord(tUSBHostAudioInstance *psAudioInstance,
- void *pvBuffer, uint32_t ui32Size,
- tUSBHostAudioCallback pfnAudioCallback);
-
-extern uint32_t USBHostAudioVolumeGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface,
- uint32_t ui32Channel);
-
-extern void USBHostAudioVolumeSet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface, uint32_t ui32Channel,
- uint32_t ui32Value);
-
-extern uint32_t USBHostAudioVolumeMaxGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface,
- uint32_t ui32Channel);
-
-extern uint32_t USBHostAudioVolumeMinGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface,
- uint32_t ui32Channel);
-
-extern uint32_t USBHostAudioVolumeResGet(tUSBHostAudioInstance *psAudioInstance,
- uint32_t ui32Interface,
- uint32_t ui32Channel);
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.c
deleted file mode 100644
index ea55f0abf..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.c
+++ /dev/null
@@ -1,687 +0,0 @@
-//*****************************************************************************
-//
-// usbhhid.c - This file contains the host HID driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbhid.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/host/usbhhid.h"
-
-static void * HIDDriverOpen(tUSBHostDevice *psDevice);
-static void HIDDriverClose(void *pvInstance);
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// If the user has not explicitly stated the maximum number of HID devices to
-// support, we assume that we need to support up to the maximum number of USB
-// devices that the build is configured for.
-//
-//*****************************************************************************
-#ifndef MAX_HID_DEVICES
-#define MAX_HID_DEVICES MAX_USB_DEVICES
-#endif
-
-//*****************************************************************************
-//
-// This is the structure that holds all of the data for a given instance of
-// a HID device.
-//
-//*****************************************************************************
-struct tHIDInstance
-{
- //
- // Save the device instance.
- //
- tUSBHostDevice *psDevice;
-
- //
- // Used to save the callback.
- //
- tUSBCallback pfnCallback;
-
- //
- // Callback data provided by caller.
- //
- void *pvCBData;
-
- //
- // Used to remember what type of device was registered.
- //
- tHIDSubClassProtocol iDeviceType;
-
- //
- // Interrupt IN pipe.
- //
- uint32_t ui32IntInPipe;
-};
-
-//*****************************************************************************
-//
-// The instance data storage for attached hid devices.
-//
-//*****************************************************************************
-static tHIDInstance g_psHIDDevice[MAX_HID_DEVICES];
-
-//*****************************************************************************
-//
-//! This constant global structure defines the HID Class Driver that is
-//! provided with the USB library.
-//
-//*****************************************************************************
-const tUSBHostClassDriver g_sUSBHIDClassDriver =
-{
- USB_CLASS_HID,
- HIDDriverOpen,
- HIDDriverClose,
- 0
-};
-
-//*****************************************************************************
-//
-//! This function is used to open an instance of a HID device.
-//!
-//! \param iDeviceType is the type of device that should be loaded for this
-//! instance of the HID device.
-//! \param pfnCallback is the function that will be called whenever changes
-//! are detected for this device.
-//! \param pvCBData is the data that will be returned in when the
-//! \e pfnCallback function is called.
-//!
-//! This function creates an instance of an specific type of HID device. The
-//! \e iDeviceType parameter is one subclass/protocol values of the types
-//! specified in enumerated types tHIDSubClassProtocol. Only devices that
-//! enumerate with this type will be called back via the \e pfnCallback
-//! function. The \e pfnCallback parameter is the callback function for any
-//! events that occur for this device type. The \e pfnCallback function must
-//! point to a valid function of type \e tUSBCallback for this call to complete
-//! successfully. To release this device instance the caller of USBHHIDOpen()
-//! should call USBHHIDClose() and pass in the value returned from the
-//! USBHHIDOpen() call.
-//!
-//! \return This function returns and instance value that should be used with
-//! any other APIs that require an instance value. If a value of 0 is returned
-//! then the device instance could not be created.
-//
-//*****************************************************************************
-tHIDInstance *
-USBHHIDOpen(tHIDSubClassProtocol iDeviceType, tUSBCallback pfnCallback,
- void *pvCBData)
-{
- uint32_t ui32Loop;
-
- //
- // Find a free device instance structure.
- //
- for(ui32Loop = 0; ui32Loop < MAX_HID_DEVICES; ui32Loop++)
- {
- if(g_psHIDDevice[ui32Loop].iDeviceType == eUSBHHIDClassNone)
- {
- //
- // Save the instance data for this device.
- //
- g_psHIDDevice[ui32Loop].pfnCallback = pfnCallback;
- g_psHIDDevice[ui32Loop].iDeviceType = iDeviceType;
- g_psHIDDevice[ui32Loop].pvCBData = pvCBData;
-
- //
- // Return the device instance pointer.
- //
- return(&g_psHIDDevice[ui32Loop]);
- }
- }
-
- //
- // If we get here, there are no space device slots so return NULL to
- // indicate a problem.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to release an instance of a HID device.
-//!
-//! \param psHIDInstance is the instance value for a HID device to release.
-//!
-//! This function releases an instance of a HID device that was created by a
-//! call to USBHHIDOpen(). This call is required to allow other HID devices
-//! to be enumerated after another HID device has been disconnected. The
-//! \e psHIDInstance parameter should hold the value that was returned from
-//! the previous call to USBHHIDOpen().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHHIDClose(tHIDInstance *psHIDInstance)
-{
- //
- // Disable any more notifications from the HID layer.
- //
- psHIDInstance->pfnCallback = 0;
-
- //
- // Mark this device slot as free.
- //
- psHIDInstance->iDeviceType = eUSBHHIDClassNone;
-}
-
-//*****************************************************************************
-//
-// This function handles callbacks for the interrupt IN endpoint.
-//
-//*****************************************************************************
-static void
-HIDIntINCallback(uint32_t ui32Pipe, uint32_t ui32Event)
-{
- int32_t i32Dev;
-
- switch (ui32Event)
- {
- //
- // Handles a request to schedule a new request on the interrupt IN
- // pipe.
- //
- case USB_EVENT_SCHEDULER:
- {
- USBHCDPipeSchedule(ui32Pipe, 0, 1);
- break;
- }
- //
- // Called when new data is available on the interrupt IN pipe.
- //
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // Determine which device this notification is intended for.
- //
- for(i32Dev = 0; i32Dev < MAX_HID_DEVICES; i32Dev++)
- {
- //
- // Does this device own the pipe we have been passed?
- //
- if(g_psHIDDevice[i32Dev].ui32IntInPipe == ui32Pipe)
- {
- //
- // Yes - send the report data to the USB host HID device
- // class driver.
- //
- g_psHIDDevice[i32Dev].pfnCallback(
- g_psHIDDevice[i32Dev].pvCBData,
- USB_EVENT_RX_AVAILABLE, ui32Pipe, 0);
- }
- }
-
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-//! This function is used to open an instance of the HID driver.
-//!
-//! \param psDevice is a pointer to the device information structure.
-//!
-//! This function will attempt to open an instance of the HID driver based on
-//! the information contained in the psDevice structure. This call can fail if
-//! there are not sufficient resources to open the device. The function will
-//! return a value that should be passed back into USBHIDClose() when the
-//! driver is no longer needed.
-//!
-//! \return The function will return a pointer to a HID driver instance.
-//
-//*****************************************************************************
-static void *
-HIDDriverOpen(tUSBHostDevice *psDevice)
-{
- int32_t i32Idx, i32Dev;
- tEndpointDescriptor *psEndpointDescriptor;
- tInterfaceDescriptor *psInterface;
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(psDevice->psConfigDescriptor, 0, 0);
-
- //
- // Search the currently open instances for one that supports the protocol
- // of this device.
- //
- for(i32Dev = 0; i32Dev < MAX_HID_DEVICES; i32Dev++)
- {
- if(g_psHIDDevice[i32Dev].iDeviceType ==
- psInterface->bInterfaceProtocol)
- {
- //
- // Save the device pointer.
- //
- g_psHIDDevice[i32Dev].psDevice = psDevice;
-
- for(i32Idx = 0; i32Idx < 3; i32Idx++)
- {
- //
- // Get the first endpoint descriptor.
- //
- psEndpointDescriptor = USBDescGetInterfaceEndpoint(psInterface,
- i32Idx,
- 256);
-
- //
- // If no more endpoints then break out.
- //
- if(psEndpointDescriptor == 0)
- {
- break;
- }
-
- //
- // Interrupt
- //
- if((psEndpointDescriptor->bmAttributes & USB_EP_ATTR_TYPE_M) ==
- USB_EP_ATTR_INT)
- {
- //
- // Interrupt IN.
- //
- if(psEndpointDescriptor->bEndpointAddress & USB_EP_DESC_IN)
- {
- g_psHIDDevice[i32Dev].ui32IntInPipe =
- USBHCDPipeAlloc(0, USBHCD_PIPE_INTR_IN,
- psDevice, HIDIntINCallback);
- USBHCDPipeConfig(g_psHIDDevice[i32Dev].ui32IntInPipe,
- psEndpointDescriptor->wMaxPacketSize,
- psEndpointDescriptor->bInterval,
- (psEndpointDescriptor->bEndpointAddress &
- USB_EP_DESC_NUM_M));
- }
- }
- }
-
- //
- // If there is a callback function call it to inform the application that
- // the device has been enumerated.
- //
- if(g_psHIDDevice[i32Dev].pfnCallback != 0)
- {
- g_psHIDDevice[i32Dev].pfnCallback(
- g_psHIDDevice[i32Dev].pvCBData,
- USB_EVENT_CONNECTED,
- (uint32_t)&g_psHIDDevice[i32Dev], 0);
- }
-
- //
- // Save the device pointer.
- //
- g_psHIDDevice[i32Dev].psDevice = psDevice;
-
- return (&g_psHIDDevice[i32Dev]);
- }
- }
-
- //
- // If we get here, no user has registered an interest in this particular
- // HID device so we return an error.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to release an instance of the HID driver.
-//!
-//! \param pvInstance is an instance pointer that needs to be released.
-//!
-//! This function will free up any resources in use by the HID driver instance
-//! that is passed in. The \e pvInstance pointer should be a valid value that
-//! was returned from a call to USBHIDOpen().
-//!
-//! \return None.
-//
-//*****************************************************************************
-static void
-HIDDriverClose(void *pvInstance)
-{
- tHIDInstance *psInst;
-
- //
- // Get our instance pointer.
- //
- psInst = (tHIDInstance *)pvInstance;
-
- //
- // Reset the device pointer.
- //
- psInst->psDevice = 0;
-
- //
- // Free the Interrupt IN pipe.
- //
- if(psInst->ui32IntInPipe != 0)
- {
- USBHCDPipeFree(psInst->ui32IntInPipe);
- }
-
- //
- // If the callback exists, call it with a DISCONNECTED event.
- //
- if(psInst->pfnCallback != 0)
- {
- psInst->pfnCallback(psInst->pvCBData, USB_EVENT_DISCONNECTED,
- (uint32_t)pvInstance, 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the idle timeout for a HID device.
-//!
-//! \param psHIDInstance is the value that was returned from the call to
-//! USBHHIDOpen().
-//! \param ui8Duration is the duration of the timeout in milliseconds.
-//! \param ui8ReportID is the report identifier to set the timeout on.
-//!
-//! This function will send the Set Idle command to a HID device to set the
-//! idle timeout for a given report. The length of the timeout is specified
-//! by the \e ui8Duration parameter and the report the timeout for is in the
-//! \e ui8ReportID value.
-//!
-//! \return Always returns 0.
-//
-//*****************************************************************************
-uint32_t
-USBHHIDSetIdle(tHIDInstance *psHIDInstance, uint8_t ui8Duration,
- uint8_t ui8ReportID)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a Class specific interface OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_IDLE;
- sSetupPacket.wValue = (ui8Duration << 8) | ui8ReportID;
-
- //
- // Set this on interface 1.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // This is always 0 for this request.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Put the setup packet in the buffer.
- //
- return(USBHCDControlTransfer(0, &sSetupPacket, psHIDInstance->psDevice,
- 0, 0, MAX_PACKET_SIZE_EP0));
-}
-
-//*****************************************************************************
-//
-//! This function can be used to retrieve the report descriptor for a given
-//! device instance.
-//!
-//! \param psHIDInstance is the value that was returned from the call to
-//! USBHHIDOpen().
-//! \param pui8Buffer is the memory buffer to use to store the report
-//! descriptor.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Buffer.
-//!
-//! This function is used to return a report descriptor from a HID device
-//! instance so that it can determine how to interpret reports that are
-//! returned from the device indicated by the \e psHIDInstance parameter.
-//! This call is blocking and will return the number of bytes read into the
-//! \e pui8Buffer.
-//!
-//! \return Returns the number of bytes read into the \e pui8Buffer.
-//
-//*****************************************************************************
-uint32_t
-USBHHIDGetReportDescriptor(tHIDInstance *psHIDInstance, uint8_t *pui8Buffer,
- uint32_t ui32Size)
-{
- tUSBRequest sSetupPacket;
- uint32_t ui32Bytes;
-
- //
- // This is a Standard Device IN request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_IN | USB_RTYPE_STANDARD |
- USB_RTYPE_INTERFACE;
-
- //
- // Request a Report Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_GET_DESCRIPTOR;
- sSetupPacket.wValue = USB_HID_DTYPE_REPORT << 8;
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // All devices must have at least an 8 byte max packet size so just ask
- // for 8 bytes to start with.
- //
- sSetupPacket.wLength = ui32Size;
-
- //
- // Now get the full descriptor now that the actual maximum packet size
- // is known.
- //
- ui32Bytes = USBHCDControlTransfer(0, &sSetupPacket,
- psHIDInstance->psDevice, pui8Buffer, ui32Size,
- psHIDInstance->psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- return(ui32Bytes);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set or clear the boot protocol state of a device.
-//!
-//! \param psHIDInstance is the value that was returned from the call to
-//! USBHHIDOpen().
-//! \param ui32BootProtocol is either zero or non-zero to indicate which
-//! protocol to use for the device.
-//!
-//! A USB host device can use this function to set the protocol for a connected
-//! HID device. This is commonly used to set keyboards and mice into their
-//! simplified boot protocol modes to fix the report structure to a know
-//! state.
-//!
-//! \return This function returns 0.
-//
-//*****************************************************************************
-uint32_t
-USBHHIDSetProtocol(tHIDInstance *psHIDInstance, uint32_t ui32BootProtocol)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a Standard Device IN request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE;
-
- //
- // Request a Report Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_PROTOCOL;
-
- if(ui32BootProtocol)
- {
- //
- // Boot Protocol.
- //
- sSetupPacket.wValue = 0;
- }
- else
- {
- //
- // Report Protocol.
- //
- sSetupPacket.wValue = 1;
- }
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // Always 0.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Now get the full descriptor now that the actual maximum packet size
- // is known.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psHIDInstance->psDevice, 0, 0,
- psHIDInstance->psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to retrieve a report from a HID device.
-//!
-//! \param psHIDInstance is the value that was returned from the call to
-//! USBHHIDOpen().
-//! \param ui32Interface is the interface to retrieve the report from.
-//! \param pui8Data is the memory buffer to use to store the report.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Buffer.
-//!
-//! This function is used to retrieve a report from a USB pipe. It is usually
-//! called when the USB HID layer has detected a new data available in a USB
-//! pipe. The USB HID host device code will receive a
-//! \b USB_EVENT_RX_AVAILABLE event when data is available, allowing the
-//! callback function to retrieve the data.
-//!
-//! \return Returns the number of bytes read from report.
-//
-//*****************************************************************************
-uint32_t
-USBHHIDGetReport(tHIDInstance *psHIDInstance, uint32_t ui32Interface,
- uint8_t *pui8Data, uint32_t ui32Size)
-{
- //
- // Read the Data out.
- //
- ui32Size = USBHCDPipeReadNonBlocking(psHIDInstance->ui32IntInPipe,
- pui8Data, ui32Size);
-
- //
- // Return the number of bytes read from the interrupt in pipe.
- //
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! This function is used to send a report to a HID device.
-//!
-//! \param psHIDInstance is the value that was returned from the call to
-//! USBHHIDOpen().
-//! \param ui32Interface is the interface to send the report to.
-//! \param pui8Data is the memory buffer to use to store the report.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Buffer.
-//!
-//! This function is used to send a report to a USB HID device. It can be
-//! only be called from outside the callback context as this function will not
-//! return from the call until the data has been sent successfully.
-//!
-//! \return Returns the number of bytes sent to the device.
-//
-//*****************************************************************************
-uint32_t
-USBHHIDSetReport(tHIDInstance *psHIDInstance, uint32_t ui32Interface,
- uint8_t *pui8Data, uint32_t ui32Size)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a class specific OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_INTERFACE;
-
- //
- // Request a Report Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_REPORT;
- sSetupPacket.wValue = USB_HID_REPORT_OUTPUT << 8;
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = (uint16_t)ui32Interface;
-
- //
- // Always 0.
- //
- sSetupPacket.wLength = ui32Size;
-
- //
- // Now get the full descriptor now that the actual maximum packet size
- // is known.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psHIDInstance->psDevice,
- pui8Data, ui32Size,
- psHIDInstance->psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.h
deleted file mode 100644
index e0df99fc0..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhid.h
+++ /dev/null
@@ -1,164 +0,0 @@
-//*****************************************************************************
-//
-// usbhhid.h - This hold the host driver for hid class.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHHID_H__
-#define __USBHHID_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-typedef struct tHIDInstance tHIDInstance;
-
-//*****************************************************************************
-//
-// These defines are the the events that will be passed in the ui32Event
-// parameter of the callback from the driver.
-//
-//*****************************************************************************
-#define USBH_EVENT_HID_SETRPT USBH_HID_EVENT_BASE + 0
-#define USBH_EVENT_HID_REPORT USBH_HID_EVENT_BASE + 1
-
-//
-//! The HID keyboard detected a key being pressed.
-//
-#define USBH_EVENT_HID_KB_PRESS USBH_HID_EVENT_BASE + 16
-
-//
-//! The HID keyboard detected a key being released.
-//
-#define USBH_EVENT_HID_KB_REL USBH_HID_EVENT_BASE + 17
-
-//
-//! The HID keyboard detected one of the keyboard modifiers being pressed.
-//
-#define USBH_EVENT_HID_KB_MOD USBH_HID_EVENT_BASE + 18
-
-//
-//! A button was pressed on a HID mouse.
-//
-#define USBH_EVENT_HID_MS_PRESS USBH_HID_EVENT_BASE + 32
-
-//
-//! A button was released on a HID mouse.
-//
-#define USBH_EVENT_HID_MS_REL USBH_HID_EVENT_BASE + 33
-
-//
-//! The HID mouse detected movement in the X direction.
-//
-#define USBH_EVENT_HID_MS_X USBH_HID_EVENT_BASE + 34
-
-//
-//! The HID mouse detected movement in the Y direction.
-//
-#define USBH_EVENT_HID_MS_Y USBH_HID_EVENT_BASE + 35
-
-//*****************************************************************************
-//
-//! The following values are used to register callbacks to the USB HOST HID
-//! device class layer.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- //! No device should be used. This value should not be used by
- //! applications.
- //
- eUSBHHIDClassNone = 0,
-
- //
- //! This is a keyboard device.
- //
- eUSBHHIDClassKeyboard,
-
- //
- //! This is a mouse device.
- //
- eUSBHHIDClassMouse,
-
- //
- //! This is a vendor specific device.
- //
- eUSBHHIDClassVendor
-}
-tHIDSubClassProtocol;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Prototypes.
-//
-//*****************************************************************************
-extern tHIDInstance * USBHHIDOpen(tHIDSubClassProtocol iDeviceType,
- tUSBCallback pfnCallback,
- void *pvCBData);
-extern void USBHHIDClose(tHIDInstance *psHIDInstance);
-extern uint32_t USBHHIDGetReportDescriptor(tHIDInstance *psHIDInstance,
- uint8_t *pui8Buffer,
- uint32_t ui32Size);
-extern uint32_t USBHHIDSetIdle(tHIDInstance *psHIDInstance, uint8_t ui8Duration,
- uint8_t ui8ReportID);
-extern uint32_t USBHHIDSetProtocol(tHIDInstance *psHIDInstance,
- uint32_t ui32BootProtocol);
-extern uint32_t USBHHIDSetReport(tHIDInstance *psHIDInstance,
- uint32_t ui32Interface, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern uint32_t USBHHIDGetReport(tHIDInstance *psHIDInstance,
- uint32_t ui32Interface, uint8_t *pui8Data,
- uint32_t ui32Size);
-
-extern const tUSBHostClassDriver g_sUSBHIDClassDriver;
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHHID_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.c
deleted file mode 100644
index 81f7c8a72..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.c
+++ /dev/null
@@ -1,682 +0,0 @@
-//*****************************************************************************
-//
-// usbhhidkeyboard.c - This file holds the application interfaces for USB
-// keyboard devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "usblib/usblib.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/usbhid.h"
-#include "usblib/host/usbhhid.h"
-#include "usblib/host/usbhhidkeyboard.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_device
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Prototypes for local functions.
-//
-//*****************************************************************************
-static uint32_t USBHKeyboardCallback(void *pvKeyboard, uint32_t ui32Event,
- uint32_t ui32MsgParam, void *pvMsgData);
-
-//*****************************************************************************
-//
-// The size of a USB keyboard report.
-//
-//*****************************************************************************
-#define USBHKEYB_REPORT_SIZE 8
-
-//*****************************************************************************
-//
-// These are the flags for the tUSBHKeyboard.ui32HIDFlags member variable.
-//
-//*****************************************************************************
-#define USBHKEYB_DEVICE_PRESENT 0x00000001
-
-//*****************************************************************************
-//
-// This is the structure definition for a keyboard device instance.
-//
-//*****************************************************************************
-struct tUSBHKeyboard
-{
- //
- // Global flags for an instance of a keyboard.
- //
- uint32_t ui32HIDFlags;
-
- //
- // The applications registered callback.
- //
- tUSBHIDKeyboardCallback pfnCallback;
-
- //
- // The HID instance pointer for this keyboard instance.
- //
- tHIDInstance *psHIDInstance;
-
- //
- // NUM_LOCK, CAPS_LOCK, SCROLL_LOCK, COMPOSE or KANA keys.
- //
- uint8_t ui8KeyModSticky;
-
- //
- // This is the current state of the keyboard modifier keys.
- //
- uint8_t ui8KeyModState;
-
- //
- // This holds the keyboard usage codes for keys that are being held down.
- //
- uint8_t pui8KeyState[6];
-
- //
- // This is a local buffer to hold the current HID report that comes up
- // from the HID driver layer.
- //
- uint8_t pui8Buffer[USBHKEYB_REPORT_SIZE];
-};
-
-//*****************************************************************************
-//
-// This is the per instance information for a keyboard device.
-//
-//*****************************************************************************
-static tUSBHKeyboard g_sUSBHKeyboard =
-{
- 0
-};
-
-//*****************************************************************************
-//
-//! This function is used open an instance of a keyboard.
-//!
-//! \param pfnCallback is the callback function to call when new events occur
-//! with the keyboard returned.
-//! \param pui8Buffer is the memory used by the keyboard to interact with the
-//! USB keyboard.
-//! \param ui32Size is the size of the buffer provided by \e pui8Buffer.
-//!
-//! This function is used to open an instance of the keyboard. The value
-//! returned from this function should be used as the instance identifier for
-//! all other USBHKeyboard calls. The \e pui8Buffer memory buffer is used to
-//! access the keyboard. The buffer size required is at least enough to hold
-//! a normal report descriptor for the device. If there is not enough space
-//! only a partial report descriptor will be read out.
-//!
-//! \return Returns the instance identifier for the keyboard that is attached.
-//! If there is no keyboard present this will return 0.
-//
-//*****************************************************************************
-tUSBHKeyboard *
-USBHKeyboardOpen(tUSBHIDKeyboardCallback pfnCallback, uint8_t *pui8Buffer,
- uint32_t ui32Size)
-{
- //
- // Save the callback and data pointers.
- //
- g_sUSBHKeyboard.pfnCallback = pfnCallback;
-
- //
- // Save the instance pointer for the HID device that was opened.
- //
- g_sUSBHKeyboard.psHIDInstance =
- USBHHIDOpen(eUSBHHIDClassKeyboard, USBHKeyboardCallback,
- (void *)&g_sUSBHKeyboard);
-
- return(&g_sUSBHKeyboard);
-}
-
-//*****************************************************************************
-//
-//! This function is used close an instance of a keyboard.
-//!
-//! \param psKbInstance is the instance value for this keyboard.
-//!
-//! This function is used to close an instance of the keyboard that was opened
-//! with a call to USBHKeyboardOpen(). The \e psKbInstance value is the
-//! value that was returned when the application called USBHKeyboardOpen().
-//!
-//! \return This function returns 0 to indicate success any non-zero value
-//! indicates an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHKeyboardClose(tUSBHKeyboard *psKbInstance)
-{
- //
- // Reset the callback to null.
- //
- psKbInstance->pfnCallback = 0;
-
- //
- // Call the HID driver layer to close out this instance.
- //
- USBHHIDClose(psKbInstance->psHIDInstance);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to map a USB usage ID to a printable character.
-//!
-//! \param psKbInstance is the instance value for this keyboard.
-//! \param psTable is the table to use to map the usage ID to characters.
-//! \param ui8UsageID is the USB usage ID to map to a character.
-//!
-//! This function is used to map a USB usage ID to a character. The provided
-//! \e psTable is used to perform the mapping and is described by the
-//! tHIDKeyboardUsageTable type defined structure. See the documentation on
-//! the tHIDKeyboardUsageTable structure for more details on the internals of
-//! this structure. This function uses the current state of the shift keys
-//! and the Caps Lock key to modify the data returned by this function. The
-//! psTable structure has values indicating which keys are modified by Caps
-//! and alternate values for shifted cases. The number of bytes returned from
-//! Lock this function depends on the \e psTable structure passed in as it
-//! holds the number of bytes per character in the table.
-//!
-//! \return Returns the character value for the given usage id.
-//
-//*****************************************************************************
-uint32_t
-USBHKeyboardUsageToChar(tUSBHKeyboard *psKbInstance,
- const tHIDKeyboardUsageTable *psTable,
- uint8_t ui8UsageID)
-{
- uint32_t ui32Value, ui32Offset, ui32Shift;
- const uint8_t *pui8KeyBoardMap;
- const uint16_t *pui16KeyBoardMap;
-
- //
- // The added offset for the shifted character value.
- //
- ui32Shift = 0;
-
- //
- // Offset in the table for the character.
- //
- ui32Offset = (ui8UsageID * psTable->ui8BytesPerChar * 2);
-
- //
- // Handle the case where CAPS lock has been set.
- //
- if(psKbInstance->ui8KeyModSticky &= HID_KEYB_CAPS_LOCK)
- {
- //
- // See if this usage ID is modified by Caps Lock by checking the packed
- // bit array in the pui32ShiftState member of the psTable array.
- //
- if((psTable->pui32CapsLock[ui8UsageID >> 5]) >>
- (ui8UsageID & 0x1f) & 1)
- {
- ui32Shift = psTable->ui8BytesPerChar;
- }
- }
-
- //
- // Now handle if a shift key is being held.
- //
- if((psKbInstance->ui8KeyModState & 0x22) != 0)
- {
- //
- // Not shifted yet so we need to shift.
- //
- if(ui32Shift == 0)
- {
- ui32Shift = psTable->ui8BytesPerChar;
- }
- else
- {
- //
- // Unshift because CAPS LOCK and shift were pressed.
- //
- ui32Shift = 0;
- }
- }
-
- //
- // One byte per character.
- //
- if(psTable->ui8BytesPerChar == 1)
- {
- //
- // Get the base address of the table.
- //
- pui8KeyBoardMap = psTable->pvCharMapping;
-
- ui32Value = pui8KeyBoardMap[ui32Offset + ui32Shift];
- }
- //
- // Two bytes per character.
- //
- else if(psTable->ui8BytesPerChar == 2)
- {
- //
- // Get the base address of the table.
- //
- pui16KeyBoardMap = (uint16_t *)psTable->pvCharMapping;
-
- ui32Value = pui16KeyBoardMap[ui32Offset + ui32Shift];
- }
- //
- // All other sizes are unsupported for now.
- //
- else
- {
- ui32Value = 0;
- }
-
- return(ui32Value);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set one of the fixed modifier keys on a keyboard.
-//!
-//! \param psKbInstance is the instance value for this keyboard.
-//! \param ui32Modifiers is a bit mask of the modifiers to set on the keyboard.
-//!
-//! This function is used to set the modifier key states on a keyboard. The
-//! \e ui32Modifiers value is a bitmask of the following set of values:
-//! - HID_KEYB_NUM_LOCK
-//! - HID_KEYB_CAPS_LOCK
-//! - HID_KEYB_SCROLL_LOCK
-//! - HID_KEYB_COMPOSE
-//! - HID_KEYB_KANA
-//!
-//! Not all of these will be supported on all keyboards however setting values
-//! on a keyboard that does not have them should have no effect. The
-//! \e psKbInstance value is the value that was returned when the application
-//! called USBHKeyboardOpen(). If the value \b HID_KEYB_CAPS_LOCK is used it
-//! will modify the values returned from the USBHKeyboardUsageToChar()
-//! function.
-//!
-//! \return This function returns 0 to indicate success any non-zero value
-//! indicates an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHKeyboardModifierSet(tUSBHKeyboard *psKbInstance, uint32_t ui32Modifiers)
-{
- //
- // Remember the fact that this is set.
- //
- psKbInstance->ui8KeyModSticky = (uint8_t)ui32Modifiers;
-
- //
- // Set the LEDs on the keyboard.
- //
- USBHHIDSetReport(psKbInstance->psHIDInstance, 0,
- (uint8_t *)&ui32Modifiers, 1);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to initialize a keyboard interface after a keyboard
-//! has been detected.
-//!
-//! \param psKbInstance is the instance value for this keyboard.
-//!
-//! This function should be called after receiving a \b USB_EVENT_CONNECTED
-//! event in the callback function provided by USBHKeyboardOpen(), however this
-//! function should only be called outside the callback function. This will
-//! initialize the keyboard interface and determine the keyboard's
-//! layout and how it reports keys to the USB host controller. The
-//! \e psKbInstance value is the value that was returned when the application
-//! called USBHKeyboardOpen(). This function only needs to be called once
-//! per connection event but it should be called every time a
-//! \b USB_EVENT_CONNECTED event occurs.
-//!
-//! \return This function returns 0 to indicate success any non-zero value
-//! indicates an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHKeyboardInit(tUSBHKeyboard *psKbInstance)
-{
- uint8_t ui8ModData;
-
- //
- // Set the initial rate to only update on keyboard state changes.
- //
- USBHHIDSetIdle(psKbInstance->psHIDInstance, 0, 0);
-
- //
- // Read out the Report Descriptor from the keyboard and parse it for
- // the format of the reports coming back from the keyboard.
- //
- USBHHIDGetReportDescriptor(psKbInstance->psHIDInstance,
- psKbInstance->pui8Buffer,
- USBHKEYB_REPORT_SIZE);
-
- //
- // Set the keyboard to boot protocol.
- //
- USBHHIDSetProtocol(psKbInstance->psHIDInstance, 1);
-
- //
- // Used to clear the initial state of all on keyboard modifiers.
- //
- ui8ModData = 0;
-
- //
- // Update the keyboard LED state.
- //
- USBHHIDSetReport(psKbInstance->psHIDInstance, 0, &ui8ModData, 1);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the automatic poll rate of the keyboard.
-//!
-//! \param psKbInstance is the instance value for this keyboard.
-//! \param ui32PollRate is the rate in ms to cause the keyboard to update the
-//! host regardless of no change in key state.
-//!
-//! This function will allow an application to tell the keyboard how often it
-//! should send updates to the USB host controller regardless of any changes
-//! in keyboard state. The \e psKbInstance value is the value that was
-//! returned when the application called USBHKeyboardOpen(). The
-//! \e ui32PollRate is the new value in ms for the update rate on the keyboard.
-//! This value is initially set to 0 which indicates that the keyboard should
-//! only to update when the keyboard state changes. Any value other than 0 can
-//! be used to force the keyboard to generate auto-repeat sequences for the
-//! application.
-//!
-//! \return This function returns 0 to indicate success any non-zero value
-//! indicates an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHKeyboardPollRateSet(tUSBHKeyboard *psKbInstance, uint32_t ui32PollRate)
-{
- //
- // Send the Set Idle command to the USB keyboard.
- //
- USBHHIDSetIdle(psKbInstance->psHIDInstance, ui32PollRate, 0);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-// This is an internal function used to modify the current keyboard state.
-//
-// This function checks for changes in the keyboard state due to a new report
-// being received from the device. It first checks if this is a "roll-over"
-// case by seeing if 0x01 is in the first position of the new keyboard report.
-// This indicates that too many keys were pressed to handle and to ignore this
-// report. Next the keyboard modifier state is stored and if any changes are
-// detected a \b USBH_EVENT_HID_KB_MOD event is sent back to the application.
-// Then this function will check for any keys that have been released and send
-// a \b USBH_EVENT_HID_KB_REL even for each of these keys. The last check is
-// for any new keys that are pressed and a \b USBH_EVENT_HID_KB_PRESS event
-// will be sent for each new key pressed.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-UpdateKeyboardState(tUSBHKeyboard *psKbInstance)
-{
- int32_t i32NewKey, i32OldKey;
-
- //
- // rollover code so ignore this buffer.
- //
- if(psKbInstance->pui8Buffer[2] == 0x01)
- {
- return;
- }
-
- //
- // Handle the keyboard modifier states.
- //
- if(psKbInstance->ui8KeyModState != psKbInstance->pui8Buffer[0])
- {
- //
- // Notify the application of the event.
- //
- psKbInstance->pfnCallback(0, USBH_EVENT_HID_KB_MOD,
- psKbInstance->pui8Buffer[0], 0);
-
- //
- // Save the new state of the modifier keys.
- //
- psKbInstance->ui8KeyModState = psKbInstance->pui8Buffer[0];
- }
-
- //
- // This loop checks for keys that have been released to make room for new
- // ones that may have been pressed.
- //
- for(i32OldKey = 2; i32OldKey < 8; i32OldKey++)
- {
- //
- // If there is no old key pressed in this entry go to the next one.
- //
- if(psKbInstance->pui8KeyState[i32OldKey] == 0)
- {
- continue;
- }
-
- //
- // Check if this old key is still in the list of currently pressed
- // keys.
- //
- for(i32NewKey = 2; i32NewKey < 8; i32NewKey++)
- {
- //
- // Break out if the key is still present.
- //
- if(psKbInstance->pui8Buffer[i32NewKey] ==
- psKbInstance->pui8KeyState[i32OldKey])
- {
- break;
- }
- }
- //
- // If the old key was no longer in the list of pressed keys then
- // notify the application of the key release.
- //
- if(i32NewKey == 8)
- {
- //
- // Send the key release notification to the application.
- //
- psKbInstance->pfnCallback(0, USBH_EVENT_HID_KB_REL,
- psKbInstance->pui8KeyState[i32OldKey],
- 0);
- //
- // Remove the old key from the currently held key list.
- //
- psKbInstance->pui8KeyState[i32OldKey] = 0;
-
- }
- }
-
- //
- // This loop checks for new keys that have been pressed.
- //
- for(i32NewKey = 2; i32NewKey < 8; i32NewKey++)
- {
- //
- // The new list is empty so no new keys are pressed.
- //
- if(psKbInstance->pui8Buffer[i32NewKey] == 0)
- {
- break;
- }
-
- //
- // This loop checks if the current key was already pressed.
- //
- for(i32OldKey = 2; i32OldKey < 8; i32OldKey++)
- {
- //
- // If it is in both lists then it was already pressed so ignore it.
- //
- if(psKbInstance->pui8Buffer[i32NewKey] ==
- psKbInstance->pui8KeyState[i32OldKey])
- {
- break;
- }
- }
- //
- // The key in the new list was not found so it is new.
- //
- if(i32OldKey == 8)
- {
- //
- // Look for a free location to store this key usage code.
- //
- for(i32OldKey = 2; i32OldKey < 8; i32OldKey++)
- {
- //
- // If an empty location is found, store it and notify the
- // application.
- //
- if(psKbInstance->pui8KeyState[i32OldKey] == 0)
- {
- //
- // Save the newly pressed key.
- //
- psKbInstance->pui8KeyState[i32OldKey] =
- psKbInstance->pui8Buffer[i32NewKey];
-
- //
- // Notify the application of the new key that has been
- // pressed.
- //
- psKbInstance->pfnCallback( 0, USBH_EVENT_HID_KB_PRESS,
- psKbInstance->pui8Buffer[i32NewKey],
- 0);
-
- break;
- }
- }
- }
- }
-}
-
-//*****************************************************************************
-//
-//! This function handles event callbacks from the USB HID driver layer.
-//!
-//! \param pvKeyboard is the pointer that was passed in to the USBHHIDOpen()
-//! call.
-//! \param ui32Event is the event that has been passed up from the HID driver.
-//! \param ui32MsgParam has meaning related to the \e ui32Event that occurred.
-//! \param pvMsgData has meaning related to the \e ui32Event that occurred.
-//!
-//! This function will receive all event updates from the HID driver layer.
-//! The keyboard driver itself will mostly be concerned with report callbacks
-//! from the HID driver layer and parsing them into keystrokes for the
-//! application that has registered for callbacks with the USBHKeyboardOpen()
-//! call.
-//!
-//! \return Non-zero values should be assumed to indicate an error condition.
-//
-//*****************************************************************************
-static uint32_t
-USBHKeyboardCallback(void *pvKeyboard, uint32_t ui32Event,
- uint32_t ui32MsgParam, void *pvMsgData)
-{
- tUSBHKeyboard *psKbInstance;
-
- //
- // Recover the pointer to the instance data.
- //
- psKbInstance = (tUSBHKeyboard *)pvKeyboard;
-
- switch (ui32Event)
- {
- //
- // New keyboard has been connected so notify the application.
- //
- case USB_EVENT_CONNECTED:
- {
- //
- // Remember that a keyboard is present.
- //
- psKbInstance->ui32HIDFlags |= USBHKEYB_DEVICE_PRESENT;
-
- //
- // Notify the application that a new keyboard was connected.
- //
- psKbInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
-
- break;
- }
- case USB_EVENT_DISCONNECTED:
- {
- //
- // No keyboard is present.
- //
- psKbInstance->ui32HIDFlags &= ~USBHKEYB_DEVICE_PRESENT;
-
- //
- // Notify the application that the keyboard was disconnected.
- //
- psKbInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
-
- break;
- }
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // New keyboard report structure was received.
- //
- USBHHIDGetReport(psKbInstance->psHIDInstance, 0,
- psKbInstance->pui8Buffer,
- USBHKEYB_REPORT_SIZE);
-
- //
- // Update the application on the changes in the keyboard state.
- //
- UpdateKeyboardState(psKbInstance);
-
- break;
- }
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.h
deleted file mode 100644
index 600a0e839..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidkeyboard.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//*****************************************************************************
-//
-// usbhhidkeyboard.h - This file holds the application interfaces for USB
-// keyboard devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHHIDKEYBOARD_H__
-#define __USBHHIDKEYBOARD_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_device
-//! @{
-//
-//*****************************************************************************
-
-typedef struct tUSBHKeyboard tUSBHKeyboard;
-
-//*****************************************************************************
-//
-// The prototype for the host USB Keyboard driver callback function.
-//
-//*****************************************************************************
-typedef void (*tUSBHIDKeyboardCallback)(tUSBHKeyboard *psKbInstance,
- uint32_t ui32Event,
- uint32_t ui32MsgParam,
- void *pvMsgData);
-
-extern tUSBHKeyboard * USBHKeyboardOpen(tUSBHIDKeyboardCallback pfnCallback,
- uint8_t *pui8Buffer,
- uint32_t ui32BufferSize);
-extern uint32_t USBHKeyboardClose(tUSBHKeyboard *psKbInstance);
-extern uint32_t USBHKeyboardInit(tUSBHKeyboard *psKbInstance);
-extern uint32_t USBHKeyboardModifierSet(tUSBHKeyboard *psKbInstance,
- uint32_t ui32Modifiers);
-extern uint32_t USBHKeyboardPollRateSet(tUSBHKeyboard *psKbInstance,
- uint32_t ui32PollRate);
-extern uint32_t USBHKeyboardUsageToChar(tUSBHKeyboard *psKbInstance,
- const tHIDKeyboardUsageTable *psTable,
- uint8_t ui8UsageID);
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.c
deleted file mode 100644
index cd4dcd4bc..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.c
+++ /dev/null
@@ -1,393 +0,0 @@
-//*****************************************************************************
-//
-// usbhhidmouse.c - This file holds the application interfaces for USB
-// mouse devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "usblib/usblib.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/usbhid.h"
-#include "usblib/host/usbhhid.h"
-#include "usblib/host/usbhhidmouse.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_device
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Prototypes for local functions.
-//
-//*****************************************************************************
-static uint32_t USBHMouseCallback(void *pvMouse, uint32_t ui32Event,
- uint32_t ui32MsgParam, void *pvMsgData);
-
-//*****************************************************************************
-//
-// The size of a USB mouse report.
-//
-//*****************************************************************************
-#define USBHMS_REPORT_SIZE 4
-
-//*****************************************************************************
-//
-// These are the flags for the tUSBHMouse.ui32HIDFlags member variable.
-//
-//*****************************************************************************
-#define USBHMS_DEVICE_PRESENT 0x00000001
-
-//*****************************************************************************
-//
-// This is the structure definition for a mouse device instance.
-//
-//*****************************************************************************
-struct tUSBHMouse
-{
- //
- // Global flags for an instance of a mouse.
- //
- uint32_t ui32HIDFlags;
-
- //
- // The applications registered callback.
- //
- tUSBHIDMouseCallback pfnCallback;
-
- //
- // The current state of the buttons.
- //
- uint8_t ui8Buttons;
-
- //
- // This is a local buffer to hold the current HID report that comes up
- // from the HID driver layer.
- //
- uint8_t pui8Buffer[USBHMS_REPORT_SIZE];
-
- //
- // Heap data for the mouse currently used to read the HID Report
- // Descriptor.
- //
- uint8_t *pui8Heap;
-
- //
- // Size of the heap in bytes.
- //
- uint32_t ui32HeapSize;
-
- //
- // This is the instance value for the HID device that will be used for the
- // mouse.
- //
- tHIDInstance *psHIDInstance;
-};
-
-//*****************************************************************************
-//
-// This is the per instance information for a mouse device.
-//
-//*****************************************************************************
-static tUSBHMouse g_sUSBHMouse =
-{
- 0
-};
-
-//*****************************************************************************
-//
-//! This function is used open an instance of a mouse.
-//!
-//! \param pfnCallback is the callback function to call when new events occur
-//! with the mouse returned.
-//! \param pui8Buffer is the memory used by the driver to interact with the
-//! USB mouse.
-//! \param ui32Size is the size of the buffer provided by \e pui8Buffer.
-//!
-//! This function is used to open an instance of the mouse. The value
-//! returned from this function should be used as the instance identifier for
-//! all other USBHMouse calls. The \e pui8Buffer memory buffer is used to
-//! access the mouse. The buffer size required is at least enough to hold
-//! a normal report descriptor for the device.
-//!
-//! \return Returns the instance identifier for the mouse that is attached.
-//! If there is no mouse present this will return 0.
-//
-//*****************************************************************************
-tUSBHMouse *
-USBHMouseOpen(tUSBHIDMouseCallback pfnCallback, uint8_t *pui8Buffer,
- uint32_t ui32Size)
-{
- //
- // Save the callback and data pointers.
- //
- g_sUSBHMouse.pfnCallback = pfnCallback;
-
- //
- // Save the instance pointer for the HID device that was opened.
- //
- g_sUSBHMouse.psHIDInstance = USBHHIDOpen(eUSBHHIDClassMouse,
- USBHMouseCallback,
- (void *)&g_sUSBHMouse);
-
- //
- // Save the heap buffer and size.
- //
- g_sUSBHMouse.pui8Heap = pui8Buffer;
- g_sUSBHMouse.ui32HeapSize = ui32Size;
-
- return(&g_sUSBHMouse);
-}
-
-//*****************************************************************************
-//
-//! This function is used close an instance of a mouse.
-//!
-//! \param psMsInstance is the instance value for this mouse.
-//!
-//! This function is used to close an instance of the mouse that was opened
-//! with a call to USBHMouseOpen(). The \e psMsInstance value is the value
-//! that was returned when the application called USBHMouseOpen().
-//!
-//! \return Returns 0.
-//
-//*****************************************************************************
-uint32_t
-USBHMouseClose(tUSBHMouse *psMsInstance)
-{
- //
- // Reset the callback to null.
- //
- psMsInstance->pfnCallback = 0;
-
- //
- // Call the HID driver layer to close out this instance.
- //
- USBHHIDClose(psMsInstance->psHIDInstance);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to initialize a mouse interface after a mouse has
-//! been detected.
-//!
-//! \param psMsInstance is the instance value for this mouse.
-//!
-//! This function should be called after receiving a \b USB_EVENT_CONNECTED
-//! event in the callback function provided by USBHMouseOpen(), however it
-//! should only be called outside of the callback function. This will
-//! initialize the mouse interface and determine how it reports events to the
-//! USB host controller. The \e psMsInstance value is the value that was
-//! returned when the application called USBHMouseOpen(). This function only
-//! needs to be called once per connection event but it should be called every
-//! time a \b USB_EVENT_CONNECTED event occurs.
-//!
-//! \return Non-zero values should be assumed to indicate an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHMouseInit(tUSBHMouse *psMsInstance)
-{
- //
- // Set the initial rate to only update on mouse state changes.
- //
- USBHHIDSetIdle(psMsInstance->psHIDInstance, 0, 0);
-
- //
- // Read out the Report Descriptor from the mouse and parse it for
- // the format of the reports coming back from the mouse.
- //
- USBHHIDGetReportDescriptor(psMsInstance->psHIDInstance,
- psMsInstance->pui8Heap,
- psMsInstance->ui32HeapSize);
-
- //
- // Set the mouse to boot protocol.
- //
- USBHHIDSetProtocol(psMsInstance->psHIDInstance, 1);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-// This function handles updating the state of the mouse buttons and axis.
-//
-// \param psMsInstance is the pointer to an instance of the mouse data.
-//
-// This function will check for updates to buttons or X/Y movements and send
-// callbacks to the mouse callback function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-UpdateMouseState(tUSBHMouse *psMsInstance)
-{
- uint32_t ui32Button;
-
- if(psMsInstance->pui8Buffer[0] != psMsInstance->ui8Buttons)
- {
- for(ui32Button = 1; ui32Button <= 0x4; ui32Button <<= 1)
- {
- if(((psMsInstance->pui8Buffer[0] & ui32Button) != 0) &&
- ((psMsInstance->ui8Buttons & ui32Button) == 0))
- {
- //
- // Send the mouse button press notification to the application.
- //
- psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_PRESS,
- ui32Button, 0);
- }
- if(((psMsInstance->pui8Buffer[0] & ui32Button) == 0) &&
- ((psMsInstance->ui8Buttons & ui32Button) != 0))
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_REL,
- ui32Button, 0);
- }
- }
-
- //
- // Save the new state.
- //
- psMsInstance->ui8Buttons = psMsInstance->pui8Buffer[0];
- }
-
- if(psMsInstance->pui8Buffer[1] != 0)
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_X,
- (uint32_t)psMsInstance->pui8Buffer[1], 0);
- }
-
- if(psMsInstance->pui8Buffer[2] != 0)
- {
- //
- // Send the mouse button release notification to the
- // application.
- //
- psMsInstance->pfnCallback(0, USBH_EVENT_HID_MS_Y,
- (uint32_t)psMsInstance->pui8Buffer[2], 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function handles event callbacks from the USB HID driver layer.
-//!
-//! \param pvMouse is the pointer that was passed in to the USBHHIDOpen()
-//! call.
-//! \param ui32Event is the event that has been passed up from the HID driver.
-//! \param ui32MsgParam has meaning related to the \e ui32Event that occurred.
-//! \param pvMsgData has meaning related to the \e ui32Event that occurred.
-//!
-//! This function will receive all event updates from the HID driver layer.
-//! The mouse driver itself will mostly be concerned with report callbacks
-//! from the HID driver layer and parsing them into keystrokes for the
-//! application that has registered for callbacks with the USBHMouseOpen()
-//! call.
-//!
-//! \return Non-zero values should be assumed to indicate an error condition.
-//
-//*****************************************************************************
-uint32_t
-USBHMouseCallback(void *pvMouse, uint32_t ui32Event,
- uint32_t ui32MsgParam, void *pvMsgData)
-{
- tUSBHMouse *psMsInstance;
-
- //
- // Recover the pointer to the instance data.
- //
- psMsInstance = (tUSBHMouse *)pvMouse;
-
- switch(ui32Event)
- {
- //
- // New mouse has been connected so notify the application.
- //
- case USB_EVENT_CONNECTED:
- {
- //
- // Remember that a mouse is present.
- //
- psMsInstance->ui32HIDFlags |= USBHMS_DEVICE_PRESENT;
-
- //
- // Notify the application that a new mouse was connected.
- //
- psMsInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
-
- break;
- }
- case USB_EVENT_DISCONNECTED:
- {
- //
- // No mouse is present.
- //
- psMsInstance->ui32HIDFlags &= ~USBHMS_DEVICE_PRESENT;
-
- //
- // Notify the application that the mouse was disconnected.
- //
- psMsInstance->pfnCallback(0, ui32Event, ui32MsgParam, pvMsgData);
-
- break;
- }
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // New mouse report structure was received.
- //
- USBHHIDGetReport(psMsInstance->psHIDInstance, 0,
- psMsInstance->pui8Buffer, USBHMS_REPORT_SIZE);
-
- //
- // Update the current state of the mouse and notify the application
- // of any changes.
- //
- UpdateMouseState(psMsInstance);
-
- break;
- }
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.h
deleted file mode 100644
index 084ec0f61..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhidmouse.h
+++ /dev/null
@@ -1,79 +0,0 @@
-//*****************************************************************************
-//
-// usbhhidmouse.h - This file holds the application interfaces for USB
-// mouse devices.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHHIDMOUSE_H__
-#define __USBHHIDMOUSE_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_device
-//! @{
-//
-//*****************************************************************************
-
-typedef struct tUSBHMouse tUSBHMouse;
-
-//*****************************************************************************
-//
-// The prototype for the host USB mouse driver callback function.
-//
-//*****************************************************************************
-typedef void (*tUSBHIDMouseCallback)(tUSBHMouse *psMsInstance,
- uint32_t ui32Event,
- uint32_t ui32MsgParam,
- void *pvMsgData);
-
-extern tUSBHMouse * USBHMouseOpen(tUSBHIDMouseCallback pfnCallback,
- uint8_t *pui8Buffer, uint32_t ui32Size);
-extern uint32_t USBHMouseClose(tUSBHMouse *psMsInstance);
-extern uint32_t USBHMouseInit(tUSBHMouse *psMsInstance);
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.c
deleted file mode 100644
index 33e9e6f63..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.c
+++ /dev/null
@@ -1,1401 +0,0 @@
-//*****************************************************************************
-//
-// usbhhub.c - This file contains the host HID driver.
-//
-// Copyright (c) 2011-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "inc/hw_ints.h"
-#include "inc/hw_sysctl.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/rtos_bindings.h"
-#include "usblib/usblib.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/host/usbhhub.h"
-#ifdef INCLUDE_DEBUG_OUTPUT
-#include "utils/uartstdio.h"
-#define DEBUG_OUTPUT UARTprintf
-#else
-#define DEBUG_OUTPUT while(0)((int (*)(char *, ...))0)
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-//! The USB standard hub descriptor structure. Full documentation for the
-//! contents of this structure can be found in chapter 11.23.2.1 of the USB
-//! 2.0 specification.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The total number of bytes in the descriptor (including this field).
- //
- uint8_t bLength;
-
- //
- //! The descriptor type. For a hub descriptor, this will be USB_DTYPE_HUB
- //! (0x29 or 41 decimal).
- //
- uint8_t bDescType;
-
- //
- //! The number of downstream-facing ports that the hub supports.
- //
- uint8_t bNbrPorts;
-
- //
- //! Characteristics of the hub device including its power switching
- //! capabilities and over-current protection mode.
- //
- uint16_t wHubCharacteristics;
-
- //
- //! The time between the start of the power-on sequence for a port and
- //! the power to the port becoming stable. This is expressed in 2mS units.
- //
- uint8_t bPwrOn2PwrGood;
-
- //
- //! The maximum current requirement for the hub circuitry in mA.
- //
- uint8_t bHubContrCurrent;
-
- //
- //! The last two fields in the structure are bit masks indicating which
- //! downstream ports support removable devices and, following this, another
- //! obsolete field from USB1.0 related to port power control. Each field
- //! is byte aligned and contains a bit for each hub port. This structure
- //! definition is set up with enough storage to handle ROOT_HUB_MAX_PORTS
- //! ports but beware that the actual size of each field is dependent upon
- //! the bNbrPorts field above.
- //
- uint8_t PortInfo[((ROOT_HUB_MAX_PORTS + 7) / 8) * 2];
-}
-PACKED tUsbHubDescriptor;
-
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-// This structure holds all data specific to a single hub port.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The handle used by the HCD layer to identify this device.
- //
- uint32_t ui32DevHandle;
-
- //
- // The current state of the port.
- //
- volatile tHubPortState iState;
-
- //
- // General counter used in various states.
- //
- volatile uint32_t ui32Count;
-
- //
- // A flag used to indicate that the downstream device is a low speed
- // device.
- //
- bool bLowSpeed;
-
- //
- // This flag is set if the hub reports that a change is pending on this
- // port.
- //
- volatile bool bChanged;
-}
-tHubPort;
-
-//*****************************************************************************
-//
-// USB hub flags values for tHubInstance.ui32Flags.
-//
-//*****************************************************************************
-#define USBLIB_HUB_ACTIVE 0x00000001
-
-//*****************************************************************************
-//
-// This is the structure that holds all of the data for a given instance of
-// a Hub device.
-//
-//*****************************************************************************
-struct tHubInstance
-{
- //
- // Save the device instance.
- //
- tUSBHostDevice *psDevice;
-
- //
- // Used to save the callback function pointer.
- //
- tUSBHHubCallback pfnCallback;
-
- //
- // Callback data provided by caller.
- //
- uint32_t ui32CBData;
-
- //
- // Interrupt IN pipe.
- //
- uint32_t ui32IntInPipe;
-
- //
- // Hub characteristics as reported in the class-specific hub descriptor.
- //
- uint16_t ui16HubCharacteristics;
-
- //
- // The number of downstream-facing ports the hub supports.
- //
- uint8_t ui8NumPorts;
-
- //
- // The number of ports on the hub that we can actually talk to. This will
- // be the smaller of the number of ports on the hub and MAX_USB_DEVICES.
- //
- uint8_t ui8NumPortsInUse;
-
- //
- // The size of a status change packet sent by the hub. This is determined
- // from the number of ports supported by the hub.
- //
- uint8_t ui8ReportSize;
-
- //
- // Flags indicating whether the hub is connected.
- //
- uint32_t ui32Flags;
-
- //
- // Flag indicating that a device is currently in process of being
- // enumerated.
- //
- volatile bool bEnumerationBusy;
-
- //
- // This is valid if bEnumerationBusy is set and indicates the port
- // that is in the process of enumeration.
- //
- uint8_t ui8EnumIdx;
-
- //
- // The state of each of the ports we support on the hub.
- //
- tHubPort psPorts[MAX_USB_DEVICES];
-
- //
- // The interrupt number for this instance.
- //
- uint32_t ui32IntNum;
-};
-
-//*****************************************************************************
-//
-//! Forward references to the hub class driver functions.
-//
-//*****************************************************************************
-static void *HubDriverOpen(tUSBHostDevice *psDevice);
-static void HubDriverClose(void *pvHubDevice);
-
-//*****************************************************************************
-//
-//! This constant global structure defines the Hub Class Driver that is
-//! provided with the USB library.
-//
-//*****************************************************************************
-const tUSBHostClassDriver g_sUSBHubClassDriver =
-{
- USB_CLASS_HUB,
- HubDriverOpen,
- HubDriverClose,
- 0
-};
-
-//*****************************************************************************
-//
-// The instance data storage for attached hub.
-//
-//*****************************************************************************
-static tHubInstance g_sRootHub;
-
-//*****************************************************************************
-//
-// Hub and port state change flags as reported via the hub's IN endpoint.
-//
-//*****************************************************************************
-static volatile uint32_t g_ui32ChangeFlags;
-
-//
-// Note: The following assumes ROOT_HUB_MAX_PORTS is less than 32!
-//
-static uint32_t g_ui32HubChanges;
-
-//*****************************************************************************
-//
-// This function is called to send a request to the hub to set a feature on
-// a given port.
-//
-// \param psHubInstance is the hub device instance.
-// \param ui8Port is the port number for this request.
-// \param ui16Feature is one of the HUB_FEATURE_PORT_* values.
-//
-// This function will send the set feature request to the hub indicated by the
-// \e psHubInstance parameter. The \e ui8Port value indicates which port
-// number to send this request to and can range from 0 to the number of valid
-// ports on the given hub. A \e ui8Port value of 0 is an access to the hub
-// itself and not one of the hub ports. The \e ui16Feature is the feature
-// request toset on the given port. For example, a \e ui16Feature value of
-// \e HUB_FEATURE_PORT_RESET and \e ui8Port value of 1 will cause reset
-// signaling to hub port 1.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-HubSetPortFeature(tHubInstance *psHubInstance, uint8_t ui8Port,
- uint16_t ui16Feature)
-{
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- //
- // Retrieve the hub instance and device pointer.
- //
- psDevice = psHubInstance->psDevice;
-
- //
- // This is a standard OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_OTHER;
-
- //
- // Set the field to clear the requested port feature.
- //
- sSetupPacket.bRequest = USBREQ_SET_FEATURE;
- sSetupPacket.wValue = ui16Feature;
- sSetupPacket.wIndex = ui8Port;
- sSetupPacket.wLength = 0;
-
- //
- // Send the request.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psDevice, 0, 0,
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
-}
-
-//*****************************************************************************
-//
-// This function is called to send a request to the hub to clear a feature on
-// a given port.
-//
-// \param psHubInstance is the hub device instance.
-// \param ui8Port is the port number for this request.
-// \param ui16Feature is one of the HUB_FEATURE_PORT_* values.
-//
-// This function will send the clear feature request to the hub indicated by
-// the \e psHubInstance parameter. The \e ui8Port value indicates which port
-// number to send this request to and can range from 0 to the number of valid
-// ports on the given hub. A \e ui8Port value of 0 is an access to the hub
-// itself and not one of the hub ports. The \e ui16Feature is the feature
-// request to clear on the given port. For example, a \e ui16Feature value of
-// \e HUB_FEATURE_C_PORT_RESET and \e ui8Port value of 1 will clear the reset
-// complete signaling on hub port 1. Values like the reset feature will
-// remain set until actively cleared by this function.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-HubClearPortFeature(tHubInstance *psHubInstance, uint8_t ui8Port,
- uint16_t ui16Feature)
-{
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- //
- // Retrieve the hub instance and device pointer.
- //
- psDevice = psHubInstance->psDevice;
-
- //
- // This is a standard OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_OUT | USB_RTYPE_CLASS |
- USB_RTYPE_OTHER;
-
- //
- // Set the field to clear the requested port feature.
- //
- sSetupPacket.bRequest = USBREQ_CLEAR_FEATURE;
- sSetupPacket.wValue = ui16Feature;
- sSetupPacket.wIndex = ui8Port;
- sSetupPacket.wLength = 0;
-
- //
- // Send the request.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psDevice, 0, 0,
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
-}
-
-//*****************************************************************************
-//
-// This function is used to retrieve the current status of a port on the
-// hub.
-//
-// \param psHubInstance is the hub device instance.
-// \param ui8Port is the port number for this request.
-// \param pui16PortStatus is a pointer to the memory to store the current
-// status of the port.
-// \param pui16PortChange is a pointer to the memory to store the current
-// change status of the ports.
-//
-// This function is used to retrieve the current overall status and change
-// status for the port given in the \e ui8Port parameter. The \e ui8Port value
-// indicates which port number to send this request to and can range from 0 to
-// the number of valid ports on the given hub. A \e ui8Port value of 0 is an
-// access to the hub itself and not one of the hub ports.
-//
-// \return None.
-//
-//*****************************************************************************
-static bool
-HubGetPortStatus(tHubInstance *psHubInstance, uint8_t ui8Port,
- uint16_t *pui16PortStatus, uint16_t *pui16PortChange)
-{
- uint32_t ui32Data, ui32Read;
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- //
- // Retrieve the device pointer.
- //
- psDevice = psHubInstance->psDevice;
-
- //
- // This is a standard OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_IN | USB_RTYPE_CLASS |
- USB_RTYPE_OTHER;
-
- //
- // Set the fields to get the hub status.
- //
- sSetupPacket.bRequest = USBREQ_GET_STATUS;
- sSetupPacket.wValue = 0;
- sSetupPacket.wIndex = (uint16_t)ui8Port;
- sSetupPacket.wLength = 4;
-
- //
- // Send the request.
- //
- ui32Read = USBHCDControlTransfer(0, &sSetupPacket, psDevice,
- (uint8_t *)&ui32Data, 4,
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- //
- // Check that we received the correct number of bytes.
- //
- if(ui32Read != 4)
- {
- return(false);
- }
- else
- {
- //
- // We got 4 bytes from the device. Now translate these into the 2
- // 16-bit values we pass back to the caller.
- //
- *pui16PortStatus = (uint16_t)(ui32Data & 0xFFFF);
- *pui16PortChange = (uint16_t)(ui32Data >> 16);
-
- DEBUG_OUTPUT("Port %d, status 0x%04x, change 0x%04x\n", ui8Port,
- *pui16PortStatus, *pui16PortChange);
- }
-
- //
- // All is well.
- //
- return(true);
-}
-
-//*****************************************************************************
-//
-// This function handles callbacks for the interrupt IN endpoint for the hub
-// device.
-//
-//*****************************************************************************
-static void
-HubIntINCallback(uint32_t ui32Pipe, uint32_t ui32Event)
-{
- switch (ui32Event)
- {
- //
- // Handles a request to schedule a new request on the interrupt IN
- // pipe.
- //
- case USB_EVENT_SCHEDULER:
- {
- //
- // Set things up to read the next change indication from the hub.
- //
- USBHCDPipeSchedule(ui32Pipe, (uint8_t *)&g_ui32HubChanges,
- (uint32_t)g_sRootHub.ui8ReportSize);
- break;
- }
-
- //
- // Called when new data is available on the interrupt IN pipe.
- //
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // For data transfers on INT IN endpoints, we need to acknowledge
- // the data from this callback.
- //
- USBHCDPipeDataAck(ui32Pipe);
-
- //
- // Update our global "ports needing service" flags with the latest
- // information we have just received.
- //
- g_ui32ChangeFlags |= g_ui32HubChanges;
-
- //
- // Send the report data to the USB host hub device class driver if
- // we have been given a callback function.
- //
- if(g_sRootHub.pfnCallback)
- {
- g_sRootHub.pfnCallback((void *)g_sRootHub.ui32CBData,
- USB_EVENT_RX_AVAILABLE,
- ui32Pipe, &g_ui32HubChanges);
- }
-
- break;
- }
- case USB_EVENT_ERROR:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// Query the class-specific hub descriptor.
-//
-//*****************************************************************************
-static bool
-GetHubDescriptor(tUsbHubDescriptor *psDesc)
-{
- uint32_t ui32Read;
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- //
- // Retrieve the device pointer.
- //
- psDevice = g_sRootHub.psDevice;
-
- //
- // This is a standard OUT request.
- //
- sSetupPacket.bmRequestType = USB_RTYPE_DIR_IN | USB_RTYPE_CLASS |
- USB_RTYPE_DEVICE;
-
- //
- // Set the fields to get the hub descriptor. Initially, we request only
- // the first 4 bytes of the descriptor. This will give us the size which
- // we use to determine how many bytes to read to get the full descriptor.
- // This is necessary since we don't know how many ports the hub can support
- // and we only support up to MAX_USB_DEVICES.
- //
- sSetupPacket.bRequest = USBREQ_GET_DESCRIPTOR;
- sSetupPacket.wValue = (USB_DTYPE_HUB << 8);
- sSetupPacket.wIndex = 0;
- sSetupPacket.wLength = sizeof(tUsbHubDescriptor);
-
- //
- // Send the request.
- //
- ui32Read = USBHCDControlTransfer(0, &sSetupPacket, psDevice,
- (void *)psDesc, sizeof(tUsbHubDescriptor),
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- //
- // Make sure we got at least some data.
- //
- if(ui32Read == 0)
- {
- return(false);
- }
-
- //
- // All is well.
- //
- return(true);
-}
-
-//*****************************************************************************
-//
-// Open an instance of the hub driver. This is called when the USB host
-// has enumerated a new hub device.
-//
-//*****************************************************************************
-static void *
-HubDriverOpen(tUSBHostDevice *psDevice)
-{
- tEndpointDescriptor *psEndpointDescriptor;
- tInterfaceDescriptor *psInterface;
- tUsbHubDescriptor sHubDesc;
- bool bRetcode;
- uint32_t ui32Loop;
-
- //
- // If we are already talking to a hub, fail the call. We only support
- // a single hub.
- //
- if(g_sRootHub.ui32Flags & USBLIB_HUB_ACTIVE)
- {
- return(0);
- }
-
- //
- // Get pointers to the device descriptors we need to look at.
- //
- psInterface = USBDescGetInterface(psDevice->psConfigDescriptor, 0, 0);
- psEndpointDescriptor = USBDescGetInterfaceEndpoint(psInterface, 0,
- psDevice->ui32ConfigDescriptorSize);
-
- //
- // If there are no endpoints, something is wrong since a hub must have
- // a single INT endpoint for signaling.
- //
- if(psEndpointDescriptor == 0)
- {
- return 0;
- }
-
- //
- // Make sure we really are talking to a hub.
- //
- if((psInterface->bInterfaceClass != USB_CLASS_HUB) ||
- (psInterface->bInterfaceSubClass != 0))
- {
- //
- // Something is wrong - this isn't a hub or, if it is, we don't
- // understand the protocol it is using.
- //
- return(0);
- }
-
- //
- // Remember the device information for later.
- //
- g_sRootHub.psDevice = psDevice;
-
- //
- // A hub must support an interrupt endpoint so check this.
- //
- if((psEndpointDescriptor->bmAttributes & USB_EP_ATTR_TYPE_M) ==
- USB_EP_ATTR_INT)
- {
- //
- // The endpoint is the correct type. Is it an IN endpoint?
- //
- if(psEndpointDescriptor->bEndpointAddress & USB_EP_DESC_IN)
- {
- //
- // Yes - all is well with the hub endpoint so allocate a pipe to
- // handle traffic from the hub.
- //
- g_sRootHub.ui32IntInPipe = USBHCDPipeAlloc(0, USBHCD_PIPE_INTR_IN,
- psDevice,
- HubIntINCallback);
- USBHCDPipeConfig(g_sRootHub.ui32IntInPipe,
- psEndpointDescriptor->wMaxPacketSize,
- psEndpointDescriptor->bInterval,
- psEndpointDescriptor->bEndpointAddress &
- USB_EP_DESC_NUM_M);
- }
- }
-
- //
- // Did we allocate the endpoint successfully?
- //
- if(!g_sRootHub.ui32IntInPipe)
- {
- //
- // No - return an error.
- //
- return 0;
- }
-
- //
- // Assuming we have a callback, call it to tell the owner that a hub is
- // now connected.
- //
- if(g_sRootHub.pfnCallback != 0)
- {
- g_sRootHub.pfnCallback((void *)g_sRootHub.ui32CBData,
- USB_EVENT_CONNECTED, (uint32_t)&g_sRootHub, 0);
- }
-
- //
- // Get the hub descriptor and store information we'll need for later.
- //
- bRetcode = GetHubDescriptor(&sHubDesc);
- if(bRetcode)
- {
-
- //
- // We read the descriptor successfully so extract the parts we need.
- //
- g_sRootHub.ui8NumPorts = sHubDesc.bNbrPorts;
- g_sRootHub.ui16HubCharacteristics = sHubDesc.wHubCharacteristics;
- g_sRootHub.ui8NumPortsInUse =
- (sHubDesc.bNbrPorts > MAX_USB_DEVICES) ? MAX_USB_DEVICES :
- sHubDesc.bNbrPorts;
-
- //
- // The size of the status change report that the hub sends is dependent
- // upon the number of ports that the hub supports. Calculate this by
- // adding 1 to the number of ports (bit 0 of the report is the hub
- // status, higher bits are one per port) then dividing by 8 (bits per
- // byte) and rounding up.
- //
- g_sRootHub.ui8ReportSize = ((sHubDesc.bNbrPorts + 1) + 7) / 8;
-
- //
- // Enable power to all ports on the hub.
- //
- for(ui32Loop = 1; ui32Loop <= sHubDesc.bNbrPorts; ui32Loop++)
- {
- //
- // Turn on power to this port.
- //
- HubSetPortFeature(&g_sRootHub, ui32Loop,
- HUB_FEATURE_PORT_POWER);
- }
-
- //
- // Clear out our port state structures.
- //
- for(ui32Loop = 0; ui32Loop < MAX_USB_DEVICES; ui32Loop++)
- {
- g_sRootHub.psPorts[ui32Loop].bChanged = false;
- g_sRootHub.psPorts[ui32Loop].iState = ePortIdle;
- }
- }
- else
- {
- //
- // Oops - we can't read the hub descriptor! Tidy up and return
- // an error.
- //
- USBHCDPipeFree(g_sRootHub.ui32IntInPipe);
- g_sRootHub.pfnCallback = 0;
- g_sRootHub.ui32Flags &= ~USBLIB_HUB_ACTIVE;
- return(0);
- }
-
- //
- // If we get here, all is well so remember that the hub is connected and
- // active.
- //
- g_sRootHub.ui32Flags |= USBLIB_HUB_ACTIVE;
-
- //
- // Return our instance data pointer to the caller to use as a handle.
- //
- return((void *)&g_sRootHub);
-}
-
-//*****************************************************************************
-//
-// Close an instance of the hub driver.
-//
-//*****************************************************************************
-static void
-HubDriverClose(void *pvHubDevice)
-{
- uint32_t ui32Loop;
-
- //
- // No device so just exit.
- //
- if(g_sRootHub.psDevice == 0)
- {
- return;
- }
-
- //
- // Disconnect any devices that are currently connected to the hub.
- //
- for(ui32Loop = 0; ui32Loop < MAX_USB_DEVICES; ui32Loop++)
- {
- //
- // Does this port have a device connected to it that we have previously
- // reported to the host control layer?h
- //
- if((g_sRootHub.psPorts[ui32Loop].iState == ePortActive) ||
- (g_sRootHub.psPorts[ui32Loop].iState == ePortResetWait) ||
- (g_sRootHub.psPorts[ui32Loop].iState == ePortEnumerated) ||
- (g_sRootHub.psPorts[ui32Loop].iState == ePortError))
- {
- //
- // Yes - tell the host controller to disconnect the device.
- //
- USBHCDHubDeviceDisconnected(0,
- g_sRootHub.psPorts[ui32Loop].ui32DevHandle);
-
- }
-
- //
- // Make sure that the state returns to idle.
- //
- g_sRootHub.psPorts[ui32Loop].iState = ePortIdle;
-
- }
-
- //
- // Reset the device pointer.
- //
- g_sRootHub.psDevice = 0;
-
- //
- // Mark the hub as absent.
- //
- g_sRootHub.ui32Flags &= ~USBLIB_HUB_ACTIVE;
-
- //
- // Note that we are not in the middle of enumerating anything.
- //
- g_sRootHub.bEnumerationBusy = false;
-
- //
- // Free the Interrupt IN pipe.
- //
- if(g_sRootHub.ui32IntInPipe != 0)
- {
- USBHCDPipeFree(g_sRootHub.ui32IntInPipe);
- }
-
- //
- // If the callback exists, call it with a DISCONNECTED event.
- //
- if(g_sRootHub.pfnCallback != 0)
- {
- g_sRootHub.pfnCallback((void *)g_sRootHub.ui32CBData,
- USB_EVENT_DISCONNECTED, (uint32_t)&g_sRootHub,
- 0);
- }
-}
-
-//*****************************************************************************
-//
-// Perform any processing required as a result of a change in the reset
-// signaling for a given port.
-//
-//*****************************************************************************
-static void
-HubDriverReset(uint8_t ui8Port, bool bResetActive)
-{
- //
- // Did the reset sequence end or begin?
- //
- if(!bResetActive)
- {
- //
- // The reset ended. Now wait for at least 10ms before signaling
- // USB enumeration code that a new device is waiting to be enumerated.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortResetWait;
-
- //
- // Set the wait to 10ms (10 frames) from now.
- //
- g_sRootHub.psPorts[ui8Port].ui32Count = 10;
- }
- else
- {
- //
- // Was this device previously active?
- //
- if(g_sRootHub.psPorts[ui8Port].iState == ePortActive)
- {
- USBHCDHubDeviceDisconnected(0,
- g_sRootHub.psPorts[ui8Port].ui32DevHandle);
- }
-
- //
- // The reset is active so mark our port as in reset.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortResetActive;
- }
-}
-
-//*****************************************************************************
-//
-// Start the process of enumerating a new device by issuing a reset to the
-// appropriate downstream port.
-//
-//*****************************************************************************
-static void
-HubDriverDeviceReset(uint8_t ui8Port)
-{
- DEBUG_OUTPUT("Starting enumeration for port %d\n", ui8Port);
-
- //
- // Record the fact that we are in the process of enumerating a device.
- //
- g_sRootHub.bEnumerationBusy = true;
-
- //
- // Save the port that is being enumerated.
- //
- g_sRootHub.ui8EnumIdx = ui8Port;
-
- //
- // Mark the port as being reset.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortResetActive;
-
- //
- // Initiate a reset on the relevant port to start the enumeration process.
- //
- HubSetPortFeature(&g_sRootHub, ui8Port, HUB_FEATURE_PORT_RESET);
-}
-
-//*****************************************************************************
-//
-// A new device has been connected to the hub. Allocate resources to manage
-// it and pass details back to the main USB host enumeration code to have the
-// device enumerated.
-//
-//*****************************************************************************
-static void
-HubDriverDeviceConnect(uint8_t ui8Port, bool bLowSpeed)
-{
- DEBUG_OUTPUT("HubDriverDeviceConnect\n");
-
- //
- // We've allocated a port table entry so fill it in then initiate a reset
- // on the device.
- //
- g_sRootHub.psPorts[ui8Port].bChanged = false;
- g_sRootHub.psPorts[ui8Port].bLowSpeed = bLowSpeed;
-
- //
- // Mark the port as having a device present but not enumerated.
- //
- DEBUG_OUTPUT("Deferring enumeration for port %d\n", ui8Port);
- g_sRootHub.psPorts[ui8Port].iState = ePortConnected;
-
- //
- // Wait 100ms to reset the device.
- //
- g_sRootHub.psPorts[ui8Port].ui32Count = 100;
-}
-
-//*****************************************************************************
-//
-// An existing device has been removed from the hub. Tidy up and let the main
-// USB host code know so that it can free device resources.
-//
-//*****************************************************************************
-static void
-HubDriverDeviceDisconnect(uint8_t ui8Port)
-{
- //
- // This is a device we are currently managing. Have we already informed
- // the host controller that it is present?
- //
- if((g_sRootHub.psPorts[ui8Port].iState == ePortActive) ||
- (g_sRootHub.psPorts[ui8Port].iState == ePortResetWait) ||
- (g_sRootHub.psPorts[ui8Port].iState == ePortEnumerated) ||
- (g_sRootHub.psPorts[ui8Port].iState == ePortError))
- {
- //
- // Yes - tell the host controller that the device is not longer
- // connected.
- //
- USBHCDHubDeviceDisconnected(0,
- g_sRootHub.psPorts[ui8Port].ui32DevHandle);
- }
-
- //
- // If the device was being enumerated, make sure we clear the flag
- // indicating that an enumeration is still ongoing.
- //
- if((g_sRootHub.psPorts[ui8Port].iState == ePortResetActive) ||
- (g_sRootHub.psPorts[ui8Port].iState == ePortResetWait) ||
- (g_sRootHub.psPorts[ui8Port].iState == ePortActive))
- {
- g_sRootHub.bEnumerationBusy = false;
- }
-
- //
- // Free up the port state structure.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortIdle;
-}
-
-//*****************************************************************************
-//
-// This function is called periodically by USBHCDMain(). We use it to handle
-// the hub port state machine.
-//
-//*****************************************************************************
-void
-USBHHubMain(void)
-{
- uint16_t ui16Status, ui16Changed;
- uint_fast8_t ui8Port;
- bool bRetcode;
-
- //
- // If the hub is not present, just return.
- //
- if((g_sRootHub.ui32Flags & USBLIB_HUB_ACTIVE) == 0)
- {
- return;
- }
-
- //
- // Initialize the status variables.
- //
- ui16Status = 0;
- ui16Changed = 0;
-
- //
- // The hub is active and something changed. Check to see which port changed
- // state and handle as necessary.
- //
- for(ui8Port = 0; ui8Port <= g_sRootHub.ui8NumPortsInUse; ui8Port++)
- {
- //
- // Decrement any wait counter if there is one present.
- //
- if(g_sRootHub.psPorts[ui8Port].ui32Count != 0)
- {
- g_sRootHub.psPorts[ui8Port].ui32Count--;
- }
-
- //
- // Is this port waiting to be enumerated and is the last device
- // enumeration finished?
- //
- if((g_sRootHub.psPorts[ui8Port].iState == ePortConnected) &&
- (!g_sRootHub.bEnumerationBusy) &&
- (g_sRootHub.psPorts[ui8Port].ui32Count == 0))
- {
- //
- // Yes - start the enumeration processing for this device.
- //
- HubDriverDeviceReset(ui8Port);
- }
-
- //
- // If the state is ePortResetWait then the hub is waiting before
- // accessing device as the USB 2.0 specification requires.
- //
- if((g_sRootHub.psPorts[ui8Port].iState == ePortResetWait) &&
- (g_sRootHub.psPorts[ui8Port].ui32Count == 0))
- {
- //
- // Start the enumeration process if the timeout has passed and
- // the hub is waiting to start enumerating the device.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortActive;
-
- //
- // Call the main host controller layer to have it enumerate the
- // newly connected device.
- //
- g_sRootHub.psPorts[ui8Port].ui32DevHandle =
- USBHCDHubDeviceConnected(0, 1, ui8Port,
- g_sRootHub.psPorts[ui8Port].bLowSpeed);
- }
-
- //
- // If an enumeration is in progress and the loop is not on the port
- // being enumerated then skip the port.
- //
- if(g_sRootHub.bEnumerationBusy &&
- (g_sRootHub.ui8EnumIdx != ui8Port))
- {
- continue;
- }
-
- //
- // Did something change for this particular port?
- //
- if(g_ui32ChangeFlags & (1 << ui8Port))
- {
- //
- // Yes - query the port status.
- //
- bRetcode = HubGetPortStatus(&g_sRootHub, ui8Port,
- &ui16Status, &ui16Changed);
-
- //
- // Clear this change with the USB interrupt temporarily disabled to
- // ensure that we do not clear a flag that the interrupt routine
- // has just set.
- //
- OS_INT_DISABLE(g_sRootHub.ui32IntNum);
- g_ui32ChangeFlags &= ~(1 << ui8Port);
- OS_INT_ENABLE(g_sRootHub.ui32IntNum);
-
- //
- // If there was an error, go on and look at the next bit.
- //
- if(!bRetcode)
- {
- continue;
- }
-
- //
- // Now consider what changed and handle it as necessary.
- //
-
- //
- // Was a device connected to or disconnected from the port?
- //
- if(ui16Changed & HUB_PORT_CHANGE_DEVICE_PRESENT)
- {
- DEBUG_OUTPUT("Connection change on port %d\n", ui8Port);
-
- //
- // Clear the condition.
- //
- HubClearPortFeature(&g_sRootHub, ui8Port,
- HUB_FEATURE_C_PORT_CONNECTION);
-
- //
- // Was a device connected or disconnected?
- //
- if(ui16Status & HUB_PORT_STATUS_DEVICE_PRESENT)
- {
- DEBUG_OUTPUT("Connected\n");
-
- //
- // A device was connected.
- //
- HubDriverDeviceConnect(ui8Port,
- ((ui16Status & HUB_PORT_STATUS_LOW_SPEED) ?
- true : false));
- }
- else
- {
- DEBUG_OUTPUT("Disconnected\n");
-
- //
- // A device was disconnected.
- //
- HubDriverDeviceDisconnect(ui8Port);
- }
- }
-
- //
- // Did a reset on the port complete?
- //
- if(ui16Changed & HUB_PORT_CHANGE_RESET)
- {
- //
- // Clear the condition.
- //
- HubClearPortFeature(&g_sRootHub, ui8Port,
- HUB_FEATURE_C_PORT_RESET);
-
- //
- // Yes - query the port status.
- //
- bRetcode = HubGetPortStatus(&g_sRootHub, ui8Port,
- &ui16Status, &ui16Changed);
-
- DEBUG_OUTPUT("Reset %s for port %d\n",
- ((ui16Status & HUB_PORT_STATUS_RESET) ? "asserted" :
- "deasserted"), ui8Port);
-
- //
- // Handle the reset case.
- //
- HubDriverReset(ui8Port, (ui16Status & HUB_PORT_STATUS_RESET) ?
- true : false);
- }
-
- //
- // Did an over-current reset on the port complete?
- //
- if(ui16Changed & HUB_PORT_CHANGE_OVER_CURRENT)
- {
- DEBUG_OUTPUT("Port %d over current.\n", ui8Port);
-
- //
- // Currently we ignore this and just clear the condition.
- //
- HubClearPortFeature(&g_sRootHub, ui8Port,
- HUB_FEATURE_C_PORT_OVER_CURRENT);
- }
-
- //
- // Has the port been enabled or disabled?
- //
- if(ui16Changed & HUB_PORT_CHANGE_ENABLED)
- {
- DEBUG_OUTPUT("Enable change for port %d.\n", ui8Port);
-
- //
- // Currently we ignore this and just clear the condition.
- //
- HubClearPortFeature(&g_sRootHub, ui8Port,
- HUB_FEATURE_C_PORT_ENABLE);
- }
-
- //
- // Has the port been suspended or resumed?
- //
- if(ui16Changed & HUB_PORT_CHANGE_SUSPENDED)
- {
- DEBUG_OUTPUT("Suspend change for port %d.\n", ui8Port);
-
- //
- // Currently we ignore this and just clear the condition.
- //
- HubClearPortFeature(&g_sRootHub, ui8Port,
- HUB_FEATURE_C_PORT_SUSPEND);
- }
- }
- }
-}
-
-//*****************************************************************************
-//
-//! Informs the hub class driver that a downstream device has been enumerated.
-//!
-//! \param ui8Hub is the address of the hub to which the downstream device
-//! is attached.
-//! \param ui8Port is the port on the hub to which the downstream device is
-//! attached.
-//!
-//! This function is called by the host controller driver to inform the hub
-//! class driver that a downstream device has been enumerated successfully.
-//! The hub driver then moves on and continues enumeration of any other newly
-//! connected devices.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHHubEnumerationComplete(uint8_t ui8Hub, uint8_t ui8Port)
-{
- DEBUG_OUTPUT("Enumeration complete for hub %d, port %d\n", ui8Hub, ui8Port);
-
- //
- // Record the fact that the device is up and running.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortEnumerated;
-
- //
- // Clear the flag we use to defer further enumerations. This will cause
- // the next connected device (if any) to start enumeration on the next
- // call to USBHHubMain().
- //
- g_sRootHub.bEnumerationBusy = false;
-}
-
-//*****************************************************************************
-//
-//! Informs the hub class driver that a downstream device failed to enumerate.
-//!
-//! \param ui8Hub is the address of the hub to which the downstream device
-//! is attached.
-//! \param ui8Port is the port on the hub to which the downstream device is
-//! attached.
-//!
-//! This function is called by the host controller driver to inform the hub
-//! class driver that an attempt to enumerate a downstream device has failed.
-//! The hub driver then cleans up and continues enumeration of any other newly
-//! connected devices.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHHubEnumerationError(uint8_t ui8Hub, uint8_t ui8Port)
-{
- DEBUG_OUTPUT("Enumeration error for hub %d, port %d\n", ui8Hub, ui8Port);
-
- //
- // Record the fact that the device is not working correctly.
- //
- g_sRootHub.psPorts[ui8Port].iState = ePortError;
-
- //
- // Clear the flag we use to defer further enumerations. This will cause
- // the next connected device (if any) to start enumeration on the next
- // call to USBHHubMain().
- //
- g_sRootHub.bEnumerationBusy = false;
-}
-
-//*****************************************************************************
-//
-//! This function is used to enable the host hub class driver before any
-//! devices are present.
-//!
-//! \param pfnCallback is the driver call back for host hub events.
-//!
-//! This function is called to open an instance of a host hub device and
-//! provides a valid callback function for host hub events in the
-//! \e pfnCallback parameter. This function must be called before the USB
-//! host code can successfully enumerate a hub device or any devices attached
-//! to the hub. The \e pui8HubPool is memory provided to the hub class to
-//! manage the devices that are connected to the hub. The \e ui32PoolSize is
-//! the number of bytes and should be at least 32 bytes per device including
-//! the hub device itself. A simple formula for providing memory to the hub
-//! class is \b MAX_USB_DEVICES * 32 bytes of data to allow for proper
-//! enumeration of connected devices. The value for \b MAX_USB_DEVICES is
-//! defined in the usblib.h file and controls the number of devices
-//! supported by the USB library. The \e ui32NumHubs parameter
-//! defaults to one and only one buffer of size tHubInstance is required to
-//! be passed in the \e psHubInstance parameter.
-//!
-//! \note Changing the value of \b MAX_USB_DEVICES requires a rebuild of the
-//! USB library to have an effect on the library.
-//!
-//! \return This function returns the driver instance to use for the other
-//! host hub functions. If there is no instance available at the time of
-//! this call, this function returns zero.
-//
-//*****************************************************************************
-tHubInstance *
-USBHHubOpen(tUSBHHubCallback pfnCallback)
-{
- //
- // Only one hub is supported.
- //
- if(g_sRootHub.pfnCallback)
- {
- DEBUG_OUTPUT("USBHHubOpen failed - already connected.\n");
- return(0);
- }
-
- //
- // Save the instance data for this device.
- //
- g_sRootHub.pfnCallback = pfnCallback;
-
- DEBUG_OUTPUT("USBHHubOpen completed.\n");
-
- //
- // Return the device instance pointer.
- //
- return(&g_sRootHub);
-}
-
-//*****************************************************************************
-//
-//! This function is used to release a hub device instance.
-//!
-//! \param psHubInstance is the hub device instance that is to be released.
-//!
-//! This function is called when an instance of the hub device must be
-//! released. This function is typically made in preparation for shutdown or a
-//! switch to function as a USB device when in OTG mode. Following this call,
-//! the hub device is no longer available, but it can be opened again using a
-//! call to USBHHubOpen(). After calling USBHHubClose(), the host hub driver
-//! no longer provides any callbacks or accepts calls to other hub driver APIs.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHHubClose(tHubInstance *psHubInstance)
-{
- //
- // Forget the instance pointer and callback.
- //
- psHubInstance->psDevice = 0;
- psHubInstance->pfnCallback = 0;
-
- DEBUG_OUTPUT("USBHHubClose completed.\n");
-}
-
-//*****************************************************************************
-//
-// This function is used to initialize the Hub driver. This is an internal
-// function that should not be called by the application.
-//
-//*****************************************************************************
-void
-USBHHubInit(void)
-{
- //
- // Initialize Hub state.
- //
- g_ui32ChangeFlags = 0;
- g_ui32HubChanges = 0;
-
- if(g_sRootHub.psDevice != 0)
- {
- //
- // Save the USB interrupt number.
- //
- g_sRootHub.ui32IntNum = INT_USB0_BLIZZARD;
- }
-}
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.h
deleted file mode 100644
index ee14fc8d9..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhhub.h
+++ /dev/null
@@ -1,172 +0,0 @@
-//*****************************************************************************
-//
-// usbhhub.h - This hold the host driver for hid class.
-//
-// Copyright (c) 2011-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHHUB_H__
-#define __USBHHUB_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-typedef struct tHubInstance tHubInstance;
-
-extern const tUSBHostClassDriver g_sUSBHubClassDriver;
-
-//*****************************************************************************
-//
-// The USB standard allows for up to 127 downstream ports on a single hub.
-// This would require rather more memory than we would like to set aside so the
-// default configuration of the hub driver supports hubs with up to 7
-// downstream-facing ports. In practice, this should be more than enough
-// since this covers the vast majority of consumer hubs. Note that, by
-// default, we will only support 4 devices so you can't fully populate a 7 port
-// hub and have everything work.
-//
-// Feel free to change this but bad things will happen if you increase it above
-// 31 since we assume the reports will always fit inside a 4 byte buffer.
-//
-//*****************************************************************************
-#define ROOT_HUB_MAX_PORTS 7
-
-//*****************************************************************************
-//
-// Values used as the ui16Feature parameter to USBHHubClearHubFeature().
-//
-//*****************************************************************************
-#define HUB_FEATURE_C_HUB_LOCAL_POWER \
- 0
-#define HUB_FEATURE_C_HUB_OVER_CURRENT \
- 1
-
-//*****************************************************************************
-//
-// Values used as the ui16Feature parameter to USBHHubSetPortFeature() and
-// USBHHubClearPortFeature().
-//
-//*****************************************************************************
-#define HUB_FEATURE_PORT_CONNECTION \
- 0
-#define HUB_FEATURE_PORT_ENABLE 1
-#define HUB_FEATURE_PORT_SUSPEND \
- 2
-#define HUB_FEATURE_PORT_OVER_CURRENT \
- 3
-#define HUB_FEATURE_PORT_RESET 4
-#define HUB_FEATURE_PORT_POWER 8
-#define HUB_FEATURE_PORT_LOW_SPEED \
- 9
-#define HUB_FEATURE_C_PORT_CONNECTION \
- 16
-#define HUB_FEATURE_C_PORT_ENABLE \
- 17
-#define HUB_FEATURE_C_PORT_SUSPEND \
- 18
-#define HUB_FEATURE_C_PORT_OVER_CURRENT \
- 19
-#define HUB_FEATURE_C_PORT_RESET \
- 20
-#define HUB_FEATURE_PORT_TEST 21
-#define HUB_FEATURE_PORT_INDICATOR \
- 22
-
-//*****************************************************************************
-//
-// Values returned via the *pui16HubStatus and *pui16HubChange parameters
-// passed to USBHHubGetHubStatus(). These may be ORed together into the
-// returned status value.
-//
-//*****************************************************************************
-#define HUB_STATUS_PWR_LOST 1
-#define HUB_STATUS_OVER_CURRENT 2
-
-//*****************************************************************************
-//
-// Values returned via the *pui16PortStatus parameter passed to
-// USBHHubGetPortStatus(). These may be ORed together into the returned status
-// value.
-//
-//*****************************************************************************
-#define HUB_PORT_STATUS_DEVICE_PRESENT \
- 0x0001
-#define HUB_PORT_STATUS_ENABLED 0x0002
-#define HUB_PORT_STATUS_SUSPENDED \
- 0x0004
-#define HUB_PORT_STATUS_OVER_CURRENT \
- 0x0008
-#define HUB_PORT_STATUS_RESET 0x0010
-#define HUB_PORT_STATUS_POWERED 0x0100
-#define HUB_PORT_STATUS_LOW_SPEED \
- 0x0200
-#define HUB_PORT_STATUS_HIGH_SPEED \
- 0x0400
-#define HUB_PORT_STATUS_TEST_MODE \
- 0x0800
-#define HUB_PORT_STATUS_INDICATOR_CONTROL \
- 0x1000
-
-//*****************************************************************************
-//
-// Values returned via the *pui16PortChange parameter passed to
-// USBHHubGetPortStatus(). These may be ORed together into the returned status
-// value.
-//
-//*****************************************************************************
-#define HUB_PORT_CHANGE_DEVICE_PRESENT \
- 0x0001
-#define HUB_PORT_CHANGE_ENABLED 0x0002
-#define HUB_PORT_CHANGE_SUSPENDED \
- 0x0004
-#define HUB_PORT_CHANGE_OVER_CURRENT \
- 0x0008
-#define HUB_PORT_CHANGE_RESET 0x0010
-
-//*****************************************************************************
-//
-// The prototype for the USB Hub host driver callback function.
-//
-//*****************************************************************************
-typedef void (*tUSBHHubCallback)(tHubInstance *psHubInstance,
- uint32_t ui32Event, uint32_t ui32MsgParam,
- void *pvMsgData);
-
-//*****************************************************************************
-//
-// Public function prototypes for the HUB class driver.
-//
-//*****************************************************************************
-extern tHubInstance * USBHHubOpen(tUSBHHubCallback pfnCallback);
-extern void USBHHubClose(tHubInstance *psHubInstance);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHHUB_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.c
deleted file mode 100644
index ea534f129..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.c
+++ /dev/null
@@ -1,697 +0,0 @@
-//*****************************************************************************
-//
-// usbhmsc.c - USB MSC host driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/usbdrv.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/usbmsc.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/host/usbhmsc.h"
-#include "usblib/host/usbhscsi.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Forward declarations for the driver open and close calls.
-//
-//*****************************************************************************
-static void *USBHMSCOpen(tUSBHostDevice *psDevice);
-static void USBHMSCClose(void *pvInstance);
-
-//*****************************************************************************
-//
-// This is the structure for an instance of a USB MSC host driver.
-//
-//*****************************************************************************
-struct tUSBHMSCInstance
-{
- //
- // Save the device instance.
- //
- tUSBHostDevice *psDevice;
-
- //
- // Used to save the callback.
- //
- tUSBHMSCCallback pfnCallback;
-
- //
- // The Maximum LUNs
- //
- uint32_t ui32MaxLUN;
-
- //
- // The total number of blocks associated with this device.
- //
- uint32_t ui32NumBlocks;
-
- //
- // The size of the blocks associated with this device.
- //
- uint32_t ui32BlockSize;
-
- //
- // Bulk IN pipe.
- //
- uint32_t ui32BulkInPipe;
-
- //
- // Bulk OUT pipe.
- //
- uint32_t ui32BulkOutPipe;
-};
-
-//*****************************************************************************
-//
-// The array of USB MSC host drivers.
-//
-//*****************************************************************************
-static tUSBHMSCInstance g_sUSBHMSCDevice =
-{
- 0
-};
-
-//*****************************************************************************
-//
-//! This constant global structure defines the Mass Storage Class Driver that
-//! is provided with the USB library.
-//
-//*****************************************************************************
-const tUSBHostClassDriver g_sUSBHostMSCClassDriver =
-{
- USB_CLASS_MASS_STORAGE,
- USBHMSCOpen,
- USBHMSCClose,
- 0
-};
-
-//*****************************************************************************
-//
-//! This function is used to open an instance of the MSC driver.
-//!
-//! \param psDevice is a pointer to the device information structure.
-//!
-//! This function will attempt to open an instance of the MSC driver based on
-//! the information contained in the \e psDevice structure. This call can fail
-//! if there are not sufficient resources to open the device. The function
-//! returns a value that should be passed back into USBMSCClose() when the
-//! driver is no longer needed.
-//!
-//! \return The function will return a pointer to a MSC driver instance.
-//
-//*****************************************************************************
-static void *
-USBHMSCOpen(tUSBHostDevice *psDevice)
-{
- int32_t i32Idx;
- tEndpointDescriptor *psEndpointDescriptor;
- tInterfaceDescriptor *psInterface;
-
- //
- // Don't allow the device to be opened without closing first.
- //
- if(g_sUSBHMSCDevice.psDevice)
- {
- return(0);
- }
-
- //
- // Save the device pointer.
- //
- g_sUSBHMSCDevice.psDevice = psDevice;
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(psDevice->psConfigDescriptor, 0, 0);
-
- //
- // Loop through the endpoints of the device.
- //
- for(i32Idx = 0; i32Idx < 3; i32Idx++)
- {
- //
- // Get the first endpoint descriptor.
- //
- psEndpointDescriptor =
- USBDescGetInterfaceEndpoint(psInterface, i32Idx,
- psDevice->ui32ConfigDescriptorSize);
-
- //
- // If no more endpoints then break out.
- //
- if(psEndpointDescriptor == 0)
- {
- break;
- }
-
- //
- // See if this is a bulk endpoint.
- //
- if((psEndpointDescriptor->bmAttributes & USB_EP_ATTR_TYPE_M) ==
- USB_EP_ATTR_BULK)
- {
- //
- // See if this is bulk IN or bulk OUT.
- //
- if(psEndpointDescriptor->bEndpointAddress & USB_EP_DESC_IN)
- {
- //
- // Allocate the USB Pipe for this Bulk IN endpoint.
- //
- g_sUSBHMSCDevice.ui32BulkInPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_BULK_IN_DMA,
- psDevice,
- psEndpointDescriptor->wMaxPacketSize,
- 0);
- //
- // Configure the USB pipe as a Bulk IN endpoint.
- //
- USBHCDPipeConfig(g_sUSBHMSCDevice.ui32BulkInPipe,
- psEndpointDescriptor->wMaxPacketSize,
- 0,
- (psEndpointDescriptor->bEndpointAddress &
- USB_EP_DESC_NUM_M));
- }
- else
- {
- //
- // Allocate the USB Pipe for this Bulk OUT endpoint.
- //
- g_sUSBHMSCDevice.ui32BulkOutPipe =
- USBHCDPipeAllocSize(0, USBHCD_PIPE_BULK_OUT_DMA,
- psDevice,
- psEndpointDescriptor->wMaxPacketSize,
- 0);
- //
- // Configure the USB pipe as a Bulk OUT endpoint.
- //
- USBHCDPipeConfig(g_sUSBHMSCDevice.ui32BulkOutPipe,
- psEndpointDescriptor->wMaxPacketSize,
- 0,
- (psEndpointDescriptor->bEndpointAddress &
- USB_EP_DESC_NUM_M));
- }
- }
- }
-
- //
- // If the callback exists, call it with an Open event.
- //
- if(g_sUSBHMSCDevice.pfnCallback != 0)
- {
- g_sUSBHMSCDevice.pfnCallback(&g_sUSBHMSCDevice, MSC_EVENT_OPEN, 0);
- }
-
-
- g_sUSBHMSCDevice.ui32MaxLUN = 0xffffffff;
-
- //
- // Return the only instance of this device.
- //
- return(&g_sUSBHMSCDevice);
-}
-
-//*****************************************************************************
-//
-//! This function is used to release an instance of the MSC driver.
-//!
-//! \param pvInstance is an instance pointer that needs to be released.
-//!
-//! This function will free up any resources in use by the MSC driver instance
-//! that is passed in. The \e pvInstance pointer should be a valid value that
-//! was returned from a call to USBMSCOpen().
-//!
-//! \return None.
-//
-//*****************************************************************************
-static void
-USBHMSCClose(void *pvInstance)
-{
- //
- // Do nothing if there is not a driver open.
- //
- if(g_sUSBHMSCDevice.psDevice == 0)
- {
- return;
- }
-
- //
- // Reset the device pointer.
- //
- g_sUSBHMSCDevice.psDevice = 0;
-
- //
- // Free the Bulk IN pipe.
- //
- if(g_sUSBHMSCDevice.ui32BulkInPipe != 0)
- {
- USBHCDPipeFree(g_sUSBHMSCDevice.ui32BulkInPipe);
- }
-
- //
- // Free the Bulk OUT pipe.
- //
- if(g_sUSBHMSCDevice.ui32BulkOutPipe != 0)
- {
- USBHCDPipeFree(g_sUSBHMSCDevice.ui32BulkOutPipe);
- }
-
- //
- // If the callback exists then call it.
- //
- if(g_sUSBHMSCDevice.pfnCallback != 0)
- {
- g_sUSBHMSCDevice.pfnCallback(&g_sUSBHMSCDevice, MSC_EVENT_CLOSE, 0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function retrieves the maximum number of the logical units on a
-//! mass storage device.
-//!
-//! \param psDevice is the device instance pointer for this request.
-//! \param ui32Interface is the interface number on the device specified by the
-//! \e ui32Address parameter.
-//! \param pui8MaxLUN is the byte value returned from the device for the
-//! device's maximum logical unit.
-//!
-//! The device will return one byte of data that contains the maximum LUN
-//! supported by the device. For example, if the device supports four LUNs
-//! then the LUNs would be numbered from 0 to 3 and the return value would be
-//! 3. If no LUN is associated with the device, the value returned shall be 0.
-//!
-//! \return None.
-//
-//*****************************************************************************
-static void
-USBHMSCGetMaxLUN(tUSBHostDevice *psDevice, uint32_t ui32Interface,
- uint8_t *pui8MaxLUN)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a Class specific interface IN request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_IN | USB_RTYPE_CLASS | USB_RTYPE_INTERFACE;
-
- //
- // Request a the Max LUN for this interface.
- //
- sSetupPacket.bRequest = USBREQ_GET_MAX_LUN;
- sSetupPacket.wValue = 0;
-
- //
- // Indicate the interface to use.
- //
- sSetupPacket.wIndex = (uint16_t)ui32Interface;
-
- //
- // Only request a single byte of data.
- //
- sSetupPacket.wLength = 1;
-
- //
- // Put the setup packet in the buffer and send the command.
- //
- if(USBHCDControlTransfer(0, &sSetupPacket, psDevice, pui8MaxLUN, 1,
- MAX_PACKET_SIZE_EP0) != 1)
- {
- *pui8MaxLUN = 0;
- }
-}
-
-//*****************************************************************************
-//
-//! This function checks if a drive is ready to be accessed.
-//!
-//! \param psMSCInstance is the device instance to use for this read.
-//!
-//! This function checks if the current device is ready to be accessed.
-//! It uses the \e psMSCInstance parameter to determine which device to check
-//! and returns zero when the device is ready. Any non-zero return code
-//! indicates that the device was not ready.
-//!
-//! \return This function returns zero if the device is ready and it
-//! returns a other value if the device is not ready or if an error occurred.
-//
-//*****************************************************************************
-int32_t
-USBHMSCDriveReady(tUSBHMSCInstance *psMSCInstance)
-{
- uint8_t ui8MaxLUN, pui8Buffer[SCSI_INQUIRY_DATA_SZ];
- uint32_t ui32Size;
-
- //
- // If there is no device present then return an error.
- //
- if(psMSCInstance->psDevice == 0)
- {
- return(-1);
- }
-
- //
- // Only request the maximum number of LUNs once.
- //
- if(g_sUSBHMSCDevice.ui32MaxLUN == 0xffffffff)
- {
- //
- // Get the Maximum LUNs on this device.
- //
- USBHMSCGetMaxLUN(g_sUSBHMSCDevice.psDevice,
- g_sUSBHMSCDevice.psDevice->ui32Interface, &ui8MaxLUN);
-
- //
- // Save the Maximum number of LUNs on this device.
- //
- g_sUSBHMSCDevice.ui32MaxLUN = ui8MaxLUN;
- }
-
- //
- // Just return if the device is returning not present.
- //
- ui32Size = SCSI_REQUEST_SENSE_SZ;
- if(USBHSCSIRequestSense(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size) != SCSI_CMD_STATUS_PASS)
- {
- return(-1);
- }
-
- if((pui8Buffer[SCSI_RS_SKEY] == SCSI_RS_KEY_UNIT_ATTN) &&
- (pui8Buffer[SCSI_RS_SKEY_AD_SKEY] == SCSI_RS_KEY_NOTPRSNT))
- {
- return(-1);
- }
-
- //
- // Issue a SCSI Inquiry to get basic information on the device
- //
- ui32Size = SCSI_INQUIRY_DATA_SZ;
- if((USBHSCSIInquiry(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size) != SCSI_CMD_STATUS_PASS))
- {
- return(-1);
- }
-
- //
- // Get the size of the drive.
- //
- ui32Size = SCSI_INQUIRY_DATA_SZ;
- if(USBHSCSIReadCapacity(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size) != SCSI_CMD_STATUS_PASS)
- {
- //
- // Get the current sense data from the device to see why it failed
- // the Read Capacity command.
- //
- ui32Size = SCSI_REQUEST_SENSE_SZ;
- USBHSCSIRequestSense(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size);
-
- //
- // If the read capacity failed then check if the drive is ready.
- //
- if(USBHSCSITestUnitReady(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe) !=
- SCSI_CMD_STATUS_PASS)
- {
- //
- // Get the current sense data from the device to see why it failed
- // the Test Unit Ready command.
- //
- ui32Size = SCSI_REQUEST_SENSE_SZ;
- USBHSCSIRequestSense(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size);
- }
-
- return(-1);
- }
- else
- {
- //
- // Read the block size out, value is stored big endian.
- //
- psMSCInstance->ui32BlockSize =
- (pui8Buffer[7] | (pui8Buffer[6] << 8) | pui8Buffer[5] << 16 |
- (pui8Buffer[4] << 24));
-
- //
- // Read the block size out.
- //
- psMSCInstance->ui32NumBlocks =
- (pui8Buffer[3] | (pui8Buffer[2] << 8) | pui8Buffer[1] << 16 |
- (pui8Buffer[0] << 24));
- }
-
- //
- // See if the drive is ready to use.
- //
- if(USBHSCSITestUnitReady(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe) !=
- SCSI_CMD_STATUS_PASS)
- {
- //
- // Get the current sense data from the device to see why it failed
- // the Test Unit Ready command.
- //
- ui32Size = SCSI_REQUEST_SENSE_SZ;
- USBHSCSIRequestSense(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, pui8Buffer,
- &ui32Size);
-
- return(-1);
- }
-
- //
- // Success.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function should be called before any devices are present to enable
-//! the mass storage device class driver.
-//!
-//! \param ui32Drive is the drive number to open.
-//! \param pfnCallback is the driver callback for any mass storage events.
-//!
-//! This function is called to open an instance of a mass storage device. It
-//! should be called before any devices are connected to allow for proper
-//! notification of drive connection and disconnection. The \e ui32Drive
-//! parameter is a zero based index of the drives present in the system.
-//! There are a constant number of drives, and this number should only
-//! be greater than 0 if there is a USB hub present in the system. The
-//! application should also provide the \e pfnCallback to be notified of mass
-//! storage related events like device enumeration and device removal.
-//!
-//! \return This function will return the driver instance to use for the other
-//! mass storage functions. If there is no driver available at the time of
-//! this call, this function will return zero.
-//
-//*****************************************************************************
-tUSBHMSCInstance *
-USBHMSCDriveOpen(uint32_t ui32Drive, tUSBHMSCCallback pfnCallback)
-{
- //
- // Only the first drive is supported and only one callback is supported.
- //
- if((ui32Drive != 0) || (g_sUSBHMSCDevice.pfnCallback))
- {
- return(0);
- }
-
- //
- // Save the callback.
- //
- g_sUSBHMSCDevice.pfnCallback = pfnCallback;
-
- //
- // Return the requested device instance.
- //
- return(&g_sUSBHMSCDevice);
-}
-
-//*****************************************************************************
-//
-//! This function should be called to release a drive instance.
-//!
-//! \param psMSCInstance is the device instance that is to be released.
-//!
-//! This function is called when an MSC drive is to be released in preparation
-//! for shutdown or a switch to USB device mode, for example. Following this
-//! call, the drive is available for other clients who may open it again using
-//! a call to USBHMSCDriveOpen().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHMSCDriveClose(tUSBHMSCInstance *psMSCInstance)
-{
- //
- // Close the drive (if it is already open)
- //
- USBHMSCClose((void *)psMSCInstance);
-
- //
- // Clear the callback indicating that the device is now closed.
- //
- psMSCInstance->pfnCallback = 0;
-}
-
-//*****************************************************************************
-//
-//! This function performs a block read to an MSC device.
-//!
-//! \param psMSCInstance is the device instance to use for this read.
-//! \param ui32LBA is the logical block address to read on the device.
-//! \param pui8Data is a pointer to the returned data buffer.
-//! \param ui32NumBlocks is the number of blocks to read from the device.
-//!
-//! This function will perform a block sized read from the device associated
-//! with the \e psMSCInstance parameter. The \e ui32LBA parameter specifies
-//! the logical block address to read on the device. This function will only
-//! perform \e ui32NumBlocks block sized reads. In most cases this is a read
-//! of 512 bytes of data. The \e *pui8Data buffer should be at least
-//! \e ui32NumBlocks * 512 bytes in size.
-//!
-//! \return The function returns zero for success and any negative value
-//! indicates a failure.
-//
-//*****************************************************************************
-int32_t
-USBHMSCBlockRead(tUSBHMSCInstance *psMSCInstance, uint32_t ui32LBA,
- uint8_t *pui8Data, uint32_t ui32NumBlocks)
-{
- uint32_t ui32Size;
-
- //
- // If there is no device present then return an error.
- //
- if(psMSCInstance->psDevice == 0)
- {
- return(-1);
- }
-
- //
- // Calculate the actual byte size of the read.
- //
- ui32Size = psMSCInstance->ui32BlockSize * ui32NumBlocks;
-
- //
- // Perform the SCSI read command.
- //
- if(USBHSCSIRead10(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, ui32LBA, pui8Data,
- &ui32Size, ui32NumBlocks) != SCSI_CMD_STATUS_PASS)
- {
- return(-1);
- }
-
- //
- // Success.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function performs a block write to an MSC device.
-//!
-//! \param psMSCInstance is the device instance to use for this write.
-//! \param ui32LBA is the logical block address to write on the device.
-//! \param pui8Data is a pointer to the data to write out.
-//! \param ui32NumBlocks is the number of blocks to write to the device.
-//!
-//! This function will perform a block sized write to the device associated
-//! with the \e psMSCInstance parameter. The \e ui32LBA parameter specifies
-//! the logical block address to write on the device. This function will only
-//! perform \e ui32NumBlocks block sized writes. In most cases this is a write
-//! of 512 bytes of data. The \e *pui8Data buffer should contain at least
-//! \e ui32NumBlocks * 512 bytes in size to prevent unwanted data being written
-//! to the device.
-//!
-//! \return The function returns zero for success and any negative value
-//! indicates a failure.
-//
-//*****************************************************************************
-int32_t
-USBHMSCBlockWrite(tUSBHMSCInstance *psMSCInstance, uint32_t ui32LBA,
- uint8_t *pui8Data, uint32_t ui32NumBlocks)
-{
- uint32_t ui32Size;
-
- //
- // If there is no device present then return an error.
- //
- if(psMSCInstance->psDevice == 0)
- {
- return(-1);
- }
-
- //
- // Calculate the actual byte size of the write.
- //
- ui32Size = psMSCInstance->ui32BlockSize * ui32NumBlocks;
-
- //
- // Perform the SCSI write command.
- //
- if(USBHSCSIWrite10(psMSCInstance->ui32BulkInPipe,
- psMSCInstance->ui32BulkOutPipe, ui32LBA, pui8Data,
- &ui32Size, ui32NumBlocks) != SCSI_CMD_STATUS_PASS)
- {
- return(-1);
- }
-
- //
- // Success.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.h
deleted file mode 100644
index a9820f736..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhmsc.h
+++ /dev/null
@@ -1,97 +0,0 @@
-//*****************************************************************************
-//
-// usbhmsc.h - Definitions for the USB MSC host driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHMSC_H__
-#define __USBHMSC_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-typedef struct tUSBHMSCInstance tUSBHMSCInstance;
-
-//*****************************************************************************
-//
-// These defines are the the events that will be passed in the \e ui32Event
-// parameter of the callback from the driver.
-//
-//*****************************************************************************
-#define MSC_EVENT_OPEN 1
-#define MSC_EVENT_CLOSE 2
-
-//*****************************************************************************
-//
-// The prototype for the USB MSC host driver callback function.
-//
-//*****************************************************************************
-typedef void (*tUSBHMSCCallback)(tUSBHMSCInstance *psMSCInstance,
- uint32_t ui32Event,
- void *pvEventData);
-
-//*****************************************************************************
-//
-// Prototypes for the USB MSC host driver APIs.
-//
-//*****************************************************************************
-extern tUSBHMSCInstance * USBHMSCDriveOpen(uint32_t ui32Drive,
- tUSBHMSCCallback pfnCallback);
-extern void USBHMSCDriveClose(tUSBHMSCInstance *psMSCInstance);
-extern int32_t USBHMSCDriveReady(tUSBHMSCInstance *psMSCInstance);
-extern int32_t USBHMSCBlockRead(tUSBHMSCInstance *psMSCInstance,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t ui32NumBlocks);
-extern int32_t USBHMSCBlockWrite(tUSBHMSCInstance *psMSCInstance,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t ui32NumBlocks);
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHMSC_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhost.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhost.h
deleted file mode 100644
index 78cbf8c91..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhost.h
+++ /dev/null
@@ -1,274 +0,0 @@
-//*****************************************************************************
-//
-// usbhost.h - Host specific definitions for the USB host library.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHOST_H__
-#define __USBHOST_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_hcd
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This is the type used to identify what the pipe is currently in use for.
-//
-//*****************************************************************************
-#define USBHCD_PIPE_UNUSED 0x00100000
-#define USBHCD_PIPE_CONTROL 0x00130000
-#define USBHCD_PIPE_BULK_OUT 0x00210000
-#define USBHCD_PIPE_BULK_IN 0x00220000
-#define USBHCD_PIPE_INTR_OUT 0x00410000
-#define USBHCD_PIPE_INTR_IN 0x00420000
-#define USBHCD_PIPE_ISOC_OUT 0x00810000
-#define USBHCD_PIPE_ISOC_IN 0x00820000
-#define USBHCD_PIPE_ISOC_OUT_DMA 0x01810000
-#define USBHCD_PIPE_ISOC_IN_DMA 0x01820000
-#define USBHCD_PIPE_BULK_OUT_DMA 0x01210000
-#define USBHCD_PIPE_BULK_IN_DMA 0x01220000
-
-//*****************************************************************************
-//
-// These are the defines that are used with USBHCDPowerConfigInit().
-//
-//*****************************************************************************
-#define USBHCD_FAULT_LOW 0x00000010
-#define USBHCD_FAULT_HIGH 0x00000030
-#define USBHCD_FAULT_VBUS_NONE 0x00000000
-#define USBHCD_FAULT_VBUS_TRI 0x00000140
-#define USBHCD_FAULT_VBUS_DIS 0x00000400
-#define USBHCD_VBUS_MANUAL 0x00000004
-#define USBHCD_VBUS_AUTO_LOW 0x00000002
-#define USBHCD_VBUS_AUTO_HIGH 0x00000003
-#define USBHCD_VBUS_FILTER 0x00010000
-
-//*****************************************************************************
-//
-//! This macro is used to declare an instance of an Event driver for the USB
-//! library.
-//!
-//! \param VarName is the name of the variable.
-//! \param pfnOpen is the callback for the Open call to this driver. This
-//! value is currently reserved and should be set to 0.
-//! \param pfnClose is the callback for the Close call to this driver. This
-//! value is currently reserved and should be set to 0.
-//! \param pfnEvent is the callback that will be called for various USB events.
-//!
-//! The first parameter is the actual name of the variable that will
-//! be declared by this macro. The second and third parameter are reserved
-//! for future functionality and are unused and should be set to zero. The
-//! last parameter is the actual callback function and is specified as
-//! a function pointer of the type:
-//!
-//! void (*pfnEvent)(void *pvData);
-//!
-//! When the \e pfnEvent function is called the void pointer that is passed in
-//! as a parameter should be cast to a pointer to a structure of type
-//! tEventInfo. This will contain the event that caused the pfnEvent function
-//! to be called.
-//
-//*****************************************************************************
-#define DECLARE_EVENT_DRIVER(VarName, pfnOpen, pfnClose, pfnEvent) \
-void IntFn(void *pvData); \
-const tUSBHostClassDriver VarName = \
-{ \
- USB_CLASS_EVENTS, \
- 0, \
- 0, \
- pfnEvent \
-}
-
-//*****************************************************************************
-//
-// This is the type definition a callback for events on USB Pipes allocated
-// by USBHCDPipeAlloc().
-//
-// \param ui32Pipe is well the pipe
-// \param ui32Event is well the event
-//
-// This prototype is used by any Pipe callbacks that are used in the host
-// class drivers. These functions typically handle data events like
-// USB_EVENT_RX_AVAILABLE or USB_EVENT_TX_COMPLETE but can be sent other events
-// depending on the USB host class in use. See the documentation for the
-// individual classes for the valid events for that class.
-//
-// \return None.
-//
-//*****************************************************************************
-typedef void (* tHCDPipeCallback)(uint32_t ui32Pipe, uint32_t ui32Event);
-
-//*****************************************************************************
-//
-// Predeclare the private tUSBHostDevice structure.
-//
-//*****************************************************************************
-typedef struct tUSBHostDevice tUSBHostDevice;
-
-//*****************************************************************************
-//
-//! This structure defines a USB host class driver interface, it is parsed to
-//! find a USB class driver once a USB device is enumerated.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The interface class that this device class driver supports.
- //
- uint32_t ui32InterfaceClass;
-
- //
- //! The function is called when this class of device has been detected.
- //
- void *(*pfnOpen)(tUSBHostDevice *psDevice);
-
- //
- //! The function is called when the device, originally opened with a call
- //! to the pfnOpen function, is disconnected.
- //
- void (*pfnClose)(void *pvInstance);
-
- //
- //! This is the optional interrupt handler that will be called when an
- //! endpoint associated with this device instance generates an interrupt.
- //
- void (*pfnIntHandler)(void *pvInstance);
-}
-tUSBHostClassDriver;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// If the g_USBEventDriver is included in the host controller driver list then
-// this function must be provided by the application.
-//
-//*****************************************************************************
-extern void USBHCDEvents(void *pvData);
-
-//*****************************************************************************
-//
-// Prototypes for the USB Host controller APIs.
-//
-//*****************************************************************************
-extern void USBHCDMain(void);
-extern int32_t USBHCDEventEnable(uint32_t ui32Index, void *pvEventDriver,
- uint32_t ui32Event);
-extern int32_t USBHCDEventDisable(uint32_t ui32Index, void *pvEventDriver,
- uint32_t ui32Event);
-extern void USBHCDInit(uint32_t ui32Index, void *pvData,
- uint32_t ui32Size);
-extern void USBHCDPowerConfigInit(uint32_t ui32Index,
- uint32_t ui32Flags);
-extern uint32_t USBHCDPowerConfigGet(uint32_t ui32Index);
-extern uint32_t USBHCDPowerConfigSet(uint32_t ui32Index,
- uint32_t ui32Config);
-extern uint32_t USBHCDPowerAutomatic(uint32_t ui32Index);
-extern void USBHCDRegisterDrivers(uint32_t ui32Index,
- const tUSBHostClassDriver * const *ppsHClassDrvrs,
- uint32_t ui32NumDrivers);
-extern void USBHCDTerm(uint32_t ui32Index);
-extern void USBHCDSetConfig(uint32_t ui32Index, uint32_t ui32Device,
- uint32_t ui32Configuration);
-extern void USBHCDSetInterface(uint32_t ui32Index, uint32_t ui32Device,
- uint32_t ui32Interface,
- uint32_t ui32AltSetting);
-extern void USBHCDSuspend(uint32_t ui32Index);
-extern void USBHCDResume(uint32_t ui32Index);
-extern void USBHCDReset(uint32_t ui32Index);
-extern void USBHCDPipeFree(uint32_t ui32Pipe);
-extern uint32_t USBHCDPipeAlloc(uint32_t ui32Index,
- uint32_t ui32EndpointType,
- tUSBHostDevice *psDevice,
- tHCDPipeCallback pfnCallback);
-extern uint32_t USBHCDPipeAllocSize(uint32_t ui32Index,
- uint32_t ui32EndpointType,
- tUSBHostDevice *psDevice,
- uint32_t ui32FIFOSize,
- tHCDPipeCallback pfnCallback);
-extern uint32_t USBHCDPipeConfig(uint32_t ui32Pipe, uint32_t ui32MaxPayload,
- uint32_t ui32Interval,
- uint32_t ui32TargetEndpoint);
-extern uint32_t USBHCDPipeStatus(uint32_t ui32Pipe);
-extern uint32_t USBHCDPipeWrite(uint32_t ui32Pipe, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern uint32_t USBHCDPipeRead(uint32_t ui32Pipe, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern uint32_t USBHCDPipeSchedule(uint32_t ui32Pipe, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern void USBHCDPipeDataAck(uint32_t ui32Pipe);
-extern uint32_t USBHCDPipeReadNonBlocking(uint32_t ui32Pipe, uint8_t *pui8Data,
- uint32_t ui32Size);
-extern uint32_t USBHCDControlTransfer(uint32_t ui32Index,
- tUSBRequest *psSetupPacket,
- tUSBHostDevice *psDevice,
- uint8_t *pui8Data, uint32_t ui32Size,
- uint32_t ui32MaxPacketSize);
-extern void USB0HostIntHandler(void);
-
-extern uint8_t USBHCDDevHubPort(uint32_t ui32Instance);
-extern uint8_t USBHCDDevAddress(uint32_t ui32Instance);
-extern uint8_t USBHCDDevClass(uint32_t ui32Instance, uint32_t ui32Interface);
-extern uint8_t USBHCDDevSubClass(uint32_t ui32Instance,
- uint32_t ui32Interface);
-extern uint8_t USBHCDDevProtocol(uint32_t ui32Instance,
- uint32_t ui32Interface);
-
-//*****************************************************************************
-//
-// The host class drivers supported by the USB library.
-//
-//*****************************************************************************
-extern const tUSBHostClassDriver g_sUSBHostMSCClassDriver;
-extern const tUSBHostClassDriver g_sUSBHIDClassDriver;
-extern const tUSBHostClassDriver g_sUSBHostAudioClassDriver;
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHOST_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostenum.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostenum.c
deleted file mode 100644
index a776046c7..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostenum.c
+++ /dev/null
@@ -1,5684 +0,0 @@
-//*****************************************************************************
-//
-// usbhostenum.c - Device enumeration code for the USB host library.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_ints.h"
-#include "inc/hw_memmap.h"
-#include "inc/hw_sysctl.h"
-#include "inc/hw_types.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/debug.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/rtos_bindings.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/host/usbhhub.h"
-
-#ifdef INCLUDE_DEBUG_OUTPUT
-#include "utils/uartstdio.h"
-#define DEBUG_OUTPUT UARTprintf
-#else
-#define DEBUG_OUTPUT while(0)((int32_t (*)(char *, ...))0)
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_hcd
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// External prototypes.
-//
-//*****************************************************************************
-extern tUSBMode g_iUSBMode;
-
-extern void OTGDeviceDisconnect(uint32_t ui32Index);
-
-//*****************************************************************************
-//
-// Internal function prototypes.
-//
-//*****************************************************************************
-static void USBHCDEP0StateTx(void);
-static void USBHCDEnumHandler(void);
-static void USBHCDClearFeature(uint32_t ui32DevAddress, uint32_t ui32Endpoint,
- uint32_t ui32Feature);
-
-//*****************************************************************************
-//
-// Automatic power enable.
-//
-//*****************************************************************************
-#define USB_HOST_PWREN_AUTO 0x00000002
-
-//*****************************************************************************
-//
-// Flags used to signal between the interrupt handler and USBHCDMain().
-//
-//*****************************************************************************
-#define INT_EVENT_VBUS_ERR 0x01
-#define INT_EVENT_CONNECT 0x02
-#define INT_EVENT_DISCONNECT 0x04
-#define INT_EVENT_POWER_FAULT 0x08
-#define INT_EVENT_SOF 0x10
-#define INT_EVENT_ENUM 0x20
-
-//*****************************************************************************
-//
-// Flags used with the tUSBHostDevice.ui32Flags structure member.
-//
-//*****************************************************************************
-#define USBHDEV_FLAG_NOTIFYINT 0x00000001
-#define USBHDEV_FLAG_ALLOCATED 0x80000000
-
-//*****************************************************************************
-//
-// This holds the current power configuration that is used when USBHCDInit()
-// is called.
-//
-//*****************************************************************************
-static uint32_t g_ui32PowerConfig = USBHCD_VBUS_AUTO_HIGH;
-
-//*****************************************************************************
-//
-// The states for endpoint 0 during enumeration.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // The USB device is waiting on a request from the host controller on
- // endpoint 0.
- //
- eEP0StateIdle,
-
- //
- // Setup packet is expecting data IN.
- //
- eEP0StateSetupIN,
-
- //
- // Setup packet is sending data OUT.
- //
- eEP0StateSetupOUT,
-
- //
- // The USB device is receiving data from the device due to an SETUP IN
- // request.
- //
- eEP0StateRx,
-
- //
- // The USB device has completed the IN or OUT request and is now waiting
- // for the host to acknowledge the end of the IN/OUT transaction. This
- // is the status phase for a USB control transaction.
- //
- eEP0StateStatus,
-
- //
- // This state is for when a response only has a status phase and no
- // data phase.
- //
- eEP0StateStatusIN,
-
- //
- // This endpoint has signaled a stall condition and is waiting for the
- // stall to be acknowledged by the host controller.
- //
- eEP0StateStall,
-
- //
- // An error has occurred on endpoint 0.
- //
- eEP0StateError
-}
-tEP0State;
-
-//*****************************************************************************
-//
-// This structure holds the full state for the device enumeration.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // This is the pointer to the current data being sent out or received
- // on endpoint 0.
- //
- uint8_t *pui8Data;
-
- //
- // This is the number of bytes that remain to be sent from or received
- // into the g_DeviceState.pEP0Data data buffer.
- //
- volatile uint32_t ui32BytesRemaining;
-
- //
- // The amount of data being sent/received due to a request.
- //
- uint32_t ui32DataSize;
-
- //
- // This is the current device address in use by endpoint 0.
- //
- uint32_t ui32DevAddress;
-
- //
- // The maximum packet size for the device responding to the setup packet.
- //
- uint32_t ui32MaxPacketSize;
-
- //
- // The host controller's state.
- //
- tEP0State iState;
-}
-tHostState;
-
-//*****************************************************************************
-//
-// This variable holds the current state of endpoint 0.
-//
-//*****************************************************************************
-static volatile tHostState g_sUSBHEP0State =
-{
- 0, // pui8Data
- 0, // ui32BytesRemaining
- 0, // ui32DataSize
- 0, // ui32DevAddress
- 0, // ui32MaxPacketSize
- eEP0StateIdle // iState
-};
-
-//*****************************************************************************
-//
-// The global delay time for use by SysCtlDelay() function. This is
-// initialized to an appropriate value for a 50MHz clock. The correct value
-// will be set in USBHCDInit().
-//
-//*****************************************************************************
-static uint32_t g_ui32Tickms = 0;
-static volatile uint32_t g_ui32CurrentTick = 0;
-
-//*****************************************************************************
-//
-// The current active drivers.
-//
-//*****************************************************************************
-static int32_t g_pi32USBHActiveDriver[MAX_USB_DEVICES + 1];
-static void *g_ppvDriverInstance[MAX_USB_DEVICES + 1];
-
-//*****************************************************************************
-//
-// This is the structure used to hold the information for a given USB pipe
-// that is attached to a device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The current address for this pipe.
- //
- tUSBHostDevice *psDevice;
-
- //
- // The current address for this pipe.
- //
- uint8_t ui8EPNumber;
-
- //
- // The DMA channel assigned to this endpoint.
- //
- uint8_t ui8DMAChannel;
-
- //
- // The current type for this pipe.
- //
- uint32_t ui32Type;
-
- //
- // The millisecond interval for this pipe.
- //
- uint32_t ui32Interval;
-
- //
- // The next tick value to trigger and event on this pipe.
- //
- uint32_t ui32NextEventTick;
-
- //
- // The current call back for this pipe.
- //
- tHCDPipeCallback pfnCallback;
-
- //
- // The pointer to which IN data must be copied.
- //
- uint8_t *pui8ReadPtr;
-
- //
- // The number of bytes of read data to copy.
- //
- uint32_t ui32ReadSize;
-
- //
- // The state of a given USB pipe.
- //
- volatile enum
- {
- ePipeReading,
- ePipeReadDMA,
- ePipeReadDMAWait,
- ePipeReadSingle,
- ePipeDataReady,
- ePipeDataSent,
- ePipeWriting,
- ePipeWriteDMA,
- ePipeWriteDMASend,
- ePipeWriteDMAWait,
- ePipeWriteSingle,
- ePipeStalled,
- ePipeError,
- ePipeIdle,
- ePipeDisabled
- }
- iState;
-
- //
- // The actual FIFO offset allocated to this endpoint.
- //
- uint16_t ui16FIFOAddr;
-
- //
- // The size of the FIFO entry based on the size parameter. These are
- // equivalent to the USB_FIFO_SZ_* values in usb.h.
- //
- uint8_t ui8FIFOSize;
-
- //
- // The bit offset in the allocation structure.
- //
- uint8_t ui8FIFOBitOffset;
-}
-tUSBHCDPipe;
-
-//*****************************************************************************
-//
-// The internal state of the device.
-//
-//*****************************************************************************
-typedef enum
-{
- eHCDDevDisconnected,
- eHCDDevConnected,
- eHCDDevConnectedHub,
- eHCDDevRequest,
- eHCDDevReset,
- eHCDDevAddressed,
- eHCDDevConfigured,
- eHCDDevGetStrings,
- eHCDDevError,
- eHCDVBUSError,
- eHCDPowerFault,
- eHCDIdle
-}
-tUSBHDeviceState;
-
-static void ProcessUSBDeviceStateMachine(tUSBHDeviceState iOldState,
- uint32_t ui32DevIndex);
-
-//*****************************************************************************
-//
-// This is a fixed number as it relates to the maximum number of USB pipes
-// available on any USB controller. The actual number on a given device may
-// be less than this number.
-//
-//*****************************************************************************
-#define MAX_NUM_PIPES 15
-
-//*****************************************************************************
-//
-// This is a fixed number as it relates to the number of USB pipes available
-// in the USB controller.
-//
-//*****************************************************************************
-#define MAX_NUM_DMA_CHANNELS 6
-
-//*****************************************************************************
-//
-// Marker for an unused DMA channel slot.
-//
-//*****************************************************************************
-#define USBHCD_DMA_UNUSED 0xff
-
-//*****************************************************************************
-//
-// These definitions are used to manipulate the values returned as allocated
-// USB pipes.
-//
-//*****************************************************************************
-#define EP_PIPE_TYPE_LOW_SPEED 0x02000000
-#define EP_PIPE_USE_UDMA 0x01000000
-#define EP_PIPE_TYPE_ISOC 0x00800000
-#define EP_PIPE_TYPE_INTR 0x00400000
-#define EP_PIPE_TYPE_BULK 0x00200000
-#define EP_PIPE_TYPE_CONTROL 0x00100000
-#define EP_PIPE_TYPE_IN 0x00020000
-#define EP_PIPE_TYPE_OUT 0x00010000
-#define EP_PIPE_IDX_M 0x0000ffff
-
-//*****************************************************************************
-//
-// This creates a USB pipe handle from an index.
-//
-//*****************************************************************************
-#define OUT_PIPE_HANDLE(ui32Idx) \
- (g_sUSBHCD.psUSBOUTPipes[ui32Idx].ui32Type | \
- ui32Idx)
-#define IN_PIPE_HANDLE(ui32Idx) (g_sUSBHCD.psUSBINPipes[ui32Idx].ui32Type | \
- ui32Idx)
-
-//*****************************************************************************
-//
-// Converts from an endpoint specifier to the offset of the endpoint's
-// control/status registers.
-//
-//*****************************************************************************
-#define EP_OFFSET(Endpoint) (Endpoint - 0x10)
-
-//*****************************************************************************
-//
-// This structure holds the state information for a given host controller.
-//
-//*****************************************************************************
-typedef struct
-{
- uint32_t ui32USBBase;
-
- tUSBHCDPipe sUSBControlPipe;
- tUSBHCDPipe psUSBOUTPipes[MAX_NUM_PIPES];
- tUSBHCDPipe psUSBINPipes[MAX_NUM_PIPES];
-
- //
- // Each devices state. We support a total of (MAX_USB_DEVICES + 1) devices
- // to allow for the use if MAX_USB_DEVICES through a single hub (which is
- // itself a device).
- //
- tUSBHostDevice psUSBDevice[MAX_USB_DEVICES + 1];
-
- //
- // Holds the current state of the device.
- //
- volatile tUSBHDeviceState piDeviceState[MAX_USB_DEVICES + 1];
-
- //
- // Pointer to the memory pool for this controller.
- //
- void *pvPool;
-
- //
- // The pool size for this controller.
- //
- uint32_t ui32PoolSize;
-
- //
- // The number of endpoint pairs supported by the controller.
- //
- uint32_t ui32NumEndpoints;
-
- //
- // The class drivers for this controller.
- //
- const tUSBHostClassDriver * const *ppsClassDrivers;
-
- //
- // The number of class drivers.
- //
- uint32_t ui32NumClassDrivers;
-
- //
- // This is the index in the driver list of the event driver.
- //
- int32_t i32EventDriver;
-
- //
- // These are the generic event information used by the event driver.
- //
- uint32_t ui32EventEnables;
-
- uint32_t ui32Class;
-
- //
- // The DMA instance information for this class.
- //
- tUSBDMAInstance *psDMAInstance;
-
- //
- // The interrupt number for this instance.
- //
- uint32_t ui32IntNum;
-
- //
- // The pending interrupt events that are processed in USBHCDMain().
- //
- uint32_t ui32IntEvents;
-
- //
- // Features.
- //
- uint32_t ui32Features;
-
- //
- // The host initiated resume duration in us.
- //
- uint32_t ui32LPMHIRD;
-}
-tUSBHCD;
-
-//*****************************************************************************
-//
-// The global to hold all of the state information for a given host controller.
-//
-//*****************************************************************************
-static tUSBHCD g_sUSBHCD;
-
-//*****************************************************************************
-//
-// Allocates the memory needed to support configuration descriptors for
-// devices.
-//
-//*****************************************************************************
-uint32_t
-ConfigDescAlloc(tUSBHostDevice *psDevice, uint32_t ui32Size)
-{
- uint32_t ui32Idx, ui32BlockSize, ui32PoolSize;
- uint8_t *pui8Pool;
-
- if(g_sUSBHCD.psUSBDevice[0].psConfigDescriptor == 0)
- {
- //
- // 32 bit align the allocation.
- //
- ui32Size = (ui32Size + 3) & ~3;
-
- if(g_sUSBHCD.ui32PoolSize < ui32Size)
- {
- return(0);
- }
-
- //
- // Allocate the root connection to the device.
- //
- g_sUSBHCD.psUSBDevice[0].psConfigDescriptor = g_sUSBHCD.pvPool;
- g_sUSBHCD.psUSBDevice[0].ui32ConfigDescriptorSize = ui32Size;
-
- //
- // Allocate the hub memory pools (these can end up null).
- //
- pui8Pool = (uint8_t *)g_sUSBHCD.pvPool + ui32Size;
- ui32PoolSize = g_sUSBHCD.ui32PoolSize - ui32Size;
-
- //
- // Divide the pool up into blocks, one for each supported port. We make
- // sure that each block is a multiple of 4 bytes.
- //
- ui32BlockSize = (ui32PoolSize / MAX_USB_DEVICES) & ~3;
- for(ui32Idx = 1; ui32Idx < MAX_USB_DEVICES; ui32Idx++)
- {
- g_sUSBHCD.psUSBDevice[ui32Idx].psConfigDescriptor =
- (tConfigDescriptor *)(pui8Pool +
- (ui32Idx * ui32BlockSize));
- g_sUSBHCD.psUSBDevice[ui32Idx].ui32ConfigDescriptorSize =
- ui32BlockSize;
- }
- }
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-// Frees the memory needed to support configuration descriptors for
-// devices.
-//
-//*****************************************************************************
-void
-ConfigDescFree(tUSBHostDevice *psDevice)
-{
- uint32_t ui32Idx;
-
- //
- // If this is the root device then deallocate.
- //
- if(&g_sUSBHCD.psUSBDevice[0] == psDevice)
- {
- for(ui32Idx = 0; ui32Idx < MAX_USB_DEVICES; ui32Idx++)
- {
- g_sUSBHCD.psUSBDevice[ui32Idx].ui32Flags &=
- ~USBHDEV_FLAG_ALLOCATED;
- g_sUSBHCD.psUSBDevice[ui32Idx].psConfigDescriptor = 0;
- g_sUSBHCD.psUSBDevice[ui32Idx].ui32ConfigDescriptorSize = 0;
- }
- }
-}
-
-//*****************************************************************************
-//
-// Return the device index from a ui32Instance value passed from an external
-// source.
-//
-//*****************************************************************************
-static uint8_t
-HCDInstanceToDevIndex(uint32_t ui32Instance)
-{
- uint32_t ui32DevIndex;
-
- //
- // Get the device instance from the instance value.
- //
- ui32DevIndex = (ui32Instance & 0xff);
-
- //
- // If the above math went negative or is too large just return 0xff.
- //
- if(ui32DevIndex > MAX_USB_DEVICES)
- {
- ui32DevIndex = 0xff;
- }
-
- return(ui32DevIndex);
-}
-
-//=============================================================================
-//
-// This is the internal function that will map an event to a valid event flag.
-//
-// \param ui32Event specifies which event flag to retrieve.
-//
-// \return The event flag or 0 if there is no support event flag for the
-// event specified by the \e ui32Event parameter.
-//
-//=============================================================================
-static uint32_t
-GetEventFlag(uint32_t ui32Event)
-{
- uint32_t ui32EventFlag;
-
- ui32EventFlag = 0;
-
- //
- // Search for a valid event flag for the requested event.
- //
- switch(ui32Event)
- {
- case USB_EVENT_SOF:
- {
- ui32EventFlag |= USBHCD_EVFLAG_SOF;
- break;
- }
- case USB_EVENT_CONNECTED:
- {
- ui32EventFlag |= USBHCD_EVFLAG_CONNECT;
- break;
- }
- case USB_EVENT_DISCONNECTED:
- {
- ui32EventFlag |= USBHCD_EVFLAG_DISCNCT;
- break;
- }
- case USB_EVENT_UNKNOWN_CONNECTED:
- {
- ui32EventFlag |= USBHCD_EVFLAG_UNKCNCT;
- break;
- }
- case USB_EVENT_POWER_FAULT:
- {
- ui32EventFlag |= USBHCD_EVFLAG_PWRFAULT;
- break;
- }
- case USB_EVENT_POWER_DISABLE:
- {
- ui32EventFlag |= USBHCD_EVFLAG_PWRDIS;
- break;
- }
- case USB_EVENT_POWER_ENABLE:
- {
- ui32EventFlag |= USBHCD_EVFLAG_PWREN;
- break;
- }
- default:
- {
- break;
- }
- }
- return(ui32EventFlag);
-}
-
-//=============================================================================
-//
-//! This function is called to enable a specific USB HCD event notification.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param pvEventDriver is the event driver structure that was passed into
-//! the USBHCDRegisterDrivers() function as part of the array of
-//! tUSBHostClassDriver structures.
-//! \param ui32Event is the event to enable.
-//!
-//! This function is called to enable event callbacks for a specific USB HCD
-//! event. The requested event is passed in the \e ui32Event parameter. Not
-//! all events can be enables so the function will return zero if the event
-//! provided cannot be enabled. The \e pvEventDriver is a pointer to the
-//! event driver structure that the caller passed into the
-//! USBHCDRegisterDrivers() function. This structure is typically declared
-//! with the DECLARE_EVENT_DRIVER() macro and included as part of the array
-//! of pointers to tUSBHostClassDriver structures that is passed to the
-//! USBHCDRegisterDrivers() function.
-//!
-//! \return This function returns a non-zero number if the event was
-//! successfully enabled and returns zero if the event cannot be enabled.
-//
-//=============================================================================
-int32_t
-USBHCDEventEnable(uint32_t ui32Index, void *pvEventDriver, uint32_t ui32Event)
-{
- int32_t i32Ret;
- uint32_t ui32EventFlag;
-
- ASSERT(ui32Index == 0);
-
- //
- // Default the return to fail the call unless a valid event is found.
- //
- i32Ret = 0;
-
- //
- // Get the event flag for this event.
- //
- ui32EventFlag = GetEventFlag(ui32Event);
-
- //
- // Check if there was an event flag for the corresponding event.
- //
- if(ui32EventFlag)
- {
- //
- // Set the enable for this event.
- //
- g_sUSBHCD.ui32EventEnables |= ui32EventFlag;
-
- //
- // Indicate that the event was valid and is now enabled.
- //
- i32Ret = 1;
- }
-
- return(i32Ret);
-}
-
-//=============================================================================
-//
-//! This function is called to disable a specific USB HCD event notification.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param pvEventDriver is the event driver structure that was passed into
-//! the USBHCDRegisterDrivers() function as part of the array of
-//! tUSBHostClassDriver structures.
-//! \param ui32Event is the event to disable.
-//!
-//! This function is called to disable event callbacks for a specific USB HCD
-//! event. The requested event is passed in the \e ui32Event parameter. Not
-//! all events can be enables so the function will return zero if the event
-//! provided cannot be enabled. The \e pvEventDriver is a pointer to the
-//! event driver structure that the caller passed into the
-//! USBHCDRegisterDrivers() function. This structure is typically declared
-//! with the DECLARE_EVENT_DRIVER() macro and included as part of the array
-//! of pointers to tUSBHostClassDriver structures that is passed to the
-//! USBHCDRegisterDrivers() function.
-//!
-//! \return This function returns a non-zero number if the event was
-//! successfully disabled and returns zero if the event cannot be disabled.
-//
-//=============================================================================
-int32_t
-USBHCDEventDisable(uint32_t ui32Index, void *pvEventDriver, uint32_t ui32Event)
-{
- int32_t i32Ret;
- uint32_t ui32EventFlag;
-
- ASSERT(ui32Index == 0);
-
- //
- // Default the return to fail the call unless a valid event is found.
- //
- i32Ret = 0;
-
- //
- // Get the event flag for this event.
- //
- ui32EventFlag = GetEventFlag(ui32Event);
-
- //
- // Check if there was an event flag for the corresponding event.
- //
- if(ui32EventFlag)
- {
- //
- // Clear the enable for this event.
- //
- g_sUSBHCD.ui32EventEnables &= ~ui32EventFlag;
-
- //
- // Indicate that the event was valid and is now disabled.
- //
- i32Ret = 1;
- }
-
- return(i32Ret);
-}
-
-//*****************************************************************************
-//
-// If there is an event driver this function will send out a generic connection
-// event USB_EVENT_UNKNOWN_CONNECTED indicating that an unknown connection
-// event has occurred.
-//
-//*****************************************************************************
-static void
-SendUnknownConnect(uint32_t ui32Index, uint32_t ui32Class)
-{
- tEventInfo sEvent;
-
- //
- // If there is an event driver registered and it has a event handler and
- // the USBHCD_EVFLAG_UNKCNCT is enabled then call the function.
- //
- sEvent.ui32Event = USB_EVENT_UNKNOWN_CONNECTED;
- sEvent.ui32Instance = ui32Class;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_UNKCNCT);
-}
-
-//*****************************************************************************
-//
-// Internal memory allocation space is two 32-bit values where each
-// bit represents a 64 byte block in the FIFO. This requires 64 bits for
-// the 4096 bytes of FIFO available.
-//
-//*****************************************************************************
-static uint32_t g_pui32Alloc[2];
-
-//*****************************************************************************
-//
-// This function handles freeing FIFO memory that has been allocated using the
-// FIFOAlloc() function.
-//
-//*****************************************************************************
-static void
-FIFOFree(tUSBHCDPipe *psUSBPipe)
-{
- uint32_t ui32Mask;
-
- //
- // Calculate the mask value to use to clear off the allocated blocks used
- // by the USB pipe specified by psUSBPipe.
- //
- ui32Mask = (1 << (psUSBPipe->ui8FIFOSize - 2)) - 1;
- ui32Mask = ui32Mask << psUSBPipe->ui8FIFOBitOffset;
-
- //
- // Determine which 32 bit word to access based on the size.
- //
- if(psUSBPipe->ui8FIFOSize > USB_FIFO_SZ_64)
- {
- //
- // If the FIFO size is greater than 64 then use the upper 32 bits.
- //
- g_pui32Alloc[1] &= ~ui32Mask;
- }
- else
- {
- //
- // If the FIFO size is less than or equal to 64 then use the lower
- // 32 bits.
- //
- g_pui32Alloc[0] &= ~ui32Mask;
- }
-}
-
-//*****************************************************************************
-//
-// This function is used to allocate FIFO memory to a given USB pipe.
-//
-// \param psUSBPipe is the USB pipe that needs FIFO memory allocated.
-// \param ui32Size is the minimum size in bytes of the FIFO to allocate.
-//
-// This function will allocate \e ui32Size bytes to the USB pipe in the
-// \e psUSBPipe parameter. The function will fill the psUSBPipe structure
-// members ui8FIFOSize and ui8FIFOAddr with values that can be used with the
-// USBFIFOConfigSet() API. This allocation uses a first fit algorithm.
-//
-// \return This function returns the size of the block allocated.
-//
-//*****************************************************************************
-static uint32_t
-FIFOAlloc(tUSBHCDPipe *psUSBPipe, uint32_t ui32Size)
-{
- uint32_t ui32Blocks, ui32Start, ui32BlockSize, ui32Temp, ui32Index;
- uint16_t ui16FIFOAddr;
-
- //
- // Save which 32 bit value to access, the upper is for blocks greater
- // than 64 and the lower is for block 64 or less.
- //
- if(ui32Size > 64)
- {
- ui32Index = 1;
- }
- else
- {
- ui32Index = 0;
- }
-
- //
- // Initial FIFO address is 0.
- //
- ui16FIFOAddr = 0;
-
- //
- // Initialize the bit pattern and bit location.
- //
- ui32Blocks = 1;
- ui32Start = 0;
-
- //
- // The initial block size is always the minimum size of 64 bytes.
- //
- ui32BlockSize = 64;
-
- //
- // The initial size and offset are 64 and 0.
- //
- psUSBPipe->ui8FIFOBitOffset = 0;
- psUSBPipe->ui8FIFOSize = 3;
-
- //
- // Scan through 32 bits looking for a memory block large enough to fill
- // the request.
- //
- while(ui16FIFOAddr <= 32)
- {
- //
- // If the pattern is zero then it is a possible match.
- //
- if((g_pui32Alloc[ui32Index] & ui32Blocks) == 0)
- {
- //
- // If the size is large enough then save it and break out of the
- // loop.
- //
- if(ui32BlockSize >= ui32Size)
- {
- //
- // Mark the memory as allocated.
- //
- g_pui32Alloc[ui32Index] |= ui32Blocks;
-
- break;
- }
-
- //
- // Increment the size of the FIFO block.
- //
- psUSBPipe->ui8FIFOSize++;
-
- //
- // Add in a new bit to the size of the allocation.
- //
- ui32Blocks = ui32Blocks | (ui32Blocks << 1) ;
-
- //
- // Double the current size.
- //
- ui32BlockSize <<= 1;
-
- }
- else
- {
- //
- // Need to start over looking because the last allocation match
- // failed, so reset the bit offset to the current location and the
- // size to 64 bytes.
- //
- psUSBPipe->ui8FIFOBitOffset = ui16FIFOAddr;
- psUSBPipe->ui8FIFOSize = 3;
-
- //
- // Reset the block size to the minimum (64 bytes).
- //
- ui32BlockSize = 64;
-
- //
- // Store the current starting bit location and set the block mask
- // to this value.
- //
- ui32Start = 1 << ui16FIFOAddr;
- ui32Blocks = ui32Start;
- }
-
- //
- // Increase the address of the FIFO offset.
- //
- ui16FIFOAddr++;
- }
-
- //
- // If there was no block large enough then fail this call.
- //
- if(ui16FIFOAddr > 32)
- {
- ui32BlockSize = 0;
- psUSBPipe->ui16FIFOAddr = 0;
- psUSBPipe->ui8FIFOBitOffset = 0;
- psUSBPipe->ui8FIFOSize = 0;
- }
- else
- {
- //
- // Calculate the offset in the FIFO.
- //
- ui32Temp = psUSBPipe->ui8FIFOBitOffset * 64;
-
- //
- // Sizes greater than 64 are allocated in the second half of the FIFO
- // memory space.
- //
- if(ui32Size > 64)
- {
- ui32Temp += 2048;
- }
-
- //
- // Convert this to the value that can be set in the USB controller.
- //
- psUSBPipe->ui16FIFOAddr = (uint16_t)ui32Temp;
- }
- return(ui32BlockSize);
-}
-
-//*****************************************************************************
-//
-//! This function is used to allocate a USB HCD pipe.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32EndpointType is the type of endpoint that this pipe will be
-//! communicating with.
-//! \param psDevice is the device instance associated with this endpoint.
-//! \param ui32Size is the size of the FIFO in bytes.
-//! \param pfnCallback is the function that will be called when events occur on
-//! this USB Pipe.
-//!
-//! Since there are a limited number of USB HCD pipes that can be used in the
-//! host controller, this function is used to temporarily or permanently
-//! acquire one of the endpoints. Unlike the USBHCDPipeAlloc() function this
-//! function allows the caller to specify the size of the FIFO allocated to
-//! this endpoint in the \e ui32Size parameter. This function also provides a
-//! method to register a callback for status changes on this endpoint. If no
-//! callbacks are desired then the \e pfnCallback function should be set to 0.
-//! The callback should be used when using the USBHCDPipeSchedule() function
-//! so that the caller is notified when the action is complete.
-//!
-//! \return This function returns a value indicating which pipe was reserved.
-//! If the value is 0 then there were no pipes currently available. This value
-//! should be passed to any USBHCDPipe APIs to indicate which pipe is being
-//! accessed.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeAllocSize(uint32_t ui32Index, uint32_t ui32EndpointType,
- tUSBHostDevice *psDevice, uint32_t ui32Size,
- tHCDPipeCallback pfnCallback)
-{
- int32_t i32Idx;
-
- uint32_t ui32HubAddr;
-
- ASSERT(ui32Index == 0);
-
- //
- // Find a USB pipe that is free.
- //
- for(i32Idx = 0; i32Idx < MAX_NUM_PIPES; i32Idx++)
- {
- //
- // Handle OUT Pipes.
- //
- if(ui32EndpointType & EP_PIPE_TYPE_OUT)
- {
- //
- // A zero address indicates free.
- //
- if(g_sUSBHCD.psUSBOUTPipes[i32Idx].psDevice == 0)
- {
- //
- // Set up uDMA for the pipe.
- //
- if(ui32EndpointType & EP_PIPE_USE_UDMA)
- {
- //
- // Allocate a DMA channel to the endpoint.
- //
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui8DMAChannel =
- USBLibDMAChannelAllocate(g_sUSBHCD.psDMAInstance,
- IndexToUSBEP(i32Idx + 1),
- ui32Size,
- USB_DMA_EP_TX |
- USB_DMA_EP_HOST);
-
- //
- // If no DMA channel was available then just disable DMA
- // on this pipe.
- //
- if(g_sUSBHCD.psUSBOUTPipes[i32Idx].ui8DMAChannel == 0)
- {
- ui32EndpointType &= ~EP_PIPE_USE_UDMA;
- }
- }
-
- //
- // Save the endpoint type and device address and callback
- // function.
- //
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui32Type = ui32EndpointType;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].psDevice = psDevice;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].pfnCallback = pfnCallback;
-
- //
- // Clear out any pending status on this endpoint in case it
- // was in use before a allowing a new device class to use it.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(i32Idx + 1),
- USB_HOST_OUT_STATUS);
-
- //
- // Initialize the endpoint as idle.
- //
- g_sUSBHCD.psUSBOUTPipes[i32Idx].iState = ePipeIdle;
-
- //
- // Allocate space in the FIFO for this endpoint.
- //
- if(FIFOAlloc(&g_sUSBHCD.psUSBOUTPipes[i32Idx], ui32Size) != 0)
- {
- //
- // Configure the FIFO.
- //
- MAP_USBFIFOConfigSet(USB0_BASE,
- IndexToUSBEP(i32Idx + 1),
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui16FIFOAddr,
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui8FIFOSize,
- USB_EP_HOST_OUT);
- }
-
- //
- // Set the function address for this endpoint.
- //
- MAP_USBHostAddrSet(USB0_BASE, IndexToUSBEP(i32Idx + 1),
- psDevice->ui32Address, USB_EP_HOST_OUT);
-
- //
- // Set the hub and port address for the endpoint.
- //
- ui32HubAddr = psDevice->ui8Hub | (psDevice->ui8HubPort << 8);
- USBHostHubAddrSet(USB0_BASE, IndexToUSBEP(i32Idx + 1),
- ui32HubAddr, (USB_EP_HOST_OUT |
- (psDevice->bLowSpeed ?
- USB_EP_SPEED_LOW : USB_EP_SPEED_FULL)));
- break;
- }
- }
- //
- // Handle IN Pipes.
- //
- else if(ui32EndpointType & EP_PIPE_TYPE_IN)
- {
- //
- // A zero address indicates free.
- //
- if(g_sUSBHCD.psUSBINPipes[i32Idx].psDevice == 0)
- {
- //
- // Set up uDMA for the pipe.
- //
- if(ui32EndpointType & EP_PIPE_USE_UDMA)
- {
- //
- // Allocate a DMA channel to the endpoint.
- //
- g_sUSBHCD.psUSBINPipes[i32Idx].ui8DMAChannel =
- USBLibDMAChannelAllocate(g_sUSBHCD.psDMAInstance,
- IndexToUSBEP(i32Idx + 1),
- ui32Size,
- USB_DMA_EP_RX |
- USB_DMA_EP_HOST);
-
- //
- // If no DMA channel was available then just disable DMA
- // on this pipe.
- //
- if(g_sUSBHCD.psUSBINPipes[i32Idx].ui8DMAChannel == 0)
- {
- ui32EndpointType &= ~EP_PIPE_USE_UDMA;
- }
- }
-
- //
- // Save the endpoint type and device address and callback
- // function.
- //
- g_sUSBHCD.psUSBINPipes[i32Idx].ui32Type = ui32EndpointType;
- g_sUSBHCD.psUSBINPipes[i32Idx].psDevice = psDevice;
- g_sUSBHCD.psUSBINPipes[i32Idx].pfnCallback = pfnCallback;
-
- //
- // Clear out any pending status on this endpoint in case it
- // was in use before a allowing a new device class to use it.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(i32Idx + 1),
- USB_HOST_IN_STATUS);
-
- //
- // Allocate space in the FIFO for this endpoint.
- //
- if(FIFOAlloc(&g_sUSBHCD.psUSBINPipes[i32Idx], ui32Size) != 0)
- {
- //
- // Configure the FIFO.
- //
- MAP_USBFIFOConfigSet(USB0_BASE,
- IndexToUSBEP(i32Idx + 1),
- g_sUSBHCD.psUSBINPipes[i32Idx].ui16FIFOAddr,
- g_sUSBHCD.psUSBINPipes[i32Idx].ui8FIFOSize,
- USB_EP_HOST_IN);
- }
-
- //
- // Set the function address for this endpoint.
- //
- MAP_USBHostAddrSet(USB0_BASE, IndexToUSBEP(i32Idx + 1),
- psDevice->ui32Address, USB_EP_HOST_IN);
-
- //
- // Set the hub and port address for the endpoint.
- //
- ui32HubAddr = psDevice->ui8Hub | (psDevice->ui8HubPort << 8);
- USBHostHubAddrSet(USB0_BASE, IndexToUSBEP(i32Idx + 1),
- ui32HubAddr, (USB_EP_HOST_IN |
- (psDevice->bLowSpeed ?
- USB_EP_SPEED_LOW : USB_EP_SPEED_FULL)));
-
- //
- // Reset the state of the pipe to idle.
- //
- g_sUSBHCD.psUSBINPipes[i32Idx].iState = ePipeIdle;
-
- break;
- }
- }
- }
-
- //
- // Did not find a free pipe.
- //
- if(i32Idx == MAX_NUM_PIPES)
- {
- return(0);
- }
-
- //
- // Return the pipe index and type that was allocated.
- //
- return(ui32EndpointType | i32Idx);
-}
-
-//*****************************************************************************
-//
-//! This function is used to allocate a USB HCD pipe.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32EndpointType is the type of endpoint that this pipe will be
-//! communicating with.
-//! \param psDevice is the device instance associated with this endpoint.
-//! \param pfnCallback is the function that will be called when events occur on
-//! this USB Pipe.
-//!
-//! Since there are a limited number of USB HCD pipes that can be used in the
-//! host controller, this function is used to temporarily or permanently
-//! acquire one of the endpoints. It also provides a method to register a
-//! callback for status changes on this endpoint. If no callbacks are desired
-//! then the \e pfnCallback function should be set to 0. The callback should
-//! be used when using the USBHCDPipeSchedule() function so that the caller is
-//! notified when the action is complete.
-//!
-//! \return This function returns a value indicating which pipe was reserved.
-//! If the value is 0 then there were no pipes currently available. This value
-//! should be passed to any USBHCDPipe APIs to indicate which pipe is being
-//! accessed.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeAlloc(uint32_t ui32Index, uint32_t ui32EndpointType,
- tUSBHostDevice *psDevice, tHCDPipeCallback pfnCallback)
-{
- //
- // The old API allocated only 64 bytes to each endpoint.
- //
- return(USBHCDPipeAllocSize(ui32Index, ui32EndpointType, psDevice, 64,
- pfnCallback));
-}
-
-//*****************************************************************************
-//
-//! This function is used to configure a USB HCD pipe.
-//!
-//! This should be called after allocating a USB pipe with a call to
-//! USBHCDPipeAlloc(). It is used to set the configuration associated with an
-//! endpoint like the max payload and target endpoint. The \e ui32MaxPayload
-//! parameter is typically read directly from the devices endpoint descriptor
-//! and is expressed in bytes.
-//!
-//! Setting the \e ui32Interval parameter depends on the type of endpoint being
-//! configured. For endpoints that do not need to use the \e ui32Interval
-//! parameter \e ui32Interval should be set to 0. For Bulk \e ui32Interval is
-//! a value from 2-16 and will set the NAK timeout value as
-//! 2^(\e ui32Interval-1) frames. For interrupt endpoints \e ui32Interval is a
-//! value from 1-255 and is the count in frames between polling the endpoint.
-//! For isochronous endpoints \e ui32Interval ranges from 1-16 and is the
-//! polling interval in frames represented as 2^(\e ui32Interval-1) frames.
-//!
-//! \param ui32Pipe is the allocated endpoint to modify.
-//! \param ui32MaxPayload is maximum data that can be handled per transaction.
-//! \param ui32Interval is the polling interval for data transfers expressed in
-//! frames.
-//! \param ui32TargetEndpoint is the target endpoint on the device to
-//! communicate with.
-//!
-//! \return If the call was successful, this function returns zero any other
-//! value indicates an error.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeConfig(uint32_t ui32Pipe, uint32_t ui32MaxPayload,
- uint32_t ui32Interval, uint32_t ui32TargetEndpoint)
-{
- uint32_t ui32Flags;
- uint32_t ui32Index;
-
- //
- // Get the index number from the allocated pipe.
- //
- ui32Index = (ui32Pipe & EP_PIPE_IDX_M);
-
- //
- // Set the direction.
- //
- if(ui32Pipe & EP_PIPE_TYPE_OUT)
- {
- //
- // Set the mode for this endpoint.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32Type & EP_PIPE_TYPE_BULK)
- {
- ui32Flags = USB_EP_MODE_BULK;
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32Type &
- EP_PIPE_TYPE_INTR)
- {
- ui32Flags = USB_EP_MODE_INT;
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32Type &
- EP_PIPE_TYPE_ISOC)
- {
- ui32Flags = USB_EP_MODE_ISOC;
- }
- else
- {
- ui32Flags = USB_EP_MODE_CTRL;
- }
-
- ui32Flags |= USB_EP_HOST_OUT;
-
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8EPNumber =
- (uint8_t)ui32TargetEndpoint;
-
- //
- // Save the interval and the next tick to trigger a scheduler event.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32Interval = ui32Interval;
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32NextEventTick =
- ui32Interval + g_ui32CurrentTick;
-
- //
- // Set the device speed.
- //
- ui32Flags |= (g_sUSBHCD.psUSBOUTPipes[ui32Index].psDevice->bLowSpeed ?
- USB_EP_SPEED_LOW : USB_EP_SPEED_FULL);
- //
- // Set up the appropriate flags if uDMA is used.
- //
- if(ui32Pipe & EP_PIPE_USE_UDMA)
- {
- ui32Flags |= USB_EP_DMA_MODE_0 | USB_EP_AUTO_SET;
- }
- }
- else
- {
- //
- // Set the mode for this endpoint.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Index].ui32Type & EP_PIPE_TYPE_BULK)
- {
- ui32Flags = USB_EP_MODE_BULK;
- }
- else if(g_sUSBHCD.psUSBINPipes[ui32Index].ui32Type & EP_PIPE_TYPE_INTR)
- {
- ui32Flags = USB_EP_MODE_INT;
- }
- else if(g_sUSBHCD.psUSBINPipes[ui32Index].ui32Type & EP_PIPE_TYPE_ISOC)
- {
- ui32Flags = USB_EP_MODE_ISOC;
- }
- else
- {
- ui32Flags = USB_EP_MODE_CTRL;
- }
- ui32Flags |= USB_EP_HOST_IN;
-
- g_sUSBHCD.psUSBINPipes[ui32Index].ui8EPNumber =
- (uint8_t)ui32TargetEndpoint;
-
- //
- // Save the interval and the next tick to trigger a scheduler event.
- //
- g_sUSBHCD.psUSBINPipes[ui32Index].ui32Interval = ui32Interval;
- g_sUSBHCD.psUSBINPipes[ui32Index].ui32NextEventTick =
- ui32Interval + g_ui32CurrentTick;
-
- //
- // Set the device speed.
- //
- ui32Flags |= (g_sUSBHCD.psUSBINPipes[ui32Index].psDevice->bLowSpeed ?
- USB_EP_SPEED_LOW : USB_EP_SPEED_FULL);
- //
- // Set up the appropriate flags if uDMA is used.
- //
- if(ui32Pipe & EP_PIPE_USE_UDMA)
- {
- ui32Flags |= USB_EP_DMA_MODE_1 | USB_EP_AUTO_CLEAR |
- USB_EP_AUTO_REQUEST;
- }
- }
-
-
- //
- // Configure the endpoint according to the flags determined above.
- //
- USBHostEndpointConfig(USB0_BASE,
- IndexToUSBEP((ui32Pipe & EP_PIPE_IDX_M) + 1),
- ui32MaxPayload, ui32Interval, ui32TargetEndpoint,
- ui32Flags);
-
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to return the current status of a USB HCD pipe.
-//!
-//! This function will return the current status for a given USB pipe. If
-//! there is no status to report this call will simply return
-//! \b USBHCD_PIPE_NO_CHANGE.
-//!
-//! \param ui32Pipe is the USB pipe for this status request.
-//!
-//! \return This function returns the current status for the given endpoint.
-//! This will be one of the \b USBHCD_PIPE_* values.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeStatus(uint32_t ui32Pipe)
-{
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to write data to a USB HCD pipe.
-//!
-//! \param ui32Pipe is the USB pipe to put data into.
-//! \param pui8Data is a pointer to the data to send.
-//! \param ui32Size is the amount of data to send.
-//!
-//! This function will block until it has sent as much data as was
-//! requested using the USB pipe's FIFO. The caller should have registered a
-//! callback with the USBHCDPipeAlloc() call in order to be informed when the
-//! data has been transmitted. The value returned by this function can be less
-//! than the \e ui32Size requested if the USB pipe has less space available
-//! than this request is making.
-//!
-//! \return This function returns the number of bytes that were scheduled to
-//! be sent on the given USB pipe.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeWrite(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size)
-{
- uint32_t ui32Endpoint, ui32RemainingBytes, ui32ByteToSend, ui32PipeIdx;
- bool bUseDMA;
-
- //
- // Determine which endpoint interface that this pipe is using.
- //
- ui32Endpoint = IndexToUSBEP((EP_PIPE_IDX_M & ui32Pipe) + 1);
-
- //
- // Get index used for looking up pipe data
- //
- ui32PipeIdx = ui32Pipe & EP_PIPE_IDX_M;
-
- //
- // Set the total number of bytes to send out.
- //
- ui32RemainingBytes = ui32Size;
-
- //
- // Default to using DMA.
- //
- bUseDMA = false;
-
- //
- // Initialize the bytes to send to all of the remaining bytes.
- //
- ui32ByteToSend = ui32RemainingBytes;
-
- //
- // Send all of the requested data.
- //
- while(ui32RemainingBytes != 0)
- {
- //
- // If uDMA is not enabled for this pipe, or if the uDMA workaround
- // is applied, then don't use uDMA for this transfer.
- //
- if(ui32Pipe & EP_PIPE_USE_UDMA)
- {
- //
- // Disable the USB interrupt.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- //
- // Start the DMA transfer.
- //
- if(USBLibDMATransfer(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].ui8DMAChannel,
- pui8Data, ui32RemainingBytes) != 0)
- {
- if(ui32RemainingBytes < 64)
- {
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState =
- ePipeWriteDMASend;
- }
- else if((ui32RemainingBytes % 64) == 0)
- {
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState =
- ePipeWriteDMA;
- }
- else
- {
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState =
- ePipeWriteDMASend;
- }
-
- bUseDMA = true;
- }
-
- //
- // Enable the USB interrupt.
- //
- OS_INT_ENABLE(g_sUSBHCD.ui32IntNum);
- }
-
- if(bUseDMA == false)
- {
- //
- // Only send 64 bytes at a time if not using DMA.
- //
- if(ui32ByteToSend > 64)
- {
- ui32ByteToSend = 64;
- }
- else
- {
- //
- // Send the requested number of bytes.
- //
- ui32ByteToSend = ui32Size;
- }
-
- //
- // Start a write request.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState = ePipeWriting;
-
- //
- // Disable uDMA on the USB endpoint
- //
- MAP_USBEndpointDMADisable(USB0_BASE, ui32Endpoint,
- USB_EP_HOST_OUT);
-
- //
- // Put the data in the buffer.
- //
- MAP_USBEndpointDataPut(USB0_BASE, ui32Endpoint, pui8Data,
- ui32ByteToSend);
-
- //
- // Schedule the data to be sent.
- //
- MAP_USBEndpointDataSend(USB0_BASE, ui32Endpoint, USB_TRANS_OUT);
- }
-
- //
- // Wait for a status change.
- //
- while(1)
- {
- //
- // If an error event occurs then exit out of the loop.
- //
- if(g_sUSBHCD.ui32IntEvents & (INT_EVENT_DISCONNECT |
- INT_EVENT_VBUS_ERR |
- INT_EVENT_POWER_FAULT))
- {
- //
- // Set the pipe state to error.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState = ePipeError;
-
- //
- // Needs to be set to exit out of large while loop.
- //
- ui32RemainingBytes = 0;
-
- break;
- }
- //
- // If the data was successfully sent then decrement the count and
- // continue.
- //
- else if(g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState ==
- ePipeDataSent)
- {
- //
- // Decrement the remaining data and advance the pointer.
- //
- ui32RemainingBytes -= ui32ByteToSend;
- pui8Data += ui32ByteToSend;
-
- //
- // If there are less than 64 bytes to send then this is the
- // last of the data to go out.
- //
- if(ui32RemainingBytes < 64)
- {
- ui32ByteToSend = ui32RemainingBytes;
- }
- break;
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState ==
- ePipeStalled)
- {
- //
- // Zero out the size so that the caller knows that no data was
- // written.
- //
- ui32Size = 0;
-
- //
- // Needs to be set to exit out of large while loop.
- //
- ui32RemainingBytes = 0;
-
- //
- // If DMA is being used, then disable the channel.
- //
- if(bUseDMA == true)
- {
- //
- // Disable the DMA channel.
- //
- USBLibDMAChannelDisable(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].ui8DMAChannel);
- }
-
- //
- // This is the actual endpoint number.
- //
- USBHCDClearFeature(
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].psDevice->ui32Address,
- ui32Pipe, USB_FEATURE_EP_HALT);
-
- //
- // If there was a stall, then no more data is coming so break
- // out.
- //
- break;
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState == ePipeError)
- {
- //
- // An error occurred so stop this transaction and set the
- // number of bytes to zero.
- //
- ui32Size = 0;
-
- //
- // Needs to be set to exit out of large while loop.
- //
- ui32RemainingBytes = 0;
-
- break;
- }
- }
- }
-
- //
- // Go Idle once this state has been reached.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState = ePipeIdle;
-
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! This function is used to schedule and IN transaction on a USB HCD pipe.
-//!
-//! \param ui32Pipe is the USB pipe to read data from.
-//! \param pui8Data is a pointer to store the data that is received.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Data.
-//!
-//! This function will not block depending on the type of pipe passed in will
-//! schedule either a send of data to the device or a read of data from the
-//! device. In either case the amount of data will be limited to what will
-//! fit in the FIFO for a given endpoint.
-//!
-//! \return This function returns the number of bytes that were sent in the
-//! case of a transfer of data or it will return 0 for a request on a USB IN
-//! pipe.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeSchedule(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size)
-{
- uint32_t ui32Endpoint, ui32PipeIdx;
-
- //
- // Get index used for looking up pipe data
- //
- ui32PipeIdx = ui32Pipe & EP_PIPE_IDX_M;
-
- //
- // Determine which endpoint interface that this pipe is using.
- //
- ui32Endpoint = IndexToUSBEP((EP_PIPE_IDX_M & ui32Pipe) + 1);
-
- if(ui32Pipe & EP_PIPE_TYPE_OUT)
- {
- //
- // Check if uDMA is enabled on this pipe.
- //
- if(ui32Pipe & EP_PIPE_USE_UDMA)
- {
- //
- // Start a write request.
- //
- g_sUSBHCD.psUSBOUTPipes[EP_PIPE_IDX_M & ui32Pipe].iState =
- ePipeWriteDMASend;
-
- USBLibDMATransfer(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].ui8DMAChannel,
- pui8Data, ui32Size);
- }
- else
- {
- //
- // Start a write request.
- //
- g_sUSBHCD.psUSBOUTPipes[EP_PIPE_IDX_M & ui32Pipe].iState =
- ePipeWriting;
-
- //
- // Put the data in the buffer.
- //
- MAP_USBEndpointDataPut(USB0_BASE, ui32Endpoint, pui8Data,
- ui32Size);
-
- //
- // Schedule the data to be sent.
- //
- MAP_USBEndpointDataSend(USB0_BASE, ui32Endpoint, USB_TRANS_OUT);
- }
- }
- else
- {
- //
- // If uDMA is not enabled for this pipe, or if the uDMA workaround
- // is applied, then do not use uDMA for this transfer.
- //
- if((ui32Pipe & EP_PIPE_USE_UDMA) == 0)
- {
- //
- // Start a read request.
- //
- g_sUSBHCD.psUSBINPipes[EP_PIPE_IDX_M & ui32Pipe].iState =
- ePipeReading;
-
- //
- // Disable uDMA on the endpoint
- //
- MAP_USBEndpointDMADisable(USB0_BASE, ui32Endpoint, USB_EP_HOST_IN);
- }
- //
- // Otherwise, uDMA should be used for this transfer, so set up
- // the uDMA channel in advance of triggering the IN request.
- //
- else
- {
- g_sUSBHCD.psUSBINPipes[EP_PIPE_IDX_M & ui32Pipe].iState =
- ePipeReadDMA;
-
- USBLibDMATransfer(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui8DMAChannel,
- pui8Data, ui32Size);
- }
-
- //
- // Remember details of the buffer into which the data will be read.
- //
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].pui8ReadPtr = pui8Data;
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui32ReadSize = ui32Size;
-
- //
- // Trigger a request for data from the device.
- //
- MAP_USBHostRequestIN(USB0_BASE, ui32Endpoint);
-
- //
- // No data was put into or read from the buffer.
- //
- ui32Size = 0;
- }
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! This function is used to read data from a USB HCD pipe.
-//!
-//! \param ui32Pipe is the USB pipe to read data from.
-//! \param pui8Data is a pointer to store the data that is received.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Data.
-//!
-//! This function will not block and will only read as much data as requested
-//! or as much data is currently available from the USB pipe. The caller
-//! should have registered a callback with the USBHCDPipeAlloc() call in order
-//! to be informed when the data has been received. The value returned by this
-//! function can be less than the \e ui32Size requested if the USB pipe has
-//! less data available than was requested.
-//!
-//! \return This function returns the number of bytes that were returned in the
-//! \e pui8Data buffer.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeReadNonBlocking(uint32_t ui32Pipe, uint8_t *pui8Data,
- uint32_t ui32Size)
-{
- uint32_t ui32Endpoint;
-
- //
- // Determine which endpoint interface that this pipe is using.
- //
- ui32Endpoint = IndexToUSBEP((EP_PIPE_IDX_M & ui32Pipe) + 1);
-
- //
- // Read the data out of the USB endpoint interface.
- //
- MAP_USBEndpointDataGet(USB0_BASE, ui32Endpoint, pui8Data, &ui32Size);
-
- //
- // Acknowledge that the data was read from the endpoint.
- //
- MAP_USBHostEndpointDataAck(USB0_BASE, ui32Endpoint);
-
- //
- // Go Idle once this state has been reached.
- //
- g_sUSBHCD.psUSBINPipes[EP_PIPE_IDX_M & ui32Pipe].iState = ePipeIdle;
-
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! This function acknowledges data received via an interrupt IN pipe.
-//!
-//! \param ui32Pipe is the USB INT pipe whose last packet is to be
-//! acknowledged.
-//!
-//! This function is used to acknowledge reception of data on an interrupt IN
-//! pipe. A transfer on an interrupt IN endpoint is scheduled via a call to
-//! USBHCDPipeSchedule() and the application is notified when data is received
-//! using a USB_EVENT_RX_AVAILABLE event. In the handler for this event, the
-//! application must call USBHCDPipeDataAck() to have the USB controller ACK
-//! the data from the device and complete the transaction.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDPipeDataAck(uint32_t ui32Pipe)
-{
- uint32_t ui32Endpoint;
-
- //
- // Determine which endpoint interface that this pipe is using.
- //
- ui32Endpoint = IndexToUSBEP((EP_PIPE_IDX_M & ui32Pipe) + 1);
-
- //
- // Acknowledge that the data was read from the endpoint.
- //
- USBHostEndpointDataAck(USB0_BASE, ui32Endpoint);
-
- //
- // Go Idle once this state has been reached.
- //
- g_sUSBHCD.psUSBINPipes[EP_PIPE_IDX_M & ui32Pipe].iState = ePipeIdle;
-}
-
-//*****************************************************************************
-//
-//! This function is used to read data from a USB HCD pipe.
-//!
-//! \param ui32Pipe is the USB pipe to read data from.
-//! \param pui8Data is a pointer to store the data that is received.
-//! \param ui32Size is the size in bytes of the buffer pointed to by
-//! \e pui8Data.
-//!
-//! This function will block and will only return when it has read as much data
-//! as requested from the USB pipe. The caller must register a callback with
-//! the USBHCDPipeAlloc() call in order to be informed when the data has been
-//! received. If the caller provides a non-zero pointer in the \e pui8Data
-//! parameter then the data is copied into the buffer before the callback
-//! occurs. If the caller provides a zero in \e pui8Data parameter
-//! then the caller is responsible for reading the data out of the FIFO when
-//! the \b USB_EVENT_RX_AVAILABLE callback event occurs. The value returned
-//! by this function can be less than the \e ui32Size requested if the USB pipe
-//! has less data available than was requested.
-//!
-//! \return This function returns the number of bytes that were returned in the
-//! \e pui8Data buffer.
-//
-//*****************************************************************************
-uint32_t
-USBHCDPipeRead(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size)
-{
- uint32_t ui32Endpoint, ui32RemainingBytes, ui32BytesRead, ui32PipeIdx;
- bool bUseDMA;
-
- //
- // Get index used for looking up pipe data
- //
- ui32PipeIdx = ui32Pipe & EP_PIPE_IDX_M;
-
- //
- // Initialized the number of bytes read.
- //
- ui32BytesRead = 0;
-
- //
- // Determine which endpoint interface that this pipe is using.
- //
- ui32Endpoint = IndexToUSBEP(ui32PipeIdx + 1);
-
- //
- // Set the remaining bytes to received.
- //
- ui32RemainingBytes = ui32Size;
-
- //
- // Default to using DMA.
- //
- bUseDMA = true;
-
- //
- // Continue until all data requested has been received.
- //
- while(ui32RemainingBytes != 0)
- {
- //
- // Start a read request.
- //
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState = ePipeReading;
-
- //
- // Try the DMA transfer should be used for this transfer, so set up
- // the uDMA channel in advance of triggering the IN request.
- //
- if(ui32Pipe & EP_PIPE_USE_UDMA)
- {
- //
- // Disable the USB interrupt.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- if(USBLibDMATransfer(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui8DMAChannel,
- pui8Data, ui32Size) != 0)
- {
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState = ePipeReadDMA;
-
- ui32BytesRead = ui32Size;
- }
- else
- {
- bUseDMA = false;
- }
-
- //
- // Disable the USB interrupt.
- //
- OS_INT_ENABLE(g_sUSBHCD.ui32IntNum);
- }
-
- //
- // If unable to use DMA then get ready to transfer without DMA.
- //
- if(bUseDMA == false)
- {
- //
- // Disable uDMA on the endpoint
- //
- MAP_USBEndpointDMADisable(USB0_BASE, ui32Endpoint, USB_EP_HOST_IN);
-
- //
- // Set up for the next transaction.
- //
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].pui8ReadPtr = pui8Data;
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui32ReadSize =
- (ui32RemainingBytes < 64) ? ui32RemainingBytes : 64;
- }
-
- //
- // Trigger a request for data from the device.
- //
- MAP_USBHostRequestIN(USB0_BASE, ui32Endpoint);
-
- //
- // Wait for a status change.
- //
- while(1)
- {
- //
- // Check if the device stalled the request.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState == ePipeStalled)
- {
- //
- // Zero out the size so that the caller knows that no data was
- // read.
- //
- ui32Size = 0;
-
- //
- // There are also no remaining bytes to read.
- //
- ui32RemainingBytes = 0;
-
- //
- // If DMA is being used, then disable the channel.
- //
- if(bUseDMA == true)
- {
- USBLibDMAChannelDisable(
- g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui8DMAChannel);
- }
-
- //
- // This is the actual endpoint number.
- //
- USBHCDClearFeature(
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].psDevice->ui32Address,
- ui32Pipe, USB_FEATURE_EP_HALT);
-
- //
- // If there was a stall, then no more data is coming so break
- // out.
- //
- break;
- }
-
- //
- // If any error event occurs then exit out of the loop.
- //
- if(g_sUSBHCD.ui32IntEvents & (INT_EVENT_DISCONNECT |
- INT_EVENT_VBUS_ERR |
- INT_EVENT_POWER_FAULT))
- {
- //
- // Set the pipe state to error.
- //
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState = ePipeError;
- break;
- }
-
- //
- // If data is ready then return it.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState == ePipeDataReady)
- {
- //
- // If not using DMA then read the data from the USB. Otherwise
- // the data will already be in the buffer.
- //
- if(bUseDMA == false)
- {
- //
- // Compute bytes to transfer and set up transfer
- //
- ui32BytesRead =
- ui32RemainingBytes > 64 ? 64 : ui32RemainingBytes;
-
- //
- // Acknowledge that the data was read from the endpoint.
- //
- MAP_USBHostEndpointDataAck(USB0_BASE, ui32Endpoint);
- }
-
- //
- // Subtract the number of bytes read from the bytes remaining.
- //
- ui32RemainingBytes -= ui32BytesRead;
-
- //
- // If there were less than 64 bytes read, then this was a short
- // packet and no more data will be returned.
- //
- if(ui32BytesRead < 64)
- {
- //
- // Subtract off the bytes that were not received and exit
- // the loop.
- //
- ui32Size = ui32Size - ui32RemainingBytes;
- break;
- }
- else
- {
- //
- // Move the buffer ahead to receive more data into the
- // buffer.
- //
- pui8Data += 64;
- }
- break;
- }
- else if(g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState == ePipeError)
- {
- //
- // An error occurred so stop this transaction and set the
- // number of bytes to zero.
- //
- ui32Size = 0;
- ui32RemainingBytes = 0;
-
- break;
- }
- else if((g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState ==
- ePipeReadDMAWait) &&
- (USBLibDMAChannelStatus(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].ui8DMAChannel) &
- USBLIBSTATUS_DMA_COMPLETE))
- {
- break;
- }
- }
- }
-
- //
- // Go Idle once this state has been reached.
- //
- g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState = ePipeIdle;
-
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-//! This function is used to release a USB pipe.
-//!
-//! \param ui32Pipe is the allocated USB pipe to release.
-//!
-//! This function is used to release a USB pipe that was allocated by a call to
-//! USBHCDPipeAlloc() for use by some other device endpoint in the system.
-//! Freeing an unallocated or invalid pipe will not generate an error and will
-//! instead simply return.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDPipeFree(uint32_t ui32Pipe)
-{
- uint32_t ui32Index;
-
- //
- // Get the index number from the allocated pipe.
- //
- ui32Index = (ui32Pipe & EP_PIPE_IDX_M);
-
- if(ui32Pipe & EP_PIPE_TYPE_OUT)
- {
- //
- // Clear the address and type for this endpoint to free it up.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Index].psDevice = 0;
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui32Type = 0;
- g_sUSBHCD.psUSBOUTPipes[ui32Index].pfnCallback = 0;
-
- //
- // Check if this pipe has allocated a DMA channel.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8DMAChannel !=
- USBHCD_DMA_UNUSED)
- {
- //
- // Release the DMA channel associated with this endpoint.
- //
- USBLibDMAChannelRelease(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8DMAChannel);
-
- //
- // Clear out the current channel in use by this pipe.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8DMAChannel =
- USBHCD_DMA_UNUSED;
- }
-
- //
- // Free up the FIFO memory used by this endpoint.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8FIFOSize)
- {
- FIFOFree(&g_sUSBHCD.psUSBOUTPipes[ui32Index]);
- }
-
- //
- // Set the function address for this endpoint back to zero.
- //
- USBHostAddrSet(USB0_BASE, IndexToUSBEP(ui32Index + 1),
- 0, USB_EP_HOST_OUT);
-
- //
- // Set the hub and port address for the endpoint back to zero and the
- // speed back to LOW.
- //
- USBHostHubAddrSet(USB0_BASE, IndexToUSBEP(ui32Index + 1),
- 0, (USB_EP_HOST_OUT | USB_EP_SPEED_LOW));
- }
- else if(ui32Pipe & EP_PIPE_TYPE_IN)
- {
- //
- // Clear the address and type for this endpoint to free it up.
- //
- g_sUSBHCD.psUSBINPipes[ui32Index].psDevice = 0;
- g_sUSBHCD.psUSBINPipes[ui32Index].ui32Type = 0;
- g_sUSBHCD.psUSBINPipes[ui32Index].pfnCallback = 0;
-
- //
- // Check if this pipe has allocated a DMA channel.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Index].ui8DMAChannel !=
- USBHCD_DMA_UNUSED)
- {
- //
- // Release the DMA channel associated with this endpoint.
- //
- USBLibDMAChannelRelease(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32Index].ui8DMAChannel);
-
- //
- // Clear out the current channel in use by this pipe.
- //
- g_sUSBHCD.psUSBINPipes[ui32Index].ui8DMAChannel =
- USBHCD_DMA_UNUSED;
- }
-
- //
- // Free up the FIFO memory used by this endpoint.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Pipe & EP_PIPE_IDX_M].ui8FIFOSize)
- {
- FIFOFree(&g_sUSBHCD.psUSBINPipes[ui32Pipe & EP_PIPE_IDX_M]);
- }
-
- //
- // Set the function address for this endpoint back to zero.
- //
- USBHostAddrSet(USB0_BASE, IndexToUSBEP(ui32Index + 1),
- 0, USB_EP_HOST_IN);
-
- //
- // Set the hub and port address for the endpoint back to zero and the
- // speed back to LOW.
- //
- USBHostHubAddrSet(USB0_BASE, IndexToUSBEP(ui32Index + 1),
- 0, (USB_EP_HOST_IN | USB_EP_SPEED_LOW));
-
- //
- // Clear any pending IN transactions.
- //
- USBHostRequestINClear(USB0_BASE, IndexToUSBEP(ui32Index + 1));
- }
-}
-
-//*****************************************************************************
-//
-// This internal function initializes the HCD code.
-//
-// \param ui32Index specifies which USB controller to use.
-// \param pvPool is a pointer to the data to use as a memory pool for this
-// controller.
-// \param ui32PoolSize is the size in bytes of the buffer passed in as pvPool.
-//
-// This function will perform all the necessary operations to allow the USB
-// host controller to begin enumeration and communication with a device. This
-// function should typically be called once at the start of an application
-// before any other calls are made to the host controller.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBHCDInitInternal(uint32_t ui32Index, void *pvPool, uint32_t ui32PoolSize)
-{
- int32_t i32Idx;
-
- ASSERT(ui32Index == 0);
-
- //
- // Get the number of endpoints supported by this device.
- //
- g_sUSBHCD.ui32NumEndpoints = USBNumEndpointsGet(USB0_BASE);
-
- //
- // The first 64 Bytes are allocated to endpoint 0.
- //
- g_pui32Alloc[0] = 1;
- g_pui32Alloc[1] = 0;
-
- //
- // Save the base address for this controller.
- //
- g_sUSBHCD.ui32USBBase = USB0_BASE;
-
- //
- // Save the USB interrupt number.
- //
- g_sUSBHCD.ui32IntNum = INT_USB0_BLIZZARD;
-
- //
- // All Pipes are unused at start.
- //
- for(i32Idx = 0; i32Idx < MAX_NUM_PIPES; i32Idx++)
- {
- g_sUSBHCD.psUSBINPipes[i32Idx].psDevice = 0;
- g_sUSBHCD.psUSBINPipes[i32Idx].ui32Type = USBHCD_PIPE_UNUSED;
- g_sUSBHCD.psUSBINPipes[i32Idx].ui8DMAChannel = USBHCD_DMA_UNUSED;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].psDevice = 0;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui32Type = USBHCD_PIPE_UNUSED;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui8DMAChannel = USBHCD_DMA_UNUSED;
- }
-
- //
- // Make sure that the hub driver is initialized since it is called even
- // if it is not present in the system.
- //
- USBHHubInit();
-
- //
- // Initialize the DMA interface.
- //
- g_sUSBHCD.psDMAInstance = USBLibDMAInit(g_sUSBHCD.ui32USBBase);
-
- //
- // Initialized the device structures.
- //
- for(i32Idx = 0; i32Idx <= MAX_USB_DEVICES; i32Idx++)
- {
- //
- // Clear the configuration descriptor and state.
- //
- g_sUSBHCD.piDeviceState[i32Idx] = eHCDIdle;
- g_sUSBHCD.psUSBDevice[i32Idx].psConfigDescriptor = 0;
- g_sUSBHCD.psUSBDevice[i32Idx].bConfigRead = false;
-
- //
- // Initialize the device descriptor.
- //
- g_sUSBHCD.psUSBDevice[i32Idx].sDeviceDescriptor.bLength = 0;
- g_sUSBHCD.psUSBDevice[i32Idx].sDeviceDescriptor.bMaxPacketSize0 = 0;
-
- //
- // Initialize the device address.
- //
- g_sUSBHCD.psUSBDevice[i32Idx].ui32Address = 0;
-
- //
- // Set the current interface to 0.
- //
- g_sUSBHCD.psUSBDevice[i32Idx].ui32Interface = 0;
-
- //
- // Clear the active driver for the device.
- //
- g_pi32USBHActiveDriver[i32Idx] = -1;
-
- //
- // Initialize the device flags.
- //
- g_sUSBHCD.psUSBDevice[i32Idx].ui32Flags = 0;
- }
-
- //
- // Allocate the memory needed for reading descriptors.
- //
- g_sUSBHCD.pvPool = pvPool;
- g_sUSBHCD.ui32PoolSize = ui32PoolSize;
-
- //
- // Initialize the device class.
- //
- g_sUSBHCD.ui32Class = USB_CLASS_EVENTS;
-
- //
- // Default enable connect, disconnect, unknown device and power fault
- // event notifications.
- //
- g_sUSBHCD.ui32EventEnables = USBHCD_EVFLAG_CONNECT |
- USBHCD_EVFLAG_UNKCNCT |
- USBHCD_EVFLAG_DISCNCT |
- USBHCD_EVFLAG_PWRFAULT |
- USBHCD_EVFLAG_PWREN |
- USBHCD_EVFLAG_PWRDIS;
-
- //
- // Initialize the USB tick module.
- //
- InternalUSBTickInit();
-
- //
- // Only do hardware update if the stack is in Host mode, do not touch the
- // hardware for OTG mode operation.
- //
- if((g_iUSBMode == eUSBModeHost) || (g_iUSBMode == eUSBModeForceHost))
- {
- //
- // Configure the End point 0.
- //
- USBHostEndpointConfig(USB0_BASE, USB_EP_0, 64, 0, 0,
- (USB_EP_MODE_CTRL | USB_EP_SPEED_FULL |
- USB_EP_HOST_OUT));
-
- //
- // Enable USB Interrupts.
- //
- MAP_USBIntEnableControl(USB0_BASE, USB_INTCTRL_RESET |
- USB_INTCTRL_DISCONNECT |
- USB_INTCTRL_SOF |
- USB_INTCTRL_SESSION |
- USB_INTCTRL_BABBLE |
- USB_INTCTRL_CONNECT |
- USB_INTCTRL_RESUME |
- USB_INTCTRL_SUSPEND |
- USB_INTCTRL_VBUS_ERR |
- USB_INTCTRL_MODE_DETECT |
- USB_INTCTRL_POWER_FAULT);
-
- MAP_USBIntEnableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Enable the USB interrupt.
- //
- OS_INT_ENABLE(g_sUSBHCD.ui32IntNum);
-
- //
- // There is no automatic power in pure host mode.
- //
- USBHCDPowerConfigSet(ui32Index, (g_ui32PowerConfig &
- ~USB_HOST_PWREN_AUTO));
-
- //
- // Force the power on as well as this point.
- //
- MAP_USBHostPwrEnable(USB0_BASE);
-
- //
- // This is required to get into host mode on some parts.
- //
- USBOTGSessionRequest(USB0_BASE, true);
- }
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the power pin and power fault configuration.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32PwrConfig is the power configuration to use for the application.
-//!
-//! This function must be called before HCDInit() is called so that the power
-//! pin configuration can be set before power is enabled. The \e ui32PwrConfig
-//! flags specify the power fault level sensitivity, the power fault action,
-//! and the power enable pin level and source.
-//!
-//! One of the following can be selected as the power fault level sensitivity:
-//!
-//! - \b USBHCD_FAULT_LOW - An external power fault is indicated by the pin
-//! being driven low.
-//! - \b USBHCD_FAULT_HIGH - An external power fault is indicated by the pin
-//! being driven high.
-//!
-//! One of the following can be selected as the power fault action:
-//!
-//! - \b USBHCD_FAULT_VBUS_NONE - No automatic action when power fault
-//! detected.
-//! - \b USBHCD_FAULT_VBUS_TRI - Automatically Tri-state the USBnEPEN pin on a
-//! power fault.
-//! - \b USBHCD_FAULT_VBUS_DIS - Automatically drive the USBnEPEN pin to it's
-//! inactive state on a power fault.
-//!
-//! One of the following can be selected as the power enable level and source:
-//!
-//! - \b USBHCD_VBUS_MANUAL - Power control is completely managed by the
-//! application, the USB library will provide a
-//! power callback to request power state changes.
-//! - \b USBHCD_VBUS_AUTO_LOW - USBEPEN is driven low by the USB controller
-//! automatically if USBOTGSessionRequest() has
-//! enabled a session.
-//! - \b USBHCD_VBUS_AUTO_HIGH - USBEPEN is driven high by the USB controller
-//! automatically if USBOTGSessionRequest() has
-//! enabled a session.
-//!
-//! If USBHCD_VBUS_MANUAL is used then the application must provide an
-//! event driver to receive the USB_EVENT_POWER_ENABLE and
-//! USB_EVENT_POWER_DISABLE events and enable and disable power to VBUS when
-//! requested by the USB library. The application should respond to a power
-//! control callback by enabling or disabling VBUS as soon as possible and
-//! before returning from the callback function.
-//!
-//! \note The following values should no longer be used with the USB
-//! library: \b USB_HOST_PWRFLT_LOW, \b USB_HOST_PWRFLT_HIGH,
-//! \b USB_HOST_PWRFLT_EP_NONE, \b USB_HOST_PWRFLT_EP_TRI,
-//! \b USB_HOST_PWRFLT_EP_LOW, \b USB_HOST_PWRFLT_EP_HIGH,
-//! \b USB_HOST_PWREN_LOW, \b USB_HOST_PWREN_HIGH, \b USB_HOST_PWREN_VBLOW, and
-//! \b USB_HOST_PWREN_VBHIGH.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDPowerConfigInit(uint32_t ui32Index, uint32_t ui32PwrConfig)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Save the value as it will be used later.
- //
- g_ui32PowerConfig = ui32PwrConfig;
-}
-
-//*****************************************************************************
-//
-//! This function is used to get the power pin and power fault configuration.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//!
-//! This function will return the current power control pin configuration as
-//! set by the USBHCDPowerConfigInit() function or the defaults if not yet set.
-//! See the USBHCDPowerConfigInit() documentation for the meaning of the bits
-//! that are returned by this function.
-//!
-//! \return The configuration of the power control pins.
-//!
-//*****************************************************************************
-uint32_t
-USBHCDPowerConfigGet(uint32_t ui32Index)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Save the value as it will be used later.
- //
- return(g_ui32PowerConfig);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the power pin and power fault configuration.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32Config specifies which USB power configuration to use.
-//!
-//! This function will set the current power control pin configuration as
-//! set by the USBHCDPowerConfigInit() function or the defaults if not yet set.
-//! See the USBHCDPowerConfigInit() documentation for the meaning of the bits
-//! that are set by this function.
-//!
-//! \return Returns zero to indicate the power setting is now active.
-//!
-//*****************************************************************************
-uint32_t
-USBHCDPowerConfigSet(uint32_t ui32Index, uint32_t ui32Config)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Remember the current setting.
- //
- g_ui32PowerConfig = ui32Config;
-
- //
- // Clear out the two flag bits.
- //
- ui32Config = g_ui32PowerConfig & ~(USBHCD_VBUS_MANUAL |
- USBHCD_FAULT_VBUS_DIS);
-
- //
- // If there is an automatic disable power action specified then set the
- // polarity of the signal to match EPEN.
- //
- if(g_ui32PowerConfig & USBHCD_FAULT_VBUS_DIS)
- {
- //
- // Insure that the assumption below is true.
- //
- ASSERT((USBHCD_VBUS_AUTO_HIGH & 1) == 1);
- ASSERT((USBHCD_VBUS_AUTO_LOW & 1) == 0);
-
- //
- // This is taking advantage of the difference between
- // USBHCD_VBUS_AUTO_LOW and USBHCD_VBUS_AUTO_HIGH being that bit
- // one is set when EPEN is active high.
- //
- if(g_ui32PowerConfig & 1)
- {
- g_ui32PowerConfig |= USB_HOST_PWRFLT_EP_LOW;
- ui32Config |= USB_HOST_PWRFLT_EP_LOW;
- }
- else
- {
- g_ui32PowerConfig |= USB_HOST_PWRFLT_EP_HIGH;
- ui32Config |= USB_HOST_PWRFLT_EP_HIGH;
- }
- }
-
- //
- // Initialize the power configuration.
- //
- MAP_USBHostPwrConfig(USB0_BASE, ui32Config);
-
- //
- // If not in manual mode then just turn on power.
- //
- if((g_ui32PowerConfig & USBHCD_VBUS_MANUAL) == 0)
- {
- //
- // Power the USB bus.
- //
- MAP_USBHostPwrEnable(USB0_BASE);
- }
-
- //
- // Return success.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function returns if the current power settings will automatically
-//! handle enabling and disabling VBUS power.
-//!
-//! \param ui32Index specifies which USB controller to query.
-//!
-//! This function returns if the current power control pin configuration will
-//! automatically apply power or whether it will be left to the application
-//! to turn on power when it is notified.
-//!
-//! \return A non-zero value indicates that power is automatically applied and
-//! a value of zero indicates that the application must manually apply power.
-//!
-//*****************************************************************************
-uint32_t
-USBHCDPowerAutomatic(uint32_t ui32Index)
-{
- //
- // Check if the controller is automatically applying power or not.
- //
- if(g_ui32PowerConfig & USBHCD_VBUS_MANUAL)
- {
- return(0);
- }
- return(1);
-}
-
-//*****************************************************************************
-//
-//! This function is used to initialize the HCD code.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param pvPool is a pointer to the data to use as a memory pool for this
-//! controller.
-//! \param ui32PoolSize is the size in bytes of the buffer passed in as
-//! \e pvPool.
-//!
-//! This function will perform all the necessary operations to allow the USB
-//! host controller to begin enumeration and communication with devices. This
-//! function should typically be called once at the start of an application
-//! once all of the device and class drivers are ready for normal operation.
-//! This call will start up the USB host controller and any connected device
-//! will immediately start the enumeration sequence.
-//!
-//! The USBStackModeSet() function can be called with eUSBModeHost in order to
-//! cause the USB library to force the USB operating mode to a host controller.
-//! This allows the application to used the USBVBUS and USBID pins as GPIOs on
-//! devices that support forcing OTG to operate as a host only controller. By
-//! default the USB library will assume that the USBVBUS and USBID pins are
-//! configured as USB pins and not GPIOs.
-//!
-//! The memory pool passed to this function must be at least as large as a
-//! typical configuration descriptor for devices that are to be supported.
-//! This value is application-dependent however it should never be less than 32
-//! bytes and, in most cases, should be at least 64 bytes. If there is not
-//! sufficient memory to load a configuration descriptor from a device, the
-//! device will not be recognized by the USB library's host controller driver.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDInit(uint32_t ui32Index, void *pvPool, uint32_t ui32PoolSize)
-{
- int32_t i32Driver;
-
- //
- // Check the arguments.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Make sure there is at least enough to read the configuration descriptor.
- //
- ASSERT(ui32PoolSize >= sizeof(tConfigDescriptor));
-
- //
- // Should not call this if the stack is in device mode.
- //
- ASSERT(g_iUSBMode != eUSBModeDevice);
- ASSERT(g_iUSBMode != eUSBModeForceDevice);
-
- //
- // If the mode was not set then default to eUSBModeHost.
- //
- if(g_iUSBMode == eUSBModeNone)
- {
- g_iUSBMode = eUSBModeHost;
- }
-
- //
- // Reset the USB controller.
- //
- MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);
-
- //
- // Enable Clocking to the USB controller.
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
-
- //
- // Turn on USB Phy clock.
- //
- MAP_SysCtlUSBPLLEnable();
-
- //
- // If the application not requesting OTG mode then set the mode to forced
- // host mode. If the mode is actually eUSBModeHost, this will be switched
- // off when ID pin detection is complete and the ID is no longer in use.
- //
- if(g_iUSBMode != eUSBModeOTG)
- {
- //
- // Force Host mode on devices that support force host mode.
- //
- MAP_USBHostMode(USB0_BASE);
- }
-
- //
- // Call our internal function to perform the initialization.
- //
- USBHCDInitInternal(ui32Index, pvPool, ui32PoolSize);
-
- //
- // No event driver is present by default.
- //
- g_sUSBHCD.i32EventDriver = -1;
-
- //
- // Search through the Host Class driver list for the devices class.
- //
- for(i32Driver = 0; i32Driver < g_sUSBHCD.ui32NumClassDrivers; i32Driver++)
- {
- if(g_sUSBHCD.ppsClassDrivers[i32Driver]->ui32InterfaceClass ==
- USB_CLASS_EVENTS)
- {
- //
- // Event driver was found so remember it.
- //
- g_sUSBHCD.i32EventDriver = i32Driver;
- }
- }
-
- //
- // Get the number of ticks per millisecond, this is only used by blocking
- // delays using the SysCtlDelay() function.
- //
- g_ui32Tickms = MAP_SysCtlClockGet() / 3000;
-}
-
-//*****************************************************************************
-//
-//! This function is used to initialize the HCD class driver list.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ppsHClassDrvs is an array of host class drivers that are
-//! supported on this controller.
-//! \param ui32NumDrivers is the number of entries in the \e pHostClassDrivers
-//! array.
-//!
-//! This function will set the host classes supported by the host controller
-//! specified by the \e ui32Index parameter. This function should be called
-//! before enabling the host controller driver with the USBHCDInit() function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDRegisterDrivers(uint32_t ui32Index,
- const tUSBHostClassDriver * const *ppsHClassDrvs,
- uint32_t ui32NumDrivers)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Save the class drivers.
- //
- g_sUSBHCD.ppsClassDrivers = ppsHClassDrvs;
-
- //
- // Save the number of class drivers.
- //
- g_sUSBHCD.ui32NumClassDrivers = ui32NumDrivers;
-}
-
-//*****************************************************************************
-//
-//! This function is used to terminate the HCD code.
-//!
-//! \param ui32Index specifies which USB controller to release.
-//!
-//! This function will clean up the USB host controller and disable it in
-//! preparation for shutdown or a switch to USB device mode. Once this call is
-//! made, \e USBHCDInit() may be called to reinitialize the controller and
-//! prepare for host mode operation.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDTerm(uint32_t ui32Index)
-{
- int32_t i32Idx;
-
- ASSERT(ui32Index == 0);
-
- //
- // End the session.
- //
- USBOTGSessionRequest(USB0_BASE, false);
-
- //
- // Remove power from the USB bus.
- //
- MAP_USBHostPwrDisable(USB0_BASE);
-
- //
- // Disable USB interrupts.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- MAP_USBIntDisableControl(USB0_BASE, USB_INTCTRL_ALL);
-
- MAP_USBIntDisableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Set the host controller state back to it's initial values.
- //
- for(i32Idx = 0; i32Idx < MAX_NUM_PIPES; i32Idx++)
- {
- g_sUSBHCD.psUSBINPipes[i32Idx].ui32Type = USBHCD_PIPE_UNUSED;
- g_sUSBHCD.psUSBOUTPipes[i32Idx].ui32Type = USBHCD_PIPE_UNUSED;
- }
-
- //
- // Free the memory used by the configuration descriptor.
- //
- ConfigDescFree(&g_sUSBHCD.psUSBDevice[0]);
-
- g_sUSBHCD.piDeviceState[0] = eHCDIdle;
- g_sUSBHCD.psUSBDevice[0].psConfigDescriptor = 0;
- g_sUSBHCD.psUSBDevice[0].bConfigRead = false;
- g_sUSBHCD.psUSBDevice[0].sDeviceDescriptor.bLength = 0;
- g_sUSBHCD.psUSBDevice[0].sDeviceDescriptor.bMaxPacketSize0 = 0;
- g_sUSBHCD.psUSBDevice[0].ui32Address = 0;
- g_sUSBHCD.psUSBDevice[0].ui32Interface = 0;
- g_sUSBHCD.pvPool = 0;
- g_sUSBHCD.ui32PoolSize = 0;
-}
-
-//*****************************************************************************
-//
-//! This function generates reset signaling on the USB bus.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//!
-//! This function handles sending out reset signaling on the USB bus. After
-//! returning from this function, any attached device on the USB bus should
-//! have returned to it's reset state.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDReset(uint32_t ui32Index)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Start the reset signaling.
- //
- MAP_USBHostReset(USB0_BASE, 1);
-
- //
- // Wait 20ms
- //
- OS_DELAY(g_ui32Tickms * 20);
-
- //
- // End reset signaling on the bus.
- //
- MAP_USBHostReset(USB0_BASE, 0);
-
- //
- // Need to wait at least 10ms to let the device recover from
- // the reset. This is the delay specified in the USB 2.0 spec.
- // We will hold the reset for 20ms.
- //
- OS_DELAY(g_ui32Tickms * 20);
-}
-
-//*****************************************************************************
-//
-//! This function will generate suspend signaling on the USB bus.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//!
-//! This function is used to generate suspend signaling on the USB bus. In
-//! order to leave the suspended state, the application should call
-//! USBHCDResume().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDSuspend(uint32_t ui32Index)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Start the suspend signaling.
- //
- MAP_USBHostSuspend(USB0_BASE);
-}
-
-//*****************************************************************************
-//
-//! This function will generate resume signaling on the USB bus.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//!
-//! This function is used to generate resume signaling on the USB bus in order
-//! to cause USB devices to leave their suspended state. This call should
-//! not be made unless a preceding call to USBHCDSuspend() has been made.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDResume(uint32_t ui32Index)
-{
- ASSERT(ui32Index == 0);
-
- //
- // Start the resume signaling.
- //
- MAP_USBHostResume(USB0_BASE, 1);
-
- //
- // Wait 100ms
- //
- OS_DELAY(g_ui32Tickms * 100);
-
- //
- // End reset signaling on the bus.
- //
- MAP_USBHostResume(USB0_BASE, 0);
-}
-
-//*****************************************************************************
-//
-//! This function issues a request for the current configuration descriptor
-//! from a device.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param psDevice is a pointer to the device structure that holds the buffer
-//! to store the configuration descriptor.
-//!
-//! This function will request the configuration descriptor from the device.
-//! The \e psDevice->ConfigDescriptor member variable is used to hold the data
-//! for this request. This buffer will be allocated from the pool provided by
-//! the HCDInit() function. \e psDevice->sDeviceDescriptor.bMaxPacketSize0
-//! should be valid prior to this call in order to correctly receive the
-//! configuration descriptor. If this variable is not valid then this call
-//! will not return accurate data.
-//!
-//! \return The number of bytes returned due to the request. This value can be
-//! zero if the device did not respond.
-//
-//*****************************************************************************
-static uint32_t
-USBHCDGetConfigDescriptor(uint32_t ui32Index, tUSBHostDevice *psDevice)
-{
- tUSBRequest sSetupPacket;
- uint32_t ui32Bytes;
- tConfigDescriptor sConfigDescriptor;
-
- ASSERT(ui32Index == 0);
-
- ui32Bytes = 0;
-
- //
- // This is a Standard Device IN request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_IN | USB_RTYPE_STANDARD | USB_RTYPE_DEVICE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_GET_DESCRIPTOR;
- sSetupPacket.wValue = USB_DTYPE_CONFIGURATION << 8;
-
- //
- // Index is always 0 for device configurations requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // Only ask for the configuration header first to see how big the
- // whole thing is.
- //
- if(!psDevice->bConfigRead)
- {
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = sizeof(tConfigDescriptor);
-
- //
- // Put the setup packet in the buffer.
- //
- ui32Bytes =
- USBHCDControlTransfer(0, &sSetupPacket, psDevice,
- (uint8_t *)&sConfigDescriptor,
- sizeof(tConfigDescriptor),
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
- }
-
- //
- // If the Configuration header was successfully returned then get the
- // full configuration descriptor.
- //
- if(ui32Bytes == sizeof(tConfigDescriptor))
- {
- //
- // Save the total size and request the full configuration descriptor.
- //
- sSetupPacket.wLength = sConfigDescriptor.wTotalLength;
-
- //
- // Not enough space to hold this configuration descriptor.
- //
- if(ConfigDescAlloc(psDevice, sConfigDescriptor.wTotalLength) == 0)
- {
- return(0);
- }
-
- //
- // Don't allow the buffer to be larger than was allocated.
- //
- if(sSetupPacket.wLength > psDevice->ui32ConfigDescriptorSize)
- {
- return(0);
- }
-
- //
- // Put the setup packet in the buffer.
- //
- ui32Bytes =
- USBHCDControlTransfer(0, &sSetupPacket, psDevice,
- (uint8_t *)psDevice->psConfigDescriptor,
- sSetupPacket.wLength,
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
-
- //
- // If we read the descriptor, remember the fact.
- //
- if(ui32Bytes)
- {
- psDevice->bConfigRead = true;
- }
- }
-
- return(ui32Bytes);
-}
-
-//*****************************************************************************
-//
-//! This function issues a request for a device descriptor from a device.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param psDevice is a pointer to the device structure that holds the buffer
-//! to store the device descriptor into.
-//!
-//! This function will request the device descriptor from the device. The
-//! \e psDevice->sDeviceDescriptor descriptor is used to hold the data for this
-//! request. \e psDevice->sDeviceDescriptor.bMaxPacketSize0 should be
-//! initialized to zero or to the valid maximum packet size if it is known. If
-//! this variable is not set to zero, then this call will determine the maximum
-//! packet size for endpoint 0 and save it in the structure member
-//! bMaxPacketSize0.
-//!
-//! \return The number of bytes returned due to the request. This value can be
-//! zero if the device did not respond.
-//
-//*****************************************************************************
-static uint32_t
-USBHCDGetDeviceDescriptor(uint32_t ui32Index, tUSBHostDevice *psDevice)
-{
- tUSBRequest sSetupPacket;
- uint32_t ui32Bytes;
-
- ASSERT(ui32Index == 0);
-
- //
- // This is a Standard Device IN request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_IN | USB_RTYPE_STANDARD | USB_RTYPE_DEVICE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_GET_DESCRIPTOR;
- sSetupPacket.wValue = USB_DTYPE_DEVICE << 8;
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // All devices must have at least an 8 byte max packet size so just ask
- // for 8 bytes to start with.
- //
- sSetupPacket.wLength = sizeof(tDeviceDescriptor);
-
- ui32Bytes = 0;
-
- //
- // Discover the max packet size for endpoint 0.
- //
- if(psDevice->sDeviceDescriptor.bMaxPacketSize0 == 0)
- {
- //
- // Put the setup packet in the buffer.
- //
- ui32Bytes =
- USBHCDControlTransfer(ui32Index, &sSetupPacket, psDevice,
- (uint8_t *)&(psDevice->sDeviceDescriptor),
- sizeof(tDeviceDescriptor), 8);
- }
-
- //
- // Now get the full descriptor now that the actual maximum packet size
- // is known.
- //
- if(ui32Bytes < sizeof(tDeviceDescriptor))
- {
- sSetupPacket.wLength = (uint16_t)sizeof(tDeviceDescriptor);
-
- ui32Bytes =
- USBHCDControlTransfer(ui32Index, &sSetupPacket, psDevice,
- (uint8_t *)&(psDevice->sDeviceDescriptor),
- sizeof(tDeviceDescriptor),
- psDevice->sDeviceDescriptor.bMaxPacketSize0);
- }
-
- return(ui32Bytes);
-}
-
-//*****************************************************************************
-//
-//! This function is used to send the set address command to a device.
-//!
-//! \param ui32DevIndex is the index of the device whose address is to be
-//! set. This value must be 0 to indicate that the device is connected
-//! directly to the host controller. Higher values indicate devices connected
-//! via a hub.
-//! \param ui32DevAddress is the new device address to use for a device.
-//!
-//! The USBHCDSetAddress() function is used to set the USB device address, once
-//! a device has been discovered on the bus. This call is typically issued
-//! following a USB reset triggered by a call the USBHCDReset(). The
-//! address passed into this function via the \e ui32DevAddress parameter is
-//! used for all further communications with the device after this function
-//! returns.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDSetAddress(uint32_t ui32DevIndex, uint32_t ui32DevAddress)
-{
- tUSBRequest sSetupPacket;
-
- //
- // This is a Standard Device OUT request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_OUT | USB_RTYPE_STANDARD | USB_RTYPE_DEVICE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_ADDRESS;
- sSetupPacket.wValue = ui32DevAddress;
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket,
- &g_sUSBHCD.psUSBDevice[ui32DevIndex], 0,
- 0, MAX_PACKET_SIZE_EP0);
-
- //
- // Must delay 2ms after setting the address.
- //
- OS_DELAY(g_ui32Tickms * 2);
-}
-
-//*****************************************************************************
-//
-//! This function is used to send a Clear Feature request to a device.
-//!
-//! \param ui32DevAddress is the USB bus address of the device that will
-//! receive this request.
-//! \param ui32Pipe is the pipe that will be used to send the request.
-//! \param ui32Feature is one of the USB_FEATURE_* definitions.
-//!
-//! This function will issue a Clear Feature request to the device indicated
-//! by the \e ui32DevAddress parameter. The \e ui32Pipe parameter is the USB
-//! pipe that should be used to send this request. The \e ui32Feature
-//! parameter should be one of the following values:
-//!
-//! * \b USB_FEATURE_EP_HALT is used to end a HALT condition on a devices
-//! endpoint.
-//! * \b USB_FEATURE_REMOTE_WAKE is used to disable a device's remote wake
-//! feature.
-//! * \b USB_FEATURE_TEST_MODE is used take the USB device out of test mode.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDClearFeature(uint32_t ui32DevAddress, uint32_t ui32Pipe,
- uint32_t ui32Feature)
-{
- tUSBRequest sSetupPacket;
- uint32_t ui32Index;
-
- //
- // Get the index number from the allocated pipe.
- //
- ui32Index = (ui32Pipe & EP_PIPE_IDX_M);
-
- //
- // This is a Standard Device OUT request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_OUT | USB_RTYPE_STANDARD | USB_RTYPE_ENDPOINT;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_CLEAR_FEATURE;
- sSetupPacket.wValue = ui32Feature;
-
- //
- // Set the endpoint to access.
- //
- if(ui32Pipe & EP_PIPE_TYPE_IN)
- {
- sSetupPacket.wIndex = g_sUSBHCD.psUSBINPipes[ui32Index].ui8EPNumber |
- 0x80;
- }
- else
- {
- sSetupPacket.wIndex = g_sUSBHCD.psUSBOUTPipes[ui32Index].ui8EPNumber;
- }
-
- //
- // This is always 0.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket,
- &g_sUSBHCD.psUSBDevice[ui32DevAddress - 1], 0, 0,
- MAX_PACKET_SIZE_EP0);
-
- //
- // Set the endpoint to access.
- //
- if(ui32Pipe & EP_PIPE_TYPE_IN)
- {
- MAP_USBEndpointDataToggleClear(USB0_BASE,
- IndexToUSBEP(ui32Index + 1),
- USB_EP_HOST_IN);
- }
- else
- {
- MAP_USBEndpointDataToggleClear(USB0_BASE,
- IndexToUSBEP(ui32Index + 1),
- USB_EP_HOST_OUT);
- }
-
- //
- // Must delay 2ms after clearing the feature.
- //
- OS_DELAY(g_ui32Tickms * 2);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the current configuration for a device.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32Device is the USB device for this function.
-//! \param ui32Configuration is one of the devices valid configurations.
-//!
-//! This function is used to set the current device configuration for a USB
-//! device. The \e ui32Configuration value must be one of the configuration
-//! indexes that was returned in the configuration descriptor from the device,
-//! or a value of 0. If 0 is passed in, the device will return to it's
-//! addressed state and no longer be in a configured state. If the value is
-//! non-zero then the device will change to the requested configuration.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDSetConfig(uint32_t ui32Index, uint32_t ui32Device,
- uint32_t ui32Configuration)
-{
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- ASSERT(ui32Index == 0);
-
- psDevice = (tUSBHostDevice *)ui32Device;
-
- //
- // This is a Standard Device OUT request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_OUT | USB_RTYPE_STANDARD | USB_RTYPE_DEVICE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_CONFIG;
- sSetupPacket.wValue = ui32Configuration;
-
- //
- // Index is always 0 for device requests.
- //
- sSetupPacket.wIndex = 0;
-
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psDevice, 0, 0,
- MAX_PACKET_SIZE_EP0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to set the current interface and alternate setting
-//! for an interface on a device.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32Device is the USB device for this function.
-//! \param ui32Interface is one of the valid interface numbers for a device.
-//! \param ui32AltSetting is one of the valid alternate interfaces for the
-//! \e ui32Interface number.
-//!
-//! This function is used to change the alternate setting for one of the valid
-//! interfaces on a USB device. The \e ui32Device specifies the device
-//! instance that was returned when the device was connected. This call will
-//! set the USB device's interface based on the \e ui32Interface and
-//! \e ui32AltSetting.
-//!
-//! \b Example: Set the USB device interface 2 to alternate setting 1.
-//!
-//! \verbatim
-//! USBHCDSetInterface(0, ui32Device, 2, 1);
-//! \endverbatim
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDSetInterface(uint32_t ui32Index, uint32_t ui32Device,
- uint32_t ui32Interface, uint32_t ui32AltSetting)
-{
- tUSBRequest sSetupPacket;
- tUSBHostDevice *psDevice;
-
- ASSERT(ui32Index == 0);
-
- psDevice = (tUSBHostDevice *)ui32Device;
-
- //
- // This is a Standard Device OUT request.
- //
- sSetupPacket.bmRequestType =
- USB_RTYPE_DIR_OUT | USB_RTYPE_STANDARD | USB_RTYPE_INTERFACE;
-
- //
- // Request a Device Descriptor.
- //
- sSetupPacket.bRequest = USBREQ_SET_INTERFACE;
-
- //
- // Index is the interface to access.
- //
- sSetupPacket.wIndex = ui32Interface;
-
- //
- // wValue is the alternate setting.
- //
- sSetupPacket.wValue = ui32AltSetting;
-
-
- //
- // Only request the space available.
- //
- sSetupPacket.wLength = 0;
-
- //
- // Put the setup packet in the buffer.
- //
- USBHCDControlTransfer(0, &sSetupPacket, psDevice, 0, 0,
- MAX_PACKET_SIZE_EP0);
-}
-
-//*****************************************************************************
-//
-// The internal function to see if a new schedule event should occur.
-//
-// This function is called by the main interrupt handler due to start of frame
-// interrupts to determine if a new scheduler event should be sent to the USB
-// pipe.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USBHostCheckPipes(void)
-{
- int32_t i32Idx;
-
- g_ui32CurrentTick++;
-
- for(i32Idx = 0; i32Idx < g_sUSBHCD.ui32NumEndpoints; i32Idx++)
- {
- //
- // Skip unused pipes.
- //
- if(g_sUSBHCD.psUSBINPipes[i32Idx].ui32Type == USBHCD_PIPE_UNUSED)
- {
- continue;
- }
-
- //
- // If the tick has expired and it has an interval then update it.
- //
- if((g_sUSBHCD.psUSBINPipes[i32Idx].ui32Interval != 0) &&
- (g_sUSBHCD.psUSBINPipes[i32Idx].ui32NextEventTick ==
- g_ui32CurrentTick))
- {
- //
- // Schedule the next event.
- //
- g_sUSBHCD.psUSBINPipes[i32Idx].ui32NextEventTick +=
- g_sUSBHCD.psUSBINPipes[i32Idx].ui32Interval;
-
- //
- // If the pipe is IDLE and there is a callback, let the higher
- // level drivers know that a new transfer can be scheduled.
- //
- if((g_sUSBHCD.psUSBINPipes[i32Idx].iState == ePipeIdle) &&
- (g_sUSBHCD.psUSBINPipes[i32Idx].pfnCallback))
- {
- g_sUSBHCD.psUSBINPipes[i32Idx].pfnCallback(
- IN_PIPE_HANDLE(i32Idx),
- USB_EVENT_SCHEDULER);
- }
- }
- }
-}
-
-//*****************************************************************************
-//
-// The internal USB host mode interrupt handler.
-//
-// \param ui32Index is the USB controller associated with this interrupt.
-// \param ui32Status is the current interrupt status as read via a call to
-// \e USBIntStatusControl().
-//
-// This the main USB interrupt handler called when operating in host mode.
-// This handler will branch the interrupt off to the appropriate handlers
-// depending on the current status of the USB controller.
-//
-// The two-tiered structure for the interrupt handler ensures that it is
-// possible to use the same handler code in both host and OTG modes and
-// means that device code can be excluded from applications that only require
-// support for USB host mode operation.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USBHostIntHandlerInternal(uint32_t ui32Index, uint32_t ui32Status)
-{
- uint32_t ui32EPStatus, ui32DMAIntStatus, ui32Idx, ui32DevIndex;
- static uint32_t ui32SOFDivide = 0;
- int32_t i32ClassDrvr;
-
- //
- // By default, assume we are dealing with the device directly connected
- // to the host controller and that we need to notify its class driver of
- // this interrupt.
- //
- g_sUSBHCD.psUSBDevice[0].ui32Flags |= USBHDEV_FLAG_NOTIFYINT;
-
- if(ui32Status & USB_INTCTRL_SOF)
- {
- //
- // Indicate that a start of frame has occurred.
- //
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_SOF;
- }
-
- //
- // A power fault has occurred so notify the application.
- //
- if(ui32Status & USB_INTCTRL_POWER_FAULT)
- {
- //
- // Indicate that a power fault has occurred.
- //
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_POWER_FAULT;
-
- //
- // Turn off power to the bus.
- //
- MAP_USBHostPwrDisable(USB0_BASE);
-
- //
- // Disable USB interrupts.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- return;
- }
-
- //
- // In the event of a USB VBUS error, end the session and remove power to
- // the device.
- //
- if(ui32Status & USB_INTCTRL_VBUS_ERR)
- {
- //
- // Set the VBUS error event. We deliberately clear all other events
- // since this one means anything else that is outstanding is
- // irrelevant.
- //
- g_sUSBHCD.ui32IntEvents = INT_EVENT_VBUS_ERR;
- return;
- }
-
- //
- // Received a reset from the host.
- //
- if(ui32Status & USB_INTCTRL_BABBLE)
- {
- }
-
- //
- // Suspend was signaled on the bus.
- //
- if(ui32Status & USB_INTCTRL_SUSPEND)
- {
- }
-
- //
- // Start the session.
- //
- if(ui32Status & USB_INTCTRL_SESSION)
- {
- //
- // Power the USB bus.
- //
- MAP_USBHostPwrEnable(USB0_BASE);
-
- USBOTGSessionRequest(USB0_BASE, true);
- }
-
- //
- // Resume was signaled on the bus.
- //
- if(ui32Status & USB_INTCTRL_RESUME)
- {
- }
-
- //
- // Device connected so tell the main routine to issue a reset.
- //
- if(ui32Status & USB_INTCTRL_CONNECT)
- {
- //
- // Set the connect flag and clear disconnect if it happens to be set.
- //
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_CONNECT;
- g_sUSBHCD.ui32IntEvents &= ~INT_EVENT_DISCONNECT;
-
- //
- // Power the USB bus.
- //
- MAP_USBHostPwrEnable(USB0_BASE);
- }
-
- //
- // Handle the ID detection so that the ID pin can be used as a
- // GPIO in eUSBModeHost.
- //
- if(ui32Status & USB_INTCTRL_MODE_DETECT)
- {
- //
- // If in eUSBModeHost mode then switch back to OTG detection
- // so that VBUS can be monitored but free up the ID pin.
- //
- if(g_iUSBMode == eUSBModeHost)
- {
- USBOTGMode(USB0_BASE);
- }
- }
-
- //
- // Device was unplugged.
- //
- if(ui32Status & USB_INTCTRL_DISCONNECT)
- {
- //
- // Set the disconnect flag and clear connect if it happens to be set.
- //
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_DISCONNECT;
- g_sUSBHCD.ui32IntEvents &= ~INT_EVENT_CONNECT;
- }
-
- //
- // Start of Frame was received.
- //
- if(ui32Status & USB_INTCTRL_SOF)
- {
- //
- // Increment the global Start of Frame counter.
- //
- g_ui32USBSOFCount++;
-
- //
- // Increment our SOF divider.
- //
- ui32SOFDivide++;
-
- //
- // Have we counted enough SOFs to allow us to call the tick function?
- //
- if(ui32SOFDivide == USB_SOF_TICK_DIVIDE)
- {
- //
- // Yes - reset the divider and call the SOF tick handler.
- //
- ui32SOFDivide = 0;
- InternalUSBStartOfFrameTick(USB_SOF_TICK_DIVIDE);
- }
- }
-
- //
- // Check to see if any DMA transfers are pending
- //
- ui32DMAIntStatus = USBLibDMAIntStatus(g_sUSBHCD.psDMAInstance);
-
- if(ui32DMAIntStatus)
- {
- //
- // Handle any DMA interrupt processing.
- //
- USBLibDMAIntHandler(g_sUSBHCD.psDMAInstance, ui32DMAIntStatus);
-
- for(ui32Idx = 0; ui32Idx < MAX_NUM_PIPES; ui32Idx++)
- {
- if((g_sUSBHCD.psUSBINPipes[ui32Idx].iState == ePipeReadDMAWait) ||
- (g_sUSBHCD.psUSBINPipes[ui32Idx].iState == ePipeReadDMA))
- {
- //
- // If the DMA channel transfer is complete, send an ack.
- //
- if(USBLibDMAChannelStatus(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32Idx].ui8DMAChannel) ==
- USBLIBSTATUS_DMA_COMPLETE)
- {
- //
- // Acknowledge the IN request.
- //
- MAP_USBHostEndpointDataAck(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1));
-
- //
- // If using uDMA then the endpoint status interrupt will
- // not occur. So process the data ready event here.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].iState = ePipeDataReady;
-
- //
- // Only call a handler if one is present.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback)
- {
- g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback(
- IN_PIPE_HANDLE(ui32Idx), USB_EVENT_RX_AVAILABLE);
- }
-
- //
- // Remember that we need to notify this device's class
- // driver that an interrupt occurred.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].psDevice->ui32Flags |=
- USBHDEV_FLAG_NOTIFYINT;
- }
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState ==
- ePipeWriteDMASend)
- {
- //
- // If the uDMA channel transfer is complete, then tell
- // the USB controller to go ahead and send the data
- //
- if(USBLibDMAChannelStatus(g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].ui8DMAChannel) &
- USBLIBSTATUS_DMA_COMPLETE)
- {
- MAP_USBEndpointDataSend(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- USB_TRANS_OUT);
-
- //
- // Now waiting on the final endpoint interrupt.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState =
- ePipeWriteDMAWait;
- }
- }
- else if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState == ePipeWriteDMA)
- {
- //
- // Data was transmitted successfully.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState = ePipeDataSent;
-
- //
- // Only call a handler if one is present.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback)
- {
- //
- // Notify the pipe that its last transaction was completed.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback(
- OUT_PIPE_HANDLE(ui32Idx),
- USB_EVENT_TX_COMPLETE);
- }
- }
- }
- }
-
- //
- // Get the current endpoint interrupt status.
- //
- ui32Status = MAP_USBIntStatusEndpoint(USB0_BASE);
-
- //
- // Handle end point 0 interrupts.
- //
- if(ui32Status & USB_INTEP_0)
- {
- //
- // Indicate that a start of frame has occurred.
- //
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_ENUM;
- }
-
- for(ui32Idx = 0; ui32Idx < MAX_NUM_PIPES; ui32Idx++)
- {
- //
- // Check the next pipe, the first time through this will clear out
- // any interrupts dealing with endpoint zero since it was handled
- // above.
- //
- ui32Status >>= 1;
-
- //
- // Break out if there are no more pending interrupts.
- //
- if(ui32Status == 0)
- {
- break;
- }
-
- //
- // Check the status of the receive(IN) pipes.
- //
- if(ui32Status & 0x10000)
- {
- //
- // Clear the status flag for the IN Pipe.
- //
- ui32Status &= ~0x10000;
-
- //
- // Read the status of the endpoint connected to this pipe.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1));
-
- //
- // Check if the device stalled the request.
- //
- if(ui32EPStatus & USB_HOST_IN_STALL)
- {
- //
- // Clear the stall condition on this endpoint pipe.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- USB_HOST_IN_STALL);
-
- //
- // Save the STALLED state.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].iState = ePipeStalled;
-
- //
- // Notify the pipe that it was stalled.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback)
- {
- g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback(
- IN_PIPE_HANDLE(ui32Idx),
- USB_EVENT_STALL);
- }
- }
- else if(ui32EPStatus & USB_HOST_IN_ERROR)
- {
- //
- // We can no longer communicate with this device for some
- // reason. It may have been disconnected from a hub, for
- // example. Merely clear the status and continue.
- //
- USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- USB_HOST_IN_ERROR);
-
- //
- // Save the STALLED state.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].iState = ePipeError;
-
- //
- // Notify the pipe that it was stalled.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback)
- {
- g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback(
- IN_PIPE_HANDLE(ui32Idx),
- USB_EVENT_ERROR);
- }
- }
- //
- // Handle the case where the pipe is reading a single packet.
- //
- else if(g_sUSBHCD.psUSBINPipes[ui32Idx].iState == ePipeReadDMA)
- {
- //
- // Enable the DMA channel and wait for it to complete.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].iState = ePipeReadDMAWait;
-
- USBLibDMAChannelEnable(
- g_sUSBHCD.psDMAInstance,
- g_sUSBHCD.psUSBINPipes[ui32Idx].ui8DMAChannel);
- }
- else if(g_sUSBHCD.psUSBINPipes[ui32Idx].iState == ePipeReading)
- {
- //
- // Data is available.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].iState = ePipeDataReady;
-
- //
- // Read the data out of the USB endpoint interface into the
- // buffer provided by the caller to USBHCDPipeRead() or
- // USBHCDPipeSchedule() if a buffer was provided already.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Idx].pui8ReadPtr)
- {
- USBEndpointDataGet(USB0_BASE, IndexToUSBEP(ui32Idx + 1),
- g_sUSBHCD.psUSBINPipes[ui32Idx].pui8ReadPtr,
- &g_sUSBHCD.psUSBINPipes[ui32Idx].ui32ReadSize);
- }
-
- //
- // Notify the pipe that its last transaction was completed.
- //
- if(g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback)
- {
- g_sUSBHCD.psUSBINPipes[ui32Idx].pfnCallback(
- IN_PIPE_HANDLE(ui32Idx),
- USB_EVENT_RX_AVAILABLE);
- }
-
- }
-
- //
- // Remember that we need to notify this device's class
- // driver that an interrupt occurred.
- //
- g_sUSBHCD.psUSBINPipes[ui32Idx].psDevice->ui32Flags |=
- USBHDEV_FLAG_NOTIFYINT;
- }
-
- //
- // Check the status of the transmit(OUT) pipes.
- //
- if(ui32Status & 1)
- {
- //
- // Read the status of the endpoint connected to this pipe.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1));
-
- //
- // Check if the device stalled the request.
- //
- if(ui32EPStatus & USB_HOST_OUT_STALL)
- {
- //
- // Clear the stall condition on this endpoint pipe.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- USB_HOST_OUT_STALL);
-
- //
- // Save the STALLED state.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState = ePipeStalled;
-
- //
- // Only call a handler if one is present.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback)
- {
- //
- // Notify the pipe that it was stalled.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback(
- OUT_PIPE_HANDLE(ui32Idx),
- USB_EVENT_STALL);
- }
- }
- else if(ui32EPStatus & USB_HOST_OUT_ERROR)
- {
- //
- // Clear the error condition on this endpoint pipe.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- USB_HOST_OUT_ERROR);
-
- //
- // Save the Pipes error state.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState = ePipeError;
-
- //
- // Only call a handler if one is present.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback)
- {
- //
- // Notify the pipe that had an error.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback(
- OUT_PIPE_HANDLE(ui32Idx),
- USB_EVENT_ERROR);
- }
- }
- else if((g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState ==
- ePipeWriting) ||
- (g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState ==
- ePipeWriteDMAWait))
- {
- //
- // Data was transmitted successfully.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].iState = ePipeDataSent;
-
- //
- // Only call a handler if one is present.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback)
- {
- //
- // Notify the pipe that its last transaction was completed.
- //
- g_sUSBHCD.psUSBOUTPipes[ui32Idx].pfnCallback(
- OUT_PIPE_HANDLE(ui32Idx),
- USB_EVENT_TX_COMPLETE);
- }
- }
-
- //
- // Clear the stall condition on this endpoint pipe.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE,
- IndexToUSBEP(ui32Idx + 1),
- ui32EPStatus);
- //
- // Remember that we need to notify this device's class
- // driver that an interrupt occurred.
- //
- if(g_sUSBHCD.psUSBOUTPipes[ui32Idx].psDevice)
- {
- g_sUSBHCD.psUSBINPipes[ui32Idx].psDevice->ui32Flags |=
- USBHDEV_FLAG_NOTIFYINT;
- }
- }
- }
-
- //
- // Send back notifications to any class driver whose endpoint required
- // service during the handler.
- //
- for(ui32DevIndex = 0; ui32DevIndex <= MAX_USB_DEVICES; ui32DevIndex++)
- {
- //
- // Which class driver does this device use?
- //
- i32ClassDrvr = g_pi32USBHActiveDriver[ui32DevIndex];
-
- //
- // If a class driver is in use, and one of its endpoints was serviced
- // and the class driver has an interrupt callback...
- //
- if((i32ClassDrvr >= 0) &&
- (g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Flags &
- USBHDEV_FLAG_NOTIFYINT) &&
- (g_sUSBHCD.ppsClassDrivers[i32ClassDrvr]->pfnIntHandler))
- {
- //
- // ...call the class driver's interrupt notification callback.
- //
- g_sUSBHCD.ppsClassDrivers[i32ClassDrvr]->pfnIntHandler(
- g_ppvDriverInstance[ui32DevIndex]);
- }
- }
-}
-
-//*****************************************************************************
-//
-//! The USB host mode interrupt handler for controller index 0.
-//!
-//! This the main USB interrupt handler entry point. This handler will branch
-//! the interrupt off to the appropriate handlers depending on the current
-//! status of the USB controller. This function must be placed in the
-//! interrupt table in order for the USB Library host stack to function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USB0HostIntHandler(void)
-{
- uint32_t ui32Status;
-
- //
- // Get the control interrupt status.
- //
- ui32Status = MAP_USBIntStatusControl(USB0_BASE);
-
- //
- // Call the internal handler to process the interrupts.
- //
- USBHostIntHandlerInternal(0, ui32Status);
-}
-
-//*****************************************************************************
-//
-//! This function opens the class driver.
-//!
-//! \param ui32Index specifies which USB controller to use.
-//! \param ui32DeviceNum is the device number for the driver to load.
-//!
-//! This function opens the driver needed based on the class value found in
-//! the device's interface descriptor.
-//!
-//! \return This function returns -1 if no driver is found, or it returns the
-//! index of the driver found in the list of host class drivers.
-//
-//*****************************************************************************
-static int32_t
-USBHCDOpenDriver(uint32_t ui32Index, uint32_t ui32DeviceNum)
-{
- int32_t i32Driver;
- uint32_t ui32Class;
- tInterfaceDescriptor *psInterface;
- tEventInfo sEvent;
-
- ASSERT(ui32Index == 0);
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(
- g_sUSBHCD.psUSBDevice[ui32DeviceNum].psConfigDescriptor,
- g_sUSBHCD.psUSBDevice[ui32DeviceNum].ui32Interface,
- USB_DESC_ANY);
-
- //
- // Read the interface class.
- //
- ui32Class = psInterface->bInterfaceClass;
-
- //
- // Search through the Host Class driver list for the devices class.
- //
- for(i32Driver = 0; i32Driver < g_sUSBHCD.ui32NumClassDrivers; i32Driver++)
- {
- //
- // If a driver was found call the open for this driver and save which
- // driver is in use.
- //
- if(g_sUSBHCD.ppsClassDrivers[i32Driver]->ui32InterfaceClass ==
- ui32Class)
- {
- //
- // Call the open function for the class driver.
- //
- g_ppvDriverInstance[ui32DeviceNum] =
- g_sUSBHCD.ppsClassDrivers[i32Driver]->pfnOpen(
- &g_sUSBHCD.psUSBDevice[ui32DeviceNum]);
-
- //
- // If the driver was successfully loaded then break out of the
- // loop.
- //
- if(g_ppvDriverInstance[ui32DeviceNum] != 0)
- {
- break;
- }
- }
- }
-
- //
- // If no drivers were found then return -1 to indicate an invalid
- // driver instance.
- //
- if(i32Driver == g_sUSBHCD.ui32NumClassDrivers)
- {
- //
- // Send an unknown connection event.
- //
- SendUnknownConnect(ui32Index, ui32Class);
-
- //
- // Indicate that no driver was found.
- //
- i32Driver = -1;
- }
- else
- {
- //
- // If the connect event is enabled then send the event.
- //
- sEvent.ui32Event = USB_EVENT_CONNECTED;
- sEvent.ui32Instance = (ui32Index << 16) | ui32DeviceNum;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_CONNECT);
- }
-
- return(i32Driver);
-}
-
-//*****************************************************************************
-//
-// This function will send an event to a registered event driver.
-//
-// \param ui32Index specifies which USB controller to use.
-// \param psEvent is a pointer to the event structure to send.
-//
-// This function is only used internally to the USB library and will check
-// if an event driver is registered and send on the event.
-//
-// Note: This function should not be called outside of the USB library.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-InternalUSBHCDSendEvent(uint32_t ui32Index, tEventInfo *psEvent,
- uint32_t ui32EvFlag)
-{
- //
- // Make sure that an event driver has been registered.
- //
- if((g_sUSBHCD.i32EventDriver != -1) &&
- (g_sUSBHCD.ppsClassDrivers[g_sUSBHCD.i32EventDriver]->pfnIntHandler) &&
- (g_sUSBHCD.ui32EventEnables & ui32EvFlag))
- {
- g_sUSBHCD.ppsClassDrivers[g_sUSBHCD.i32EventDriver]->pfnIntHandler(
- psEvent);
- }
-}
-
-//*****************************************************************************
-//
-// This function handles the necessary clean up for device disconnect.
-//
-// \param ui32Index is the device number for the device that was disconnected.
-//
-// This function handles all of the necessary clean up after a device
-// disconnect has been detected by the stack. This includes calling back the
-// appropriate driver if necessary.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBHCDDeviceDisconnected(uint32_t ui32Index, uint32_t ui32DevIndex)
-{
- tEventInfo sEvent;
-
- ASSERT(ui32Index == 0);
- ASSERT(ui32DevIndex <= MAX_USB_DEVICES);
-
- //
- // If there is an event driver with a valid event handler and the
- // USBHCD_EVFLAG_DISCNCT is enabled, then call the registered event
- // handler.
- //
- sEvent.ui32Event = USB_EVENT_DISCONNECTED;
- sEvent.ui32Instance = (ui32Index << 16) | ui32DevIndex;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_DISCNCT);
-
- //
- // Reset the class.
- //
- g_sUSBHCD.ui32Class = USB_CLASS_EVENTS;
-
- //
- // Free configuration descriptor memory if any has been allocated.
- //
- if(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Flags & USBHDEV_FLAG_ALLOCATED)
- {
- //
- // Free the memory used by the configuration descriptor.
- //
- ConfigDescFree(&g_sUSBHCD.psUSBDevice[ui32DevIndex]);
-
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Flags = 0;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].bConfigRead = false;
- }
-
- //
- // Reset the max packet size so that this will be re-read from new devices.
- //
- g_sUSBHCD.psUSBDevice[ui32DevIndex].sDeviceDescriptor.bMaxPacketSize0 = 0;
-
- //
- // No longer have a device descriptor.
- //
- g_sUSBHCD.psUSBDevice[ui32DevIndex].sDeviceDescriptor.bLength = 0;
-
- //
- // No longer addressed.
- //
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Address = 0;
-
- //
- // If this was an active driver then close it out.
- //
- if(g_pi32USBHActiveDriver[ui32DevIndex] >= 0)
- {
- //
- // Call the driver Close entry point.
- //
- g_sUSBHCD.ppsClassDrivers[g_pi32USBHActiveDriver[ui32DevIndex]]->
- pfnClose(g_ppvDriverInstance[ui32DevIndex]);
-
- //
- // No active driver now present.
- //
- g_pi32USBHActiveDriver[ui32DevIndex] = -1;
- g_ppvDriverInstance[ui32DevIndex] = 0;
- }
-
- //
- // This call is necessary for OTG controllers to know that the host
- // stack has completed handling the disconnect of the device before
- // removing power and returning to a state that can allow OTG
- // negotiations once again.
- // We only do this if the disconnected device
- // was attached directly to us (device index 0).
- //
- if((ui32DevIndex == 0) && (g_iUSBMode == eUSBModeOTG))
- {
- OTGDeviceDisconnect(0);
- }
-}
-
-//*****************************************************************************
-//
-//! This function is the main routine for the Host Controller Driver.
-//!
-//! This function is the main routine for the host controller driver, and must
-//! be called periodically by the main application outside of a callback
-//! context. This allows for a simple cooperative system to access the the
-//! host controller driver interface without the need for an RTOS. All time
-//! critical operations are handled in interrupt context but all blocking
-//! operations are run from the this function to allow them to block and wait
-//! for completion without holding off other interrupts.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBHCDMain(void)
-{
- tUSBHDeviceState iOldState;
- int32_t i32Dev;
- tEventInfo sEvent;
-
- //
- // Save the old state to detect changes properly.
- //
- iOldState = g_sUSBHCD.piDeviceState[0];
-
- //
- // Fix up the state if any important interrupt events occurred.
- //
- if(g_sUSBHCD.ui32IntEvents)
- {
- //
- // Disable the USB interrupt.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- if(g_sUSBHCD.ui32IntEvents & INT_EVENT_POWER_FAULT)
- {
- //
- // A power fault has occurred so notify the application if there
- // is an event handler and the event has been enabled.
- //
- sEvent.ui32Event = USB_EVENT_POWER_FAULT;
- sEvent.ui32Instance = 0;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_PWRFAULT);
-
- g_sUSBHCD.piDeviceState[0] = eHCDPowerFault;
- }
- else if(g_sUSBHCD.ui32IntEvents & INT_EVENT_VBUS_ERR)
- {
- //
- // A VBUS error has occurred. This event trumps connect and
- // disconnect since it will cause a controller reset.
- //
- g_sUSBHCD.piDeviceState[0] = eHCDVBUSError;
- }
- else
- {
- //
- // Has a device connected?
- //
- if(g_sUSBHCD.ui32IntEvents & INT_EVENT_CONNECT)
- {
- g_sUSBHCD.piDeviceState[0] = eHCDDevReset;
- g_sUSBHCD.psUSBDevice[0].ui8Hub = 0;
- g_sUSBHCD.psUSBDevice[0].ui8HubPort = 0;
- }
- else
- {
- //
- // Has a device disconnected?
- //
- if(g_sUSBHCD.ui32IntEvents & INT_EVENT_DISCONNECT)
- {
- g_sUSBHCD.piDeviceState[0] = eHCDDevDisconnected;
- }
- }
-
- //
- // Handle the start of frame event
- //
- if(g_sUSBHCD.ui32IntEvents & INT_EVENT_SOF)
- {
- //
- // If the connect event is enabled then send the event.
- //
- sEvent.ui32Event = USB_EVENT_SOF;
- sEvent.ui32Instance = 0;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_SOF);
-
- USBHostCheckPipes();
-
- //
- // Call the hub driver to have it perform any necessary
- // processing to handle downstream devices.
- //
- USBHHubMain();
- }
- }
-
- //
- // Clear the flags.
- //
- g_sUSBHCD.ui32IntEvents = 0;
-
- //
- // Enable the USB interrupt.
- //
- OS_INT_ENABLE(g_sUSBHCD.ui32IntNum);
- }
-
- //
- // Process the state machine for each connected device. Yes, the exit
- // condition for this loop is correct since we support (MAX_USB_DEVICES+1)
- // devices (the hub counts as one).
- //
- for(i32Dev = 0; i32Dev <= MAX_USB_DEVICES; i32Dev++)
- {
- //
- // If this is not the first device (i.e. the one directly connected to
- // the host controller) then set the old state to the current state
- // since we won't have mucked with it in any of the previous code.
- //
- if(i32Dev != 0)
- {
- iOldState = g_sUSBHCD.piDeviceState[i32Dev];
- }
-
- //
- // Process the state machine for this device.
- //
- ProcessUSBDeviceStateMachine(iOldState, i32Dev);
- }
-}
-
-static void
-ProcessUSBDeviceStateMachine(tUSBHDeviceState iOldState,
- uint32_t ui32DevIndex)
-{
- switch(g_sUSBHCD.piDeviceState[ui32DevIndex])
- {
- //
- // There was a power fault condition so shut down and wait for the
- // application to re-initialized the system.
- //
- case eHCDPowerFault:
- {
- break;
- }
-
- //
- // There was a VBUS error so handle it.
- //
- case eHCDVBUSError:
- {
- //
- // Disable USB interrupts.
- //
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- //
- // If there was a device in any state of connection then indicate
- // that it has been disconnected.
- //
- if((iOldState != eHCDIdle) && (iOldState != eHCDPowerFault))
- {
- //
- // Handle device disconnect.
- //
- USBHCDDeviceDisconnected(0, ui32DevIndex);
- }
-
- //
- // Reset the controller.
- //
- MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);
-
- //
- // Wait for 100ms before trying to re-power the device.
- //
- OS_DELAY(g_ui32Tickms * 100);
-
- //
- // Re-initialize the HCD.
- //
- USBHCDInitInternal(0, g_sUSBHCD.pvPool, g_sUSBHCD.ui32PoolSize);
-
- break;
- }
- //
- // Trigger a reset to the connected device.
- //
- case eHCDDevReset:
- {
- if(!ui32DevIndex)
- {
- //
- // Trigger a Reset. This is only ever done for devices
- // attached directly to the controller.
- //
- DEBUG_OUTPUT("USB reset.\n");
- USBHCDReset(0);
- }
-
- //
- // The state moves to connected but not configured.
- //
- g_sUSBHCD.piDeviceState[0] = eHCDDevConnected;
-
- //
- // Remember that we don't have a valid configuration descriptor
- // yet.
- //
- g_sUSBHCD.psUSBDevice[0].bConfigRead = false;
-
- break;
- }
- //
- // Device connection has been established now start enumerating
- // the device.
- //
- case eHCDDevConnected:
- case eHCDDevConnectedHub:
- {
- //
- // First check if we have read the device descriptor at all
- // before proceeding.
- //
- if(g_sUSBHCD.psUSBDevice[ui32DevIndex].sDeviceDescriptor.bLength ==
- 0)
- {
- //
- // Initialize a request for the device descriptor.
- //
- DEBUG_OUTPUT("Connection %d - getting device descriptor\n",
- ui32DevIndex);
-
- if(USBHCDGetDeviceDescriptor(0,
- &g_sUSBHCD.psUSBDevice[ui32DevIndex]) == 0)
- {
- //
- // If the device descriptor cannot be read then the device
- // will be treated as unknown.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevError;
-
- DEBUG_OUTPUT("Connection %d - failed to get descriptor\n",
- ui32DevIndex);
-
- //
- // Send an unknown connection event.
- //
- SendUnknownConnect(0, 1);
-
- //
- // If the device is connected via a hub, tell the hub
- // driver that we experienced an error enumerating the
- // device.
- //
- if(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub)
- {
- USBHHubEnumerationError(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort);
- }
- }
- }
- //
- // If we have the device descriptor then move on to setting
- // the address of the device.
- //
- else if(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Address == 0)
- {
- DEBUG_OUTPUT("Connection %d - setting address %d\n",
- ui32DevIndex, ui32DevIndex + 1);
-
- //
- // Send the set address command.
- //
- USBHCDSetAddress(ui32DevIndex, (ui32DevIndex + 1));
-
- //
- // Save the address.
- //
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Address =
- (ui32DevIndex + 1);
-
- //
- // Move on to the addressed state.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevAddressed;
- }
- break;
- }
- case eHCDDevAddressed:
- {
- //
- // First check if we have read the configuration descriptor.
- //
- if(!g_sUSBHCD.psUSBDevice[ui32DevIndex].bConfigRead)
- {
- DEBUG_OUTPUT("Connection %d - getting config descriptor\n",
- ui32DevIndex);
-
- //
- // Initialize a request for the configuration descriptor.
- //
- if(USBHCDGetConfigDescriptor(0,
- &g_sUSBHCD.psUSBDevice[ui32DevIndex]) == 0)
- {
- //
- // If the device descriptor cannot be read then the device
- // will be treated as unknown.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevError;
-
- DEBUG_OUTPUT("Connection %d - failed to get descriptor\n",
- ui32DevIndex);
-
- //
- // Send an unknown connection event.
- //
- SendUnknownConnect(0, 0);
-
- //
- // If the device is connected via a hub, tell the hub
- // driver that we experienced an error enumerating the
- // device.
- //
- if(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub)
- {
- USBHHubEnumerationError(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort);
- }
- }
- }
- //
- // Now have addressed and received the device configuration,
- // so get ready to set the device configuration.
- //
- else
- {
- DEBUG_OUTPUT("Connection %d - setting configuration.\n",
- ui32DevIndex);
-
- //
- // Use the first configuration to set the device
- // configuration.
- //
- USBHCDSetConfig(0,
- (uint32_t)&g_sUSBHCD.psUSBDevice[ui32DevIndex], 1);
-
- //
- // Move on to the configured state.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevConfigured;
-
- //
- // Open the driver for the device.
- //
- g_pi32USBHActiveDriver[ui32DevIndex] = USBHCDOpenDriver(0,
- ui32DevIndex);
-
- //
- // If the device is connected via a hub, tell the hub
- // driver that enumeration is complete.
- //
- if(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub)
- {
- USBHHubEnumerationComplete(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort);
- }
- }
- break;
- }
- //
- // The device was making a request and is now complete.
- //
- case eHCDDevRequest:
- {
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevConnected;
- break;
- }
- //
- // The strings are currently not accessed.
- //
- case eHCDDevGetStrings:
- {
- break;
- }
- //
- // Basically Idle at this point.
- //
- case eHCDDevDisconnected:
- {
- DEBUG_OUTPUT("Connection %d - disconnected.\n",
- ui32DevIndex);
-
- //
- // Handle device disconnect.
- //
- USBHCDDeviceDisconnected(0, ui32DevIndex);
-
- //
- // Return to the Idle state.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDIdle;
- break;
- }
-
- //
- // Connection and enumeration is complete so allow this function
- // to exit.
- //
- case eHCDDevConfigured:
- {
- break;
- }
-
- //
- // Poorly behaving device are in limbo in this state until removed.
- //
- case eHCDDevError:
- {
- DEBUG_OUTPUT("Connection %d - Error!\n", ui32DevIndex);
-
- //
- // If this device is connected directly to us, tidy up and ignore
- // it until it is removed. If the device is connected to a hub,
- // we just leave it in the error state until it is removed.
- //
- if(ui32DevIndex == 0)
- {
- g_sUSBHCD.ui32IntEvents |= INT_EVENT_DISCONNECT;
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDIdle;
- }
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-//! This function completes a control transaction to a device.
-//!
-//! \param ui32Index is the controller index to use for this transfer.
-//! \param psSetupPacket is the setup request to be sent.
-//! \param psDevice is the device instance pointer for this request.
-//! \param pui8Data is the data to send for OUT requests or the receive buffer
-//! for IN requests.
-//! \param ui32Size is the size of the buffer in pui8Data.
-//! \param ui32MaxPacketSize is the maximum packet size for the device for this
-//! request.
-//!
-//! This function handles the state changes necessary to send a control
-//! transaction to a device. This function should not be called from within
-//! an interrupt callback as it is a blocking function.
-//!
-//! \return The number of bytes of data that were sent or received as a result
-//! of this request.
-//
-//*****************************************************************************
-uint32_t
-USBHCDControlTransfer(uint32_t ui32Index, tUSBRequest *psSetupPacket,
- tUSBHostDevice *psDevice, uint8_t *pui8Data,
- uint32_t ui32Size, uint32_t ui32MaxPacketSize)
-{
- uint32_t ui32Remaining;
- uint32_t ui32DataSize;
-
- //
- // Debug sanity check.
- //
- ASSERT(g_sUSBHEP0State.iState == eEP0StateIdle);
- ASSERT(ui32Index == 0);
-
- //
- // Initialize the state of the data for this request.
- //
- g_sUSBHEP0State.pui8Data = pui8Data;
- g_sUSBHEP0State.ui32BytesRemaining = ui32Size;
- g_sUSBHEP0State.ui32DataSize = ui32Size;
-
- //
- // Set the maximum packet size.
- //
- g_sUSBHEP0State.ui32MaxPacketSize = ui32MaxPacketSize;
-
- //
- // Save the current address.
- //
- g_sUSBHEP0State.ui32DevAddress = psDevice->ui32Address;
-
- //
- // Set the address the host will used to communicate with the device.
- //
- MAP_USBHostAddrSet(USB0_BASE, USB_EP_0, g_sUSBHEP0State.ui32DevAddress,
- USB_EP_HOST_OUT);
-
- //
- // Put the data in the correct FIFO.
- //
- MAP_USBEndpointDataPut(USB0_BASE, USB_EP_0, (uint8_t *)psSetupPacket,
- sizeof(tUSBRequest));
-
- //
- // If this is an IN request, change to that state.
- //
- if(psSetupPacket->bmRequestType & USB_RTYPE_DIR_IN)
- {
- g_sUSBHEP0State.iState = eEP0StateSetupIN;
- }
- else
- {
- //
- // If there is no data then this is not an OUT request.
- //
- if(ui32Size != 0)
- {
- //
- // Since there is data, this is an OUT request.
- //
- g_sUSBHEP0State.iState = eEP0StateSetupOUT;
- }
- else
- {
- //
- // Otherwise this request has no data and just a status phase.
- //
- g_sUSBHEP0State.iState = eEP0StateStatusIN;
- }
- }
-
- //
- // Make sure we are talking to the correct device.
- //
- USBHostHubAddrSet(USB0_BASE, USB_EP_0,
- (psDevice->ui8Hub | (psDevice->ui8HubPort << 8)),
- USB_EP_HOST_OUT | (psDevice->bLowSpeed ?
- USB_EP_SPEED_LOW : USB_EP_SPEED_FULL));
-
- //
- // Send the Setup packet.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_SETUP);
-
- //
- // Block until endpoint 0 returns to the IDLE state.
- //
- while(g_sUSBHEP0State.iState != eEP0StateIdle)
- {
- OS_INT_DISABLE(g_sUSBHCD.ui32IntNum);
-
- if((g_sUSBHCD.ui32IntEvents & (INT_EVENT_ENUM | INT_EVENT_SOF)) ==
- (INT_EVENT_ENUM | INT_EVENT_SOF))
- {
- g_sUSBHCD.ui32IntEvents &= ~(INT_EVENT_ENUM | INT_EVENT_SOF);
-
- USBHCDEnumHandler();
- }
-
- OS_INT_ENABLE(g_sUSBHCD.ui32IntNum);
-
- if(g_sUSBHEP0State.iState == eEP0StateError)
- {
- return(0xffffffff);
- }
-
- //
- // If we aborted the transfer due to an error, tell the caller
- // that no bytes were transferred.
- //
- if(g_sUSBHCD.ui32IntEvents & (INT_EVENT_VBUS_ERR |
- INT_EVENT_DISCONNECT))
- {
- return(0xffffffff);
- }
- }
-
- //
- // Calculate and return the number of bytes that were sent or received.
- // The extra copy into local variables is required to prevent some
- // compilers from warning about undefined order of volatile access.
- //
- ui32DataSize = g_sUSBHEP0State.ui32DataSize;
- ui32Remaining = g_sUSBHEP0State.ui32BytesRemaining;
-
- return(ui32DataSize - ui32Remaining);
-}
-
-//*****************************************************************************
-//
-// Starts enumerating a new device connected via the hub.
-//
-// \param ui32Index is the index of the USB controller to use.
-// \param ui32Hub is the hub address from which the connection is being made.
-// \param ui32Port is the hub port number that the new device is connected to.
-// \param pui8ConfigPool is memory to be used to store the device's
-// configuration descriptor.
-// \param ui32ConfigSize is the number of bytes available in the buffer pointed
-// to by pui8ConfigPool.
-//
-// This function is called by the hub class driver after it has detected a new
-// device connection and reset the device.
-//
-// \return Returns the index of the device allocated or 0 if no resources are
-// available. Device index 0 is the hub itself.
-//
-//*****************************************************************************
-uint32_t
-USBHCDHubDeviceConnected(uint32_t ui32Index, uint8_t ui8Hub,
- uint8_t ui8Port, bool bLowSpeed)
-{
- uint32_t ui32DevIndex;
-
- //
- // Debug sanity checks.
- //
- ASSERT(ui32Index == 0);
- ASSERT(ui8Port);
-
- DEBUG_OUTPUT("Connection from hub %d, port %d.\n", ui8Hub, ui8Port);
-
- //
- // Look for a free slot in the device table.
- //
- for(ui32DevIndex = 1; ui32DevIndex <= MAX_USB_DEVICES; ui32DevIndex++)
- {
- if((g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Flags &
- USBHDEV_FLAG_ALLOCATED) == 0)
- {
- //
- // We found one. Set the state to ensure that it gets enumerated.
- //
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Flags =
- USBHDEV_FLAG_ALLOCATED;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].psConfigDescriptor->bLength = 0;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub = ui8Hub;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort = ui8Port;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].bLowSpeed = bLowSpeed;
- g_sUSBHCD.psUSBDevice[ui32DevIndex].sDeviceDescriptor.bLength = 0;
-
- //
- // Set the state to ensure enumeration begins.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevConnectedHub;
-
- DEBUG_OUTPUT("Allocating device %d\n", ui32DevIndex);
-
- //
- // Pass the device index back to the hub driver.
- //
- return(ui32DevIndex);
- }
- }
-
- //
- // If we get here, there are device slots available so send back an invalid
- // device index to tell the caller to ignore this device.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-// Called when a device is disconnected from a hub.
-//
-// \param ui32Index is the index of the USB controller to use.
-// \param ui32DevIndex is the device index for the USB device that was
-// disconnected.
-//
-//*****************************************************************************
-void
-USBHCDHubDeviceDisconnected(uint32_t ui32Index, uint32_t ui32DevIndex)
-{
- //
- // Debug sanity checks.
- //
- ASSERT(ui32Index == 0);
- ASSERT(ui32DevIndex && (ui32DevIndex <= MAX_USB_DEVICES));
-
- DEBUG_OUTPUT("Disconnection from hub %d, port %d, device %d\n",
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8Hub,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort, ui32DevIndex);
-
- //
- // Set the device state to ensure that USBHCDMain cleans it up.
- //
- g_sUSBHCD.piDeviceState[ui32DevIndex] = eHCDDevDisconnected;
-}
-
-//*****************************************************************************
-//
-// This is the endpoint 0 interrupt handler.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBHCDEnumHandler(void)
-{
- uint32_t ui32EPStatus;
- uint32_t ui32DataSize;
-
- //
- // Get the end point 0 status.
- //
- ui32EPStatus = MAP_USBEndpointStatus(USB0_BASE, USB_EP_0);
-
- //
- // If there was an error then go to the error state.
- //
- if(ui32EPStatus == USB_HOST_EP0_ERROR)
- {
- //
- // Clear this status indicating that the status packet was
- // received.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE, USB_EP_0,
- USB_HOST_EP0_ERROR);
- MAP_USBFIFOFlush(USB0_BASE, USB_EP_0, 0);
-
- //
- // Just go back to the idle state.
- //
- g_sUSBHEP0State.iState = eEP0StateError;
-
- return;
- }
-
- switch(g_sUSBHEP0State.iState)
- {
- //
- // Handle the status state, this is a transitory state from
- // USB_STATE_TX or USB_STATE_RX back to USB_STATE_IDLE.
- //
- case eEP0StateStatus:
- {
- //
- // Handle the case of a received status packet.
- //
- if(ui32EPStatus & (USB_HOST_EP0_RXPKTRDY | USB_HOST_EP0_STATUS))
- {
- //
- // Clear this status indicating that the status packet was
- // received.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE, USB_EP_0,
- (USB_HOST_EP0_RXPKTRDY |
- USB_HOST_EP0_STATUS));
- }
-
- //
- // Just go back to the idle state.
- //
- g_sUSBHEP0State.iState = eEP0StateIdle;
-
- break;
- }
-
- //
- // This state triggers a STATUS IN request from the device.
- //
- case eEP0StateStatusIN:
- {
- //
- // Generate an IN request from the device.
- //
- MAP_USBHostRequestStatus(USB0_BASE);
-
- //
- // Change to the status phase and wait for the response.
- //
- g_sUSBHEP0State.iState = eEP0StateStatus;
-
- break;
- }
-
- //
- // In the IDLE state the code is waiting to receive data from the host.
- //
- case eEP0StateIdle:
- {
- break;
- }
-
- //
- // Data is still being sent to the host so handle this in the
- // EP0StateTx() function.
- //
- case eEP0StateSetupOUT:
- {
- //
- // Send remaining data if necessary.
- //
- USBHCDEP0StateTx();
-
- break;
- }
-
- //
- // Handle the receive state for commands that are receiving data on
- // endpoint 0.
- //
- case eEP0StateSetupIN:
- {
- //
- // Generate a new IN request to the device.
- //
- MAP_USBHostRequestIN(USB0_BASE, USB_EP_0);
-
- //
- // Proceed to the RX state to receive the requested data.
- //
- g_sUSBHEP0State.iState = eEP0StateRx;
-
- break;
- }
-
- //
- // The endpoint remains in this state until all requested data has
- // been received.
- //
- case eEP0StateRx:
- {
- //
- // There was a stall on endpoint 0 so go back to the idle state
- // as this command has been terminated.
- //
- if(ui32EPStatus & USB_HOST_EP0_RX_STALL)
- {
- g_sUSBHEP0State.iState = eEP0StateIdle;
-
- //
- // Clear the stalled state on endpoint 0.
- //
- MAP_USBHostEndpointStatusClear(USB0_BASE, USB_EP_0,
- ui32EPStatus);
- break;
- }
-
- //
- // Set the number of bytes to get out of this next packet.
- //
- ui32DataSize = g_sUSBHEP0State.ui32BytesRemaining;
- if(ui32DataSize > g_sUSBHEP0State.ui32MaxPacketSize)
- {
- //
- // Don't send more than EP0_MAX_PACKET_SIZE bytes.
- //
- ui32DataSize = MAX_PACKET_SIZE_EP0;
- }
-
- if(ui32DataSize != 0)
- {
- //
- // Get the data from the USB controller end point 0.
- //
- MAP_USBEndpointDataGet(USB0_BASE, USB_EP_0,
- g_sUSBHEP0State.pui8Data,
- &ui32DataSize);
- }
-
- //
- // Advance the pointer.
- //
- g_sUSBHEP0State.pui8Data += ui32DataSize;
-
- //
- // Decrement the number of bytes that are being waited on.
- //
- g_sUSBHEP0State.ui32BytesRemaining -= ui32DataSize;
-
- //
- // Need to ack the data on end point 0 in this case
- // without setting data end.
- //
- MAP_USBHostEndpointDataAck(USB0_BASE, USB_EP_0);
-
- //
- // If there was not more than the maximum packet size bytes of data
- // the this was a int16_t packet and indicates that this transfer
- // is complete. If there were exactly
- // g_sUSBHEP0State.ui32MaxPacketSize remaining then there still
- // needs to be null packet sent before this transfer is complete.
- //
- if((ui32DataSize < g_sUSBHEP0State.ui32MaxPacketSize) ||
- (g_sUSBHEP0State.ui32BytesRemaining == 0))
- {
- //
- // Return to the idle state.
- //
- g_sUSBHEP0State.iState = eEP0StateStatus;
-
- //
- // No more data.
- //
- g_sUSBHEP0State.pui8Data = 0;
-
- //
- // Send a null packet to acknowledge that all data was
- // received.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_STATUS);
- }
- else
- {
- //
- // Request more data.
- //
- MAP_USBHostRequestIN(USB0_BASE, USB_EP_0);
- }
- break;
- }
-
- //
- // The device stalled endpoint zero so check if the stall needs to be
- // cleared once it has been successfully sent.
- //
- case eEP0StateStall:
- {
- //
- // Reset the global end point 0 state to IDLE.
- //
- g_sUSBHEP0State.iState = eEP0StateIdle;
-
- break;
- }
-
- //
- // Halt on an unknown state, but only in DEBUG builds.
- //
- default:
- {
- ASSERT(0);
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This internal function handles sending data on endpoint 0.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBHCDEP0StateTx(void)
-{
- uint32_t ui32NumBytes;
- uint8_t *pui8Data;
-
- //
- // In the TX state on endpoint 0.
- //
- g_sUSBHEP0State.iState = eEP0StateSetupOUT;
-
- //
- // Set the number of bytes to send this iteration.
- //
- ui32NumBytes = g_sUSBHEP0State.ui32BytesRemaining;
-
- //
- // Limit individual transfers to 64 bytes.
- //
- if(ui32NumBytes > 64)
- {
- ui32NumBytes = 64;
- }
-
- //
- // Save the pointer so that it can be passed to the USBEndpointDataPut()
- // function.
- //
- pui8Data = (uint8_t *)g_sUSBHEP0State.pui8Data;
-
- //
- // Advance the data pointer and counter to the next data to be sent.
- //
- g_sUSBHEP0State.ui32BytesRemaining -= ui32NumBytes;
- g_sUSBHEP0State.pui8Data += ui32NumBytes;
-
- //
- // Put the data in the correct FIFO.
- //
- MAP_USBEndpointDataPut(USB0_BASE, USB_EP_0, pui8Data, ui32NumBytes);
-
- //
- // If this is exactly 64 then don't set the last packet yet.
- //
- if(ui32NumBytes == 64)
- {
- //
- // There is more data to send or exactly 64 bytes were sent, this
- // means that there is either more data coming or a null packet needs
- // to be sent to complete the transaction.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_OUT);
- }
- else
- {
- //
- // Send the last bit of data.
- //
- MAP_USBEndpointDataSend(USB0_BASE, USB_EP_0, USB_TRANS_OUT);
-
- //
- // Now go to the status state and wait for the transmit to complete.
- //
- g_sUSBHEP0State.iState = eEP0StateStatusIN;
- }
-}
-
-//*****************************************************************************
-//
-//! This function returns the USB hub port for the requested device instance.
-//!
-//! \param ui32Instance is a unique value indicating which device to query.
-//!
-//! This function returns the USB hub port for the device that is associated
-//! with the \e ui32Instance parameter. The caller must use the value for
-//! \e ui32Instance was passed to the application when it receives a
-//! USB_EVENT_CONNECTED event. The function returns the USB hub port for
-//! the interface number specified by the \e ui32Interface parameter.
-//!
-//! \return The USB hub port for the requested interface.
-//
-//*****************************************************************************
-uint8_t
-USBHCDDevHubPort(uint32_t ui32Instance)
-{
- uint32_t ui32DevIndex;
-
- ui32DevIndex = HCDInstanceToDevIndex(ui32Instance);
-
- if(ui32DevIndex == 0xff)
- {
- return(ui32DevIndex);
- }
-
- return(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui8HubPort);
-}
-
-//*****************************************************************************
-//
-//! This function will return the USB address for the requested device
-//! instance.
-//!
-//! \param ui32Instance is a unique value indicating which device to query.
-//!
-//! This function returns the USB address for the device that is associated
-//! with the \e ui32Instance parameter. The caller must use a value for
-//! \e ui32Instance have been passed to the application when it receives a
-//! \b USB_EVENT_CONNECTED event. The function will return the USB address for
-//! the interface number specified by the \e ui32Interface parameter.
-//!
-//! \return The USB address for the requested interface.
-//
-//*****************************************************************************
-uint8_t
-USBHCDDevAddress(uint32_t ui32Instance)
-{
- uint32_t ui32DevIndex;
-
- ui32DevIndex = HCDInstanceToDevIndex(ui32Instance);
-
- if(ui32DevIndex == 0xff)
- {
- return(ui32DevIndex);
- }
-
- return(g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Address);
-}
-
-//*****************************************************************************
-//
-//! This function will return the USB class for the requested device
-//! instance.
-//!
-//! \param ui32Instance is a unique value indicating which device to query.
-//! \param ui32Interface is the interface number to query for the USB class.
-//!
-//! This function returns the USB class for the device that is associated
-//! with the \e ui32Instance parameter. The caller must use a value for
-//! \e ui32Instance have been passed to the application when it receives a
-//! USB_EVENT_CONNECTED event. The function will return the USB class for
-//! the interface number specified by the \e ui32Interface parameter. If
-//! \e ui32Interface is set to 0xFFFFFFFF then the function will return the USB
-//! class for the first interface that is found in the device's USB
-//! descriptors.
-//!
-//! \return The USB class for the requested interface.
-//
-//*****************************************************************************
-uint8_t
-USBHCDDevClass(uint32_t ui32Instance, uint32_t ui32Interface)
-{
- uint32_t ui32DevIndex;
- tInterfaceDescriptor *psInterface;
-
- ui32DevIndex = HCDInstanceToDevIndex(ui32Instance);
-
- //
- // If the instance was not valid return an undefined class.
- //
- if(ui32DevIndex == 0xff)
- {
- return(USB_CLASS_DEVICE);
- }
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].psConfigDescriptor,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Interface,
- ui32Interface);
-
- //
- // Make sure that the interface requested actually exists.
- //
- if(psInterface)
- {
- //
- // Return the interface class.
- //
- return(psInterface->bInterfaceClass);
- }
-
- //
- // No valid interface so return an undefined class.
- //
- return(USB_CLASS_DEVICE);
-}
-
-//*****************************************************************************
-//
-//! This function will return the USB subclass for the requested device
-//! instance.
-//!
-//! \param ui32Instance is a unique value indicating which device to query.
-//! \param ui32Interface is the interface number to query for the USB subclass.
-//!
-//! This function returns the USB subclass for the device that is associated
-//! with the \e ui32Instance parameter. The caller must use a value for
-//! \e ui32Instance have been passed to the application when it receives a
-//! \b USB_EVENT_CONNECTED event. The function will return the USB subclass
-//! for the interface number specified by the \e ui32Interface parameter. If
-//! \e ui32Interface is set to 0xFFFFFFFF then the function will return the USB
-//! subclass for the first interface that is found in the device's USB
-//! descriptors.
-//!
-//! \return The USB subclass for the requested interface.
-//
-//*****************************************************************************
-uint8_t
-USBHCDDevSubClass(uint32_t ui32Instance, uint32_t ui32Interface)
-{
- uint32_t ui32DevIndex;
- tInterfaceDescriptor *psInterface;
-
- ui32DevIndex = HCDInstanceToDevIndex(ui32Instance);
-
- //
- // If the instance was not valid return an undefined subclass.
- //
- if(ui32DevIndex == 0xff)
- {
- return(USB_SUBCLASS_UNDEFINED);
- }
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].psConfigDescriptor,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Interface,
- ui32Interface);
-
- //
- // Make sure that the interface requested actually exists.
- //
- if(psInterface)
- {
- //
- // Return the interface subclass.
- //
- return(psInterface->bInterfaceSubClass);
- }
-
- //
- // No valid interface so return an undefined subclass.
- //
- return(USB_SUBCLASS_UNDEFINED);
-}
-
-//*****************************************************************************
-//
-//! This function returns the USB protocol for the requested device instance.
-//!
-//! \param ui32Instance is a unique value indicating which device to query.
-//! \param ui32Interface is the interface number to query for the USB protocol.
-//!
-//! This function returns the USB protocol for the device that is associated
-//! with the \e ui32Instance parameter. The caller must use a value for
-//! \e ui32Instance have been passed to the application when it receives a
-//! USB_EVENT_CONNECTED event. The function will return the USB protocol for
-//! the interface number specified by the \e ui32Interface parameter. If
-//! \e ui32Interface is set to 0xFFFFFFFF then the function will return the USB
-//! protocol for the first interface that is found in the device's USB
-//! descriptors.
-//!
-//! \return The USB protocol for the requested interface.
-//
-//*****************************************************************************
-uint8_t
-USBHCDDevProtocol(uint32_t ui32Instance, uint32_t ui32Interface)
-{
- uint32_t ui32DevIndex;
- tInterfaceDescriptor *psInterface;
-
- ui32DevIndex = HCDInstanceToDevIndex(ui32Instance);
-
- //
- // If the instance was not valid return an undefined protocol.
- //
- if(ui32DevIndex == 0xff)
- {
- return(USB_PROTOCOL_UNDEFINED);
- }
-
- //
- // Get the interface descriptor.
- //
- psInterface = USBDescGetInterface(
- g_sUSBHCD.psUSBDevice[ui32DevIndex].psConfigDescriptor,
- g_sUSBHCD.psUSBDevice[ui32DevIndex].ui32Interface,
- ui32Interface);
-
- //
- // Make sure that the interface requested actually exists.
- //
- if(psInterface)
- {
- //
- // Return the interface protocol.
- //
- return(psInterface->bInterfaceProtocol);
- }
-
- //
- // No valid interface so return an undefined protocol.
- //
- return(USB_PROTOCOL_UNDEFINED);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostpriv.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostpriv.h
deleted file mode 100644
index 077fb3c5d..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhostpriv.h
+++ /dev/null
@@ -1,195 +0,0 @@
-//*****************************************************************************
-//
-// usbhostpriv.h - Internal header file for USB host functions.
-//
-// Copyright (c) 2011-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHOSTPRIV_H__
-#define __USBHOSTPRIV_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-// The states a hub port can be in during device connection.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // The port has no device connected.
- //
- ePortIdle,
-
- //
- // The port has a device present and is waiting for the enumeration
- // sequence to begin.
- //
- ePortConnected,
-
- //
- // A device connection notification has been received and we have initiated
- // a reset to the port. We are waiting for the reset to complete.
- //
- ePortResetActive,
-
- //
- // The Port reset has completed but now the hub is waiting the required
- // 10ms before accessing the device.
- //
- ePortResetWait,
-
- //
- // A device is connected and the port has been reset. Control has been
- // passed to the main host handling portion of USBLib to enumerate the
- // device.
- //
- ePortActive,
-
- //
- // A device has completed enumeration.
- //
- ePortEnumerated,
-
- //
- // A device is attached to the port but enumeration failed.
- //
- ePortError
-}
-tHubPortState;
-
-//*****************************************************************************
-//
-// The list of valid event flags in the g_sUSBHCD.ui32EventEnables member
-// variable.
-//
-//*****************************************************************************
-#define USBHCD_EVFLAG_SOF 0x00000001
-#define USBHCD_EVFLAG_CONNECT 0x00000002
-#define USBHCD_EVFLAG_UNKCNCT 0x00000004
-#define USBHCD_EVFLAG_DISCNCT 0x00000008
-#define USBHCD_EVFLAG_PWRFAULT 0x00000010
-#define USBHCD_EVFLAG_PWRDIS 0x00000020
-#define USBHCD_EVFLAG_PWREN 0x00000040
-
-//*****************************************************************************
-//
-//! This is the structure that holds all of the information for devices
-//! that are enumerated in the system. It is passed in to Open function of
-//! USB host class drivers so that they can allocate any endpoints and parse
-//! out other information that the device class needs to complete enumeration.
-//
-//*****************************************************************************
-struct tUSBHostDevice
-{
- //
- //! The current device address for this device.
- //
- uint32_t ui32Address;
-
- //
- //! The current interface for this device.
- //
- uint32_t ui32Interface;
-
- //
- //! A flag used to record whether this is a low-speed or a full-speed
- //! device.
- //
- bool bLowSpeed;
-
- //
- //! A flag indicating whether or not we have read the device's
- //! configuration descriptor yet.
- //
- bool bConfigRead;
-
- //
- //! The hub number to which this device is attached.
- //
- uint8_t ui8Hub;
-
- //
- //! The hub port number to which the device is attached.
- //
- uint8_t ui8HubPort;
-
- //
- //! The device descriptor for this device.
- //
- tDeviceDescriptor sDeviceDescriptor;
-
- //
- //! A pointer to the configuration descriptor for this device.
- //
- tConfigDescriptor *psConfigDescriptor;
-
- //
- //! The size of the buffer allocated to psConfigDescriptor.
- //
- uint32_t ui32ConfigDescriptorSize;
-
- //
- //! Internal flags used by the host controller driver.
- //
- uint32_t ui32Flags;
-};
-
-//*****************************************************************************
-//
-// Functions within the host controller that are called by the hub class driver
-//
-//*****************************************************************************
-extern uint32_t USBHCDHubDeviceConnected(uint32_t ui32Index, uint8_t ui8Hub,
- uint8_t ui8Port,
- bool bLowSpeed);
-extern void USBHCDHubDeviceDisconnected(uint32_t ui32Index,
- uint32_t ui32DevIndex);
-
-//*****************************************************************************
-//
-// Functions in the hub class driver that are called by the host controller.
-//
-//*****************************************************************************
-extern void USBHHubMain(void);
-extern void USBHHubInit(void);
-extern void USBHHubEnumerationComplete(uint8_t ui8Hub, uint8_t ui8Port);
-extern void USBHHubEnumerationError(uint8_t ui8Hub, uint8_t ui8Port);
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHOSTPRIV_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.c
deleted file mode 100644
index a824a0993..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.c
+++ /dev/null
@@ -1,780 +0,0 @@
-//*****************************************************************************
-//
-// usbhscsi.c - USB host SCSI layer used by the USB host MSC driver.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "usblib/usblib.h"
-#include "usblib/usbmsc.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhmsc.h"
-#include "usblib/host/usbhscsi.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// This is the data verify tag passed between requests.
-//
-//*****************************************************************************
-#define CBW_TAG_VALUE 0x54231990
-
-//*****************************************************************************
-//
-//! This function is used to issue SCSI commands via USB.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param psSCSICmd is the SCSI command structure to send.
-//! \param pui8Data is pointer to the command data to be sent.
-//! \param pui32Size is the number of bytes is the number of bytes expected or
-//! sent by the command.
-//!
-//! This internal function is used to handle SCSI commands sent by other
-//! functions. It serves as a layer between the SCSI command and the USB
-//! interface being used to send the command. The \e pSCSI parameter contains
-//! the SCSI command to send. For commands that expect data back, the
-//! \e pui8Data is the buffer to store the data into and \e pui32Size is used
-//! to store the amount of data to request as well as used to indicate how many
-//! bytes were filled into the \e pui8Data buffer on return. For commands that
-//! are sending data, \e pui8Data is the data to be sent and \e pui32Size is
-//! the number of bytes to send.
-//!
-//! \return This function returns the SCSI status from the command. The value
-//! will be either \b SCSI_CMD_STATUS_PASS or \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-static uint32_t
-USBHSCSISendCommand(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- tMSCCBW *psSCSICmd, uint8_t *pui8Data, uint32_t *pui32Size)
-{
- tMSCCSW sCmdStatus;
- uint32_t ui32Bytes;
-
- //
- // Initialize the command status.
- //
- sCmdStatus.dCSWSignature = 0;
- sCmdStatus.dCSWTag = 0;
- sCmdStatus.bCSWStatus = SCSI_CMD_STATUS_FAIL;
-
- //
- // Set the CBW signature and tag.
- //
- psSCSICmd->dCBWSignature = CBW_SIGNATURE;
- psSCSICmd->dCBWTag = CBW_TAG_VALUE;
-
- //
- // Set the size of the data to be returned by the device.
- //
- psSCSICmd->dCBWDataTransferLength = *pui32Size;
-
- //
- // Send the command.
- //
- ui32Bytes = USBHCDPipeWrite(ui32OutPipe, (uint8_t*)psSCSICmd,
- sizeof(tMSCCBW));
-
- //
- // If no bytes went out then the command failed.
- //
- if(ui32Bytes == 0)
- {
- return(SCSI_CMD_STATUS_FAIL);
- }
-
- //
- // Only request data if there is data to request.
- //
- if(psSCSICmd->dCBWDataTransferLength != 0)
- {
- //
- // See if this is a read or a write.
- //
- if(psSCSICmd->bmCBWFlags & CBWFLAGS_DIR_IN)
- {
- //
- // Read the data back.
- //
- *pui32Size = USBHCDPipeRead(ui32InPipe, pui8Data, *pui32Size);
- }
- else
- {
- //
- // Write the data out.
- //
- *pui32Size = USBHCDPipeWrite(ui32OutPipe, pui8Data, *pui32Size);
- }
- }
-
- //
- // Get the status of the command.
- //
- ui32Bytes = USBHCDPipeRead(ui32InPipe, (uint8_t *)&sCmdStatus,
- sizeof(tMSCCSW));
-
-
- //
- // If the status was invalid or did not have the correct signature then
- // indicate a failure.
- //
- if((ui32Bytes == 0) || (sCmdStatus.dCSWSignature != CSW_SIGNATURE) ||
- (sCmdStatus.dCSWTag != CBW_TAG_VALUE))
- {
- return(SCSI_CMD_STATUS_FAIL);
- }
-
- //
- // Return the status.
- //
- return((uint32_t)sCmdStatus.bCSWStatus);
-}
-
-//*****************************************************************************
-//
-//! This will issue the SCSI inquiry command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param pui8Data is the data buffer to return the results into.
-//! \param pui32Size is the size of buffer that was passed in on entry and the
-//! number of bytes returned.
-//!
-//! This function should be used to issue a SCSI Inquiry command to a mass
-//! storage device. To allow for multiple devices, the \e ui32InPipe and
-//! \e ui32OutPipe parameters indicate which USB pipes to use for this call.
-//!
-//! \note The \e pui8Data buffer pointer should have at least
-//! \b SCSI_INQUIRY_DATA_SZ bytes of data or this function will overflow the
-//! buffer.
-//!
-//! \return This function returns the SCSI status from the command. The value
-//! will be either \b SCSI_CMD_STATUS_PASS or \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIInquiry(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // The number of bytes of data that the host expects to transfer on the
- // Bulk-In or Bulk-Out endpoint (as indicated by the Direction bit) during
- // the execution of this command. If this field is zero, the device and
- // the host shall transfer no data between the CBW and the associated CSW,
- // and the device shall ignore the value of the Direction bit in
- // bmCBWFlags.
- //
- *pui32Size = SCSI_INQUIRY_DATA_SZ;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // This is the length of the command itself.
- //
- sSCSICmd.bCBWCBLength = 6;
-
- //
- // Send Inquiry command with no request for vital product data.
- //
- pui32Data[0] = SCSI_INQUIRY_CMD;
-
- //
- // Allocation length.
- //
- pui32Data[1] = SCSI_INQUIRY_DATA_SZ;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This will issue the SCSI read capacity command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param pui8Data is the data buffer to return the results into.
-//! \param pui32Size is the size of buffer that was passed in on entry and the
-//! number of bytes returned.
-//!
-//! This function should be used to issue a SCSI Read Capacity command
-//! to a mass storage device that is connected. To allow for multiple devices,
-//! the \e ui32InPipe and \e ui32OutPipe parameters indicate which USB pipes to
-//! use for this call.
-//!
-//! \note The \e pui8Data buffer pointer should have at least
-//! \b SCSI_READ_CAPACITY_SZ bytes of data or this function will overflow the
-//! buffer.
-//!
-//! \return This function returns the SCSI status from the command. The value
-//! will be either \b SCSI_CMD_STATUS_PASS or \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIReadCapacity(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // Set the size of the command data.
- //
- *pui32Size = SCSI_READ_CAPACITY_SZ;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the length of the command itself.
- //
- sSCSICmd.bCBWCBLength = 12;
-
- //
- // Only use the first byte and set it to the Read Capacity command. The
- // rest are set to 0.
- //
- pui32Data[0] = SCSI_READ_CAPACITY;
- pui32Data[1] = 0;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This will issue the SCSI read capacities command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param pui8Data is the data buffer to return the results into.
-//! \param pui32Size is the size of buffer that was passed in on entry and the
-//! number of bytes returned.
-//!
-//! This function should be used to issue a SCSI Read Capacities command
-//! to a mass storage device that is connected. To allow for multiple devices,
-//! the \e ui32InPipe and \e ui32OutPipe parameters indicate which USB pipes to
-//! use for this call.
-//!
-//! \return This function returns the SCSI status from the command. The value
-//! will be either \b SCSI_CMD_STATUS_PASS or \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIReadCapacities(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the length of the command itself.
- //
- sSCSICmd.bCBWCBLength = 12;
-
- //
- // Only use the first byte and set it to the Read Capacity command. The
- // rest are set to 0.
- //
- pui32Data[0] = SCSI_READ_CAPACITIES;
- pui32Data[1] = 0;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This will issue the SCSI Mode Sense(6) command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param ui32Flags is a combination of flags defining the exact query that is
-//! to be made.
-//! \param pui8Data is the data buffer to return the results into.
-//! \param pui32Size is the size of the buffer on entry and number of bytes
-//! read on exit.
-//!
-//! This function should be used to issue a SCSI Mode Sense(6) command
-//! to a mass storage device. To allow for multiple devices,the \e ui32InPipe
-//! and \e ui32OutPipe parameters indicate which USB pipes to use for this
-//! call. The call will return at most the number of bytes in the \e pui32Size
-//! parameter, however it can return less and change the \e pui32Size parameter
-//! to the number of valid bytes in the \e *pui32Size buffer.
-//!
-//! The \e ui32Flags parameter is a combination of the following three sets of
-//! definitions:
-//!
-//! One of the following values must be specified:
-//!
-//! - \b SCSI_MS_PC_CURRENT request for current settings.
-//! - \b SCSI_MS_PC_CHANGEABLE request for changeable settings.
-//! - \b SCSI_MS_PC_DEFAULT request for default settings.
-//! - \b SCSI_MS_PC_SAVED request for the saved values.
-//!
-//! One of these following values must also be specified to determine the page
-//! code for the request:
-//!
-//! - \b SCSI_MS_PC_VENDOR is the vendor specific page code.
-//! - \b SCSI_MS_PC_DISCO is the disconnect/reconnect page code.
-//! - \b SCSI_MS_PC_CONTROL is the control page code.
-//! - \b SCSI_MS_PC_LUN is the protocol specific LUN page code.
-//! - \b SCSI_MS_PC_PORT is the protocol specific port page code.
-//! - \b SCSI_MS_PC_POWER is the power condition page code.
-//! - \b SCSI_MS_PC_INFORM is the informational exceptions page code.
-//! - \b SCSI_MS_PC_ALL will request all pages codes supported by the device.
-//!
-//! The last value is optional and supports the following global flag:
-//! - \b SCSI_MS_DBD disables returning block descriptors.
-//!
-//! Example: Request for all current settings.
-//!
-//! \verbatim
-//! SCSIModeSense6(ui32InPipe, ui32OutPipe,
-//! SCSI_MS_PC_CURRENT | SCSI_MS_PC_ALL,
-//! pui8Data, pui32Size);
-//! \endverbatim
-//!
-//! \return This function returns the SCSI status from the command. The value
-//! will be either \b SCSI_CMD_STATUS_PASS or \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIModeSense6(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32Flags, uint8_t *pui8Data,
- uint32_t *pui32Size)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the size of the command data.
- //
- sSCSICmd.bCBWCBLength = 6;
-
- //
- // Set the options for the Mode Sense Command (6).
- //
- pui32Data[0] = (SCSI_MODE_SENSE_6 | ui32Flags);
- pui32Data[1] = (uint8_t)*pui32Size;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This function issues a SCSI Test Unit Ready command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//!
-//! This function is used to issue a SCSI Test Unit Ready command to a device.
-//! This call will simply return the results of issuing this command.
-//!
-//! \return This function returns the results of the SCSI Test Unit Ready
-//! command. The value will be either \b SCSI_CMD_STATUS_PASS or
-//! \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSITestUnitReady(uint32_t ui32InPipe, uint32_t ui32OutPipe)
-{
- tMSCCBW sSCSICmd;
- uint32_t ui32Size;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // No data in this command.
- //
- ui32Size = 0;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the size of the command data.
- //
- sSCSICmd.bCBWCBLength = 6;
-
- //
- // Set the parameter options.
- //
- pui32Data[0] = SCSI_TEST_UNIT_READY;
- pui32Data[1] = 0;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, 0,
- &ui32Size));
-}
-
-//*****************************************************************************
-//
-//! This function issues a SCSI Request Sense command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param pui8Data is the data buffer to return the results into.
-//! \param pui32Size is the size of the buffer on entry and number of bytes
-//! read on exit.
-//!
-//! This function is used to issue a SCSI Request Sense command to a device.
-//! It will return the data in the buffer pointed to by \e pui8Data. The
-//! parameter \e pui32Size should have the allocation size in bytes of the
-//! buffer pointed to by \e pui8Data.
-//!
-//! \return This function returns the results of the SCSI Request Sense
-//! command. The value will be either \b SCSI_CMD_STATUS_PASS or
-//! \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIRequestSense(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the size of the command data.
- //
- sSCSICmd.bCBWCBLength = 12;
-
- //
- // Set the parameter options.
- //
- pui32Data[0] = SCSI_REQUEST_SENSE;
- pui32Data[1] = 18;
- pui32Data[2] = 0;
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This function issues a SCSI Read(10) command to a device.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param ui32LBA is the logical block address to read.
-//! \param pui8Data is the data buffer to return the data.
-//! \param pui32Size is the size of the buffer on entry and number of bytes
-//! read on exit.
-//! \param ui32NumBlocks is the number of contiguous blocks to read from the
-//! device.
-//!
-//! This function is used to issue a SCSI Read(10) command to a device. The
-//! \e ui32LBA parameter specifies the logical block address to read from the
-//! device. The data from this block will be returned in the buffer pointed to
-//! by \e pui8Data. The parameter \e pui32Size should indicate enough space to
-//! hold a full block size, or only the first \e pui32Size bytes of the LBA are
-//! returned.
-//!
-//! \return This function returns the results of the SCSI Read(10) command.
-//! The value will be either \b SCSI_CMD_STATUS_PASS or
-//! \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIRead10(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t *pui32Size, uint32_t ui32NumBlocks)
-{
- tMSCCBW sSCSICmd;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_IN;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the size of the command data.
- //
- sSCSICmd.bCBWCBLength = 10;
-
- //
- // Set the parameter options.
- //
- sSCSICmd.CBWCB[0] = SCSI_READ_10;
-
- //
- // Clear the reserved field.
- //
- sSCSICmd.CBWCB[1] = 0;
-
- //
- // LBA starts at offset 2.
- //
- sSCSICmd.CBWCB[2] = (uint8_t)(ui32LBA >> 24);
- sSCSICmd.CBWCB[3] = (uint8_t)(ui32LBA >> 16);
- sSCSICmd.CBWCB[4] = (uint8_t)(ui32LBA >> 8);
- sSCSICmd.CBWCB[5] = (uint8_t)ui32LBA;
-
- //
- // Clear the reserved field.
- //
- sSCSICmd.CBWCB[6] = 0;
-
- //
- // Transfer length in blocks starts at offset 2.
- // This also sets the Control value to 0 at offset 9.
- //
- sSCSICmd.CBWCB[7] = (ui32NumBlocks & 0xFF00) >> 8;
- *((uint32_t *)&sSCSICmd.CBWCB[8]) = (ui32NumBlocks & 0xFF);
- *((uint32_t *)&sSCSICmd.CBWCB[12]) = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-//! This function issues a SCSI Write(10) command to a device.
-//!
-//! This function is used to issue a SCSI Write(10) command to a device. The
-//! \e ui32LBA parameter specifies the logical block address on the device.
-//! The data to write to this block should be in the buffer pointed to by
-//! \e pui8Data parameter. The parameter \e pui32Size should indicate the
-//! amount of data to write to the specified LBA.
-//!
-//! \param ui32InPipe is the USB IN pipe to use for this command.
-//! \param ui32OutPipe is the USB OUT pipe to use for this command.
-//! \param ui32LBA is the logical block address to read.
-//! \param pui8Data is the data buffer to write out.
-//! \param pui32Size is the size of the buffer.
-//! \param ui32NumBlocks is the number of contiguous blocks to write to the
-//! device.
-//!
-//! \return This function returns the results of the SCSI Write(10) command.
-//! The value will be either \b SCSI_CMD_STATUS_PASS or
-//! \b SCSI_CMD_STATUS_FAIL.
-//
-//*****************************************************************************
-uint32_t
-USBHSCSIWrite10(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t *pui32Size, uint32_t ui32NumBlocks)
-{
- tMSCCBW sSCSICmd;
- uint32_t *pui32Data;
-
- //
- // Create a local 32-bit pointer to the command.
- //
- pui32Data = (uint32_t *)sSCSICmd.CBWCB;
-
- //
- // This is an IN request.
- //
- sSCSICmd.bmCBWFlags = CBWFLAGS_DIR_OUT;
-
- //
- // Only handle LUN 0.
- //
- sSCSICmd.bCBWLUN = 0;
-
- //
- // Set the size of the command data.
- //
- sSCSICmd.bCBWCBLength = 10;
-
- //
- // Set the parameter options.
- //
- sSCSICmd.CBWCB[0] = SCSI_WRITE_10;
-
- //
- // Clear the reserved field.
- //
- sSCSICmd.CBWCB[1] = 0;
-
- //
- // LBA starts at offset 2.
- //
- sSCSICmd.CBWCB[2] = (uint8_t)(ui32LBA >> 24);
- sSCSICmd.CBWCB[3] = (uint8_t)(ui32LBA >> 16);
- sSCSICmd.CBWCB[4] = (uint8_t)(ui32LBA >> 8);
- sSCSICmd.CBWCB[5] = (uint8_t)ui32LBA;
-
- //
- // Clear the reserved field.
- //
- sSCSICmd.CBWCB[6] = 0;
-
- //
- // Set the transfer length in blocks.
- // This also sets the Control value to 0 at offset 9.
- //
- sSCSICmd.CBWCB[7] = (ui32NumBlocks & 0xFF00) >> 8;
-
- //
- // The blocks go into is byte offset 8 or word address 2.
- //
- pui32Data[2] = (ui32NumBlocks & 0xFF);
-
- //
- // The blocks go into is byte offset 12 or word address 3.
- //
- pui32Data[3] = 0;
-
- //
- // Send the command and get the results.
- //
- return(USBHSCSISendCommand(ui32InPipe, ui32OutPipe, &sSCSICmd, pui8Data,
- pui32Size));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.h
deleted file mode 100644
index 43dfc698b..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/host/usbhscsi.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//*****************************************************************************
-//
-// usbhscsi.h - Definitions for the USB host SCSI layer.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHSCSI_H__
-#define __USBHSCSI_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_host_class
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Prototypes for the APIs exported by the USB SCSI layer.
-//
-//*****************************************************************************
-extern uint32_t USBHSCSIInquiry(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Buffer, uint32_t *pui32Size);
-extern uint32_t USBHSCSIReadCapacity(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size);
-extern uint32_t USBHSCSIReadCapacities(uint32_t ui32InPipe,
- uint32_t ui32OutPipe, uint8_t *pui8Data,
- uint32_t *pui32Size);
-extern uint32_t USBHSCSIModeSense6(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32Flags, uint8_t *pui8Data,
- uint32_t *pui32Size);
-extern uint32_t USBHSCSITestUnitReady(uint32_t ui32InPipe,
- uint32_t ui32OutPipe);
-extern uint32_t USBHSCSIRequestSense(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint8_t *pui8Data, uint32_t *pui32Size);
-extern uint32_t USBHSCSIRead10(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t *pui32Size, uint32_t ui32NumBlocks);
-extern uint32_t USBHSCSIWrite10(uint32_t ui32InPipe, uint32_t ui32OutPipe,
- uint32_t ui32LBA, uint8_t *pui8Data,
- uint32_t *pui32Size, uint32_t ui32NumBlocks);
-
-//*****************************************************************************
-//
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHSCSI_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/readme.txt b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/readme.txt
deleted file mode 100644
index c447fd5e6..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/readme.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This project will build the Tiva USB Library.
-
--------------------------------------------------------------------------------
-
-Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-Software License Agreement
-
-Texas Instruments (TI) is supplying this software for use solely and
-exclusively on TI's microcontroller products. The software is owned by
-TI and/or its suppliers, and is protected under applicable copyright
-laws. You may not combine this software with "viral" open-source
-software in order to form a larger program.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-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. TI SHALL NOT, UNDER ANY
-CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, FOR ANY REASON WHATSOEVER.
-
-This is part of revision 1.1 of the Tiva USB Library.
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usb-ids.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usb-ids.h
deleted file mode 100644
index 824f9b7d5..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usb-ids.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//*****************************************************************************
-//
-// usb-ids.h - Definitions of VIDs and PIDs used by USB library.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBIDS_H__
-#define __USBIDS_H__
-
-//*****************************************************************************
-//
-// TI Vendor ID for devices that use VID as 0x1CBE.
-//
-//*****************************************************************************
-#define USB_VID_TI_1CBE 0x1cbe
-
-//*****************************************************************************
-//
-// Product IDs.
-//
-//*****************************************************************************
-#define USB_PID_MOUSE 0x0000
-#define USB_PID_KEYBOARD 0x0001
-#define USB_PID_SERIAL 0x0002
-#define USB_PID_BULK 0x0003
-#define USB_PID_SCOPE 0x0004
-#define USB_PID_MSC 0x0005
-#define USB_PID_AUDIO 0x0006
-#define USB_PID_COMP_SERIAL 0x0007
-#define USB_PID_COMP_AUDIO_HID 0x0008
-#define USB_PID_COMP_HID_SER 0x0009
-#define USB_PID_COMP_HID_DFU 0x000A
-#define USB_PID_DATA_LOGGER 0x000B
-#define USB_PID_COMP_HID_HID 0x000D
-#define USB_PID_DFU 0x00FF
-
-#endif /* __USBIDS_H__ */
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbaudio.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbaudio.h
deleted file mode 100644
index 7c16676ff..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbaudio.h
+++ /dev/null
@@ -1,718 +0,0 @@
-//*****************************************************************************
-//
-// usbaudio.h - Definitions used by Audio Class devices.
-//
-// Copyright (c) 2009-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBAUDIO_H__
-#define __USBAUDIO_H__
-
-
-//*****************************************************************************
-//
-// Standard Audio descriptor sub types.
-//
-//*****************************************************************************
-#define USB_AI_UNDEFINED 0
-#define USB_AI_HEADER 1
-#define USB_AI_INPUT_TERMINAL 2
-#define USB_AI_OUTPUT_TERMINAL 3
-#define USB_AI_MIXER_UNIT 4
-#define USB_AI_SELECTOR_UNIT 5
-#define USB_AI_FEATURE_UNIT 6
-#define USB_AI_PROCESSING_UNIT 7
-#define USB_AI_EXTENSION_UNIT 8
-
-//*****************************************************************************
-//
-// Standard Audio Streaming Interface descriptor types.
-//
-//*****************************************************************************
-#define USB_AS_UNDEFINED 0
-#define USB_AS_GENERAL 1
-#define USB_AS_FORMAT_TYPE 2
-#define USB_AS_FORMAT_SPECIFIC 3
-
-//*****************************************************************************
-//
-// Standard USB terminal types used with audio terminal descriptors. These
-// are defined in the "Universal Serial Bus Device Class Definition for
-// Terminal Types" version 1.0 released March 18, 1998.
-//
-//*****************************************************************************
-#define USB_TTYPE_UNDEFINED 0x0100
-#define USB_TTYPE_STREAMING 0x0101
-#define USB_TTYPE_VENDOR 0x01ff
-
-#define USB_TTYPE_OUT_UNDEF 0x0300
-#define USB_TTYPE_OUT_SPEAKER 0x0301
-#define USB_TTYPE_OUT_HEADPHONE 0x0302
-#define USB_TTYPE_OUT_DESK_SPKR 0x0304
-#define USB_TTYPE_OUT_ROOM_SPKR 0x0305
-#define USB_TTYPE_OUT_COMM_SPKR 0x0306
-#define USB_TTYPE_OUT_LFE 0x0307
-
-#define USB_TTYPE_EXT_UNDEF 0x0600
-#define USB_TTYPE_EXT_ANALOG 0x0601
-#define USB_TTYPE_EXT_DIGITAL 0x0602
-#define USB_TTYPE_EXT_LINE 0x0603
-#define USB_TTYPE_EXT_LEGACY 0x0604
-#define USB_TTYPE_EXT_SPDIF 0x0605
-#define USB_TTYPE_EXT_1394_DA 0x0606
-#define USB_TTYPE_EXT_1394_DV 0x0607
-
-//*****************************************************************************
-//
-// Audio Interface Subclass Codes
-//
-//*****************************************************************************
-#define USB_ASC_UNDEFINED 0x00
-#define USB_ASC_AUDIO_CONTROL 0x01
-#define USB_ASC_AUDIO_STREAMING 0x02
-#define USB_ASC_MIDI_STREAMING 0x03
-
-//*****************************************************************************
-//
-// Audio Class-Specific Descriptor Types
-// (Table A-4)
-//
-//*****************************************************************************
-#define USB_ACSDT_UNDEFINED 0x20
-#define USB_ACSDT_DEVICE 0x21
-#define USB_ACSDT_CONFIGURATION 0x22
-#define USB_ACSDT_STRING 0x23
-#define USB_ACSDT_INTERFACE 0x24
-#define USB_ACSDT_ENDPOINT 0x25
-
-//*****************************************************************************
-//
-// Audio Class-Specific AC Interface Descriptor Subtypes
-// (Table A-5)
-//
-//*****************************************************************************
-#define USB_ACDSTYPE_UNDEFINED 0x00
-#define USB_ACDSTYPE_HEADER 0x01
-#define USB_ACDSTYPE_IN_TERMINAL 0x02
-#define USB_ACDSTYPE_OUT_TERMINAL 0x03
-#define USB_ACDSTYPE_MIXER_UNIT 0x04
-#define USB_ACDSTYPE_SELECTOR_UNIT 0x05
-#define USB_ACDSTYPE_FEATURE_UNIT 0x06
-#define USB_ACDSTYPE_PROCESSING_UNIT 0x07
-#define USB_ACDSTYPE_EXTENSION_UNIT 0x08
-
-//*****************************************************************************
-//
-// Audio Class-Specific AS Interface Descriptor Subtypes
-// (Table A-6)
-//
-//*****************************************************************************
-#define USB_ASDSTYPE_UNDEFINED 0x00
-#define USB_ASDSTYPE_GENERAL 0x01
-#define USB_ASDSTYPE_FORMAT_TYPE 0x02
-#define USB_ASDSTYPE_FORMAT_SPECIFIC 0x03
-
-//*****************************************************************************
-//
-// Audio Data Format Type I Codes.
-//
-//*****************************************************************************
-#define USB_ADF_UNDEFINED 0x0000
-#define USB_ADF_PCM 0x0001
-#define USB_ADF_PCM8 0x0002
-#define USB_ADF_IEEE_FLOAT 0x0003
-#define USB_ADF_ALAW 0x0004
-#define USB_ADF_MULAW 0x0005
-
-//*****************************************************************************
-//
-// Audio Format Type Codes
-//
-//*****************************************************************************
-#define USB_AF_TYPE_UNDEFINED 0x00
-#define USB_AF_TYPE_TYPE_I 0x01
-#define USB_AF_TYPE_TYPE_II 0x02
-#define USB_AF_TYPE_TYPE_III 0x03
-
-//*****************************************************************************
-//
-// Audio Class-Specific controls used with bmaControls values.
-//
-//*****************************************************************************
-#define USB_ACONTROL_MUTE 0x0001 // Mute
-#define USB_ACONTROL_VOLUME 0x0002 // Volume
-#define USB_ACONTROL_BASS 0x0004 // Bass
-#define USB_ACONTROL_MID 0x0008 // Mid
-#define USB_ACONTROL_TREBLE 0x0010 // Treble
-#define USB_ACONTROL_EQ 0x0020 // Graphic Equalizer
-#define USB_ACONTROL_AGC 0x0040 // Automatic Gain
-#define USB_ACONTROL_DELAY 0x0080 // Delay
-#define USB_ACONTROL_BASS_BOOST 0x0100 // Bass Boost
-#define USB_ACONTROL_LOUD 0x0200 // Loudness
-
-//*****************************************************************************
-//
-// Audio Class-Specific Output terminal types.
-//
-//*****************************************************************************
-#define USB_ATTYPE_UNDEFINED 0x0300 // Output Terminal, undefined Type.
-#define USB_ATTYPE_SPEAKER 0x0301 // A generic speaker.
-#define USB_ATTYPE_HEADPHONES 0x0302 // A head-mounted audio output device.
-#define USB_ATTYPE_HMD 0x0303 // The audio part of a VR head mounted
- // display.
-#define USB_ATTYPE_SPEAKER_DT 0x0304 // Desktop or Monitor speaker(s).
-#define USB_ATTYPE_SPEAKER_RM 0x0305 // Larger room speaker(s).
-#define USB_ATTYPE_SPEAKER_COM 0x0306 // Communications Speaker (phone).
-#define USB_ATTYPE_SPEAKER_LFE 0x0307 // Speaker designed for low
- // frequencies.
-
-//*****************************************************************************
-//
-// USB Audio channel configuration bits for wChannelConfig values.
-// wChannelConfig: a bit field that indicates which spatial locations are
-// present in the cluster. The bit allocations are as follows:
-//
-//*****************************************************************************
-#define USB_CHANNEL_L 0x0001 // Left Front (L)
-#define USB_CHANNEL_R 0x0002 // Right Front (R)
-#define USB_CHANNEL_C 0x0004 // Center Front (C)
-#define USB_CHANNEL_LFE 0x0008 // Low Frequency Enhancement (LFE)
-#define USB_CHANNEL_LS 0x0010 // Left Surround (LS)
-#define USB_CHANNEL_RS 0x0020 // Right Surround (RS)
-#define USB_CHANNEL_LC 0x0040 // Left of Center (LC)
-#define USB_CHANNEL_RC 0x0080 // Right of Center (RC)
-#define USB_CHANNEL_S 0x0100 // Surround (S)
-#define USB_CHANNEL_SL 0x0200 // Side Left (SL)
-#define USB_CHANNEL_SR 0x0400 // Side Right (SR)
-#define USB_CHANNEL_T 0x0800 // Top (T)
-
-//*****************************************************************************
-//
-// Endpoint attributes for Audio Class General type.
-//
-//*****************************************************************************
-#define USB_EP_ATTR_ACG_SAMPLING 0x01 // Sampling Frequency
-#define USB_EP_ATTR_ACG_PITCH 0x02 // Pitch
-#define USB_EP_ATTR_ACG_MAXPACKET 0x80 // MaxPacketsOnly
-
-//*****************************************************************************
-//
-// Indicates the units used for the wLockDelay field for Audio Class General
-// type.
-//
-//*****************************************************************************
-#define USB_EP_LOCKDELAY_UNDEF 0x00 // Undefined
-#define USB_EP_LOCKDELAY_MS 0x01 // Milliseconds
-#define USB_EP_LOCKDELAY_PCM 0x02 // Decoded PCM samples
-
-//*****************************************************************************
-//
-// Audio Class-Specific Request Codes
-//
-//*****************************************************************************
-#define USB_AC_SET_CUR 0x01
-#define USB_AC_SET_MIN 0x02
-#define USB_AC_SET_MAX 0x03
-#define USB_AC_SET_RES 0x04
-#define USB_AC_SET_MEM 0x05
-#define USB_AC_GET_CUR 0x81
-#define USB_AC_GET_MIN 0x82
-#define USB_AC_GET_MAX 0x83
-#define USB_AC_GET_RES 0x84
-#define USB_AC_GET_MEM 0x85
-#define USB_AC_GET_STAT 0xff
-
-#define USB_CS_CONTROL_M 0xff00
-#define USB_CS_CHANNEL_M 0x00ff
-
-//*****************************************************************************
-//
-// Endpoint Control Selectors
-//
-//*****************************************************************************
-#define EP_CONTROL_UNDEFINED 0x0000
-#define SAMPLING_FREQ_CONTROL 0x0100
-#define PITCH_CONTROL 0x0200
-
-//*****************************************************************************
-//
-// Feature Unit Control Selectors
-//
-//*****************************************************************************
-#define FU_CONTROL_UNDEFINED 0x0000
-#define MUTE_CONTROL 0x0100
-#define VOLUME_CONTROL 0x0200
-#define BASS_CONTROL 0x0300
-#define MID_CONTROL 0x0400
-#define TREBLE_CONTROL 0x0500
-#define EQUALIZER_CONTROL 0x0600
-#define AUTOMATIC_GAIN_CONTROL 0x0700
-#define DELAY_CONTROL 0x0800
-#define BASS_BOOST_CONTROL 0x0900
-#define LOUDNESS_CONTROL 0x0A00
-
-//*****************************************************************************
-//
-// All structures defined in this section of the header require byte packing of
-// fields. This is usually accomplished using the PACKED macro but, for IAR
-// Embedded Workbench, this requires a pragma.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-//! This structure describes the Class-Specific Audio Class Interface Header
-//! Descriptor as defined in Universal Serial Bus Device Class Definition
-//! for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_DSUBTYPE_HEADER for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Audio Device Class Specification Release Number in Binary-Coded
- //! Decimal.
- //
- uint16_t bcdADC;
-
- //
- //! Total number of bytes returned for the class-specific AudioControl
- //! interface descriptor. Includes the combined length of this descriptor
- //! header and all Unit and Terminal descriptors.
- //
- uint16_t wTotai32Length;
-
- //
- //! The number of AudioStreaming and MIDIStreaming interfaces in the Audio
- //! Interface Collection to which this AudioControl interface belongs.
- //
- uint8_t bInCollection;
-
- //
- //! Interface number of the first AudioStreaming or MIDIStreaming interface
- //! in the Collection.
- //
- uint8_t baInterfaceNr;
-}
-PACKED tACHeader;
-
-//*****************************************************************************
-//
-// These are the possible bits set in the tACInputTerminal.wChannelConfig
-// value.
-//
-//*****************************************************************************
-#define USB_AC_CC_LEFT 0x0001
-#define USB_AC_CC_RIGHT 0x0002
-#define USB_AC_CC_CENTER 0x0004
-#define USB_AC_CC_LFE 0x0008
-#define USB_AC_CC_LEFTSURROUND 0x0010
-#define USB_AC_CC_RIGHTSURROUND 0x0020
-#define USB_AC_CC_LEFT_CENTER 0x0040
-#define USB_AC_CC_RIGHT_CENTER 0x0080
-#define USB_AC_CC_SURROUND 0x0100
-#define USB_AC_CC_SIDE_LEFT 0x0200
-#define USB_AC_CC_SIDE_RIGHT 0x0400
-#define USB_AC_CC_TOP 0x0800
-
-//*****************************************************************************
-//
-//! This structure describes the Feature Unit Descriptor as defined in
-//! Universal Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_DSUBTYPE_IN_TERM for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Constant uniquely identifying the Unit within the audio function. This
- //! value is used in all requests to address this Unit.
- //
- uint8_t bUnitID;
-
- //
- //! ID of the Unit or Terminal to which this Feature Unit is connected.
- //
- uint8_t bSourceID;
-
- //
- //! ID of the Output Terminal to which this Input Terminal is associated.
- //
- uint8_t bControlSize;
-
- //
- //! A bit set to 1 indicates that the mentioned Control is supported for
- //! a given channel. See the USB_FU_* defines for the bit definitions.
- //! This actually an array of elements of size bControlSize so be
- //! careful when using this value directly.
- //
- uint16_t bmaControls;
-}
-PACKED tACFeatureUnit;
-
-//*****************************************************************************
-//
-//! This structure describes the Output Terminal Descriptor as defined in
-//! Universal Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_DSUBTYPE_OUT_TERM for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Constant uniquely identifying the Terminal within the audio function.
- //! This value is used in all requests to address this Terminal.
- //
- uint8_t bTerminalID;
-
- //
- //! Constant characterizing the type of Terminal. See USB Audio Terminal
- //! Types.
- //
- uint16_t wTerminalType;
-
- //
- //! Constant, identifying the Input Terminal to which this Output Terminal
- //! is associated.
- //
- uint8_t bAssocTerminal;
-
- //
- //! ID of the Unit or Terminal to which this Terminal is connected.
- //
- uint8_t bSourceID;
-
- //
- //! Index of a string descriptor, describing the Output Terminal.
- //
- uint8_t iTerminal;
-}
-PACKED tACOutputTerminal;
-
-//*****************************************************************************
-//
-//! This structure describes the Input Terminal Descriptor as defined in
-//! Universal Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_DSUBTYPE_OUT_TERM for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Constant uniquely identifying the Terminal within the audio function.
- //! This value is used in all requests to address this Terminal.
- //
- uint8_t bTerminalID;
-
- //
- //! Constant characterizing the type of Terminal. See USB Audio Terminal
- //! Types.
- //
- uint16_t wTerminalType;
-
- //
- //! Constant, identifying the Input Terminal to which this Output Terminal
- //! is associated.
- //
- uint8_t bAssocTerminal;
-
- //
- //! Number of logical output channels in the Terminal's output audio
- //! channel cluster.
- //
- uint8_t bNrChannels;
-
- //
- //! Describes the spatial location of the logical channels.
- //
- uint16_t wChannelConfig;
-
- //
- //! Index of a string descriptor, describing the name of the first logical
- //! channel.
- //
- uint8_t iChannelNames;
-
- //
- //! Index of a string descriptor, describing the Output Terminal.
- //
- uint8_t iTerminal;
-}
-PACKED tACInputTerminal;
-
-//*****************************************************************************
-//
-//! This structure describes the Mixer Descriptor as defined in Universal
-//! Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_AI_MIXER_UNIT for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Constant uniquely identifying the Unit within the audio function. This
- //! value is used in all requests to address this Unit.
- //
- uint8_t bUnitID;
-
- //
- //! Number of Input Pins of this Unit.
- //
- uint8_t bNrInPins;
-
- //
- //! ID of the Unit or Terminal to which the first Input Pin of this Mixer
- //! Unit is connected.
- //
- uint8_t baSourceID;
-}
-PACKED tACMixer;
-
-//*****************************************************************************
-//
-//! This structure describes the Selector Descriptor as defined in Universal
-//! Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_AI_MIXER_UNIT for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! Constant uniquely identifying the Unit within the audio function. This
- //! value is used in all requests to address this Unit.
- //
- uint8_t bUnitID;
-
- //
- //! Number of Input Pins of this Unit.
- //
- uint8_t bNrInPins;
-
- //
- //! ID of the Unit or Terminal to which the first Input Pin of this Mixer
- //! Unit is connected.
- //
- uint8_t baSourceID;
-}
-PACKED tACSelector;
-
-//*****************************************************************************
-//
-//! This structure describes the Output Terminal Descriptor as defined in
-//! Universal Serial Bus Device Class Definition for Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_DSUBTYPE_GENERAL for the header.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! The Terminal ID of the Terminal to which the endpoint of this
- //! interface is connected.
- //
- uint8_t bTerminalLink;
-
- //
- //! Delay introduced by the data path. Expressed in number of frames.
- //
- uint8_t bDelay;
-
- //
- //! The Audio Data Format that has to be used to communicate with this
- //! interface.
- //
- uint16_t wFormatTag;
-}
-PACKED tACGeneral;
-
-//*****************************************************************************
-//
-//! This structure describes the Type I Audio format descriptors defined in
-//! USB Audio Devices Release 1.0.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_CS_INTERFACE (36).
- //
- uint8_t bDescriptorType;
-
- //
- //! This will be USB_AS_FORMAT_TYPE.
- //
- uint8_t bDescriptorSubtype;
-
- //
- //! This will be USB_AS_FORMAT_TYPE_I.
- //
- uint8_t bFormatType;
-
- //
- //! Number of channels on this streaming interface.
- //
- uint8_t bNrChannels;
-
- //
- //! Number of bytes per audio sub-frame or channel.
- //
- uint8_t bSubFrameSize;
-
- //
- //! Number of bits per sample.
- //
- uint8_t bBitResolution;
-
- //
- //! Number of sample rates that are supported.
- //
- uint8_t bSamFreqType;
-
- //
- //! Number of bits per sample.
- //
- uint8_t tSamFreq;
-}
-PACKED tASFormat;
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-#endif
-
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbbuffer.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbbuffer.c
deleted file mode 100644
index d96125cd2..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbbuffer.c
+++ /dev/null
@@ -1,1189 +0,0 @@
-//*****************************************************************************
-//
-// usbbuffer.c - USB buffer object.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_buffer_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Workspace variables required by each buffer instance. This structure is
-// overlaid on the pvWorkspace memory provided in the tUSBBuffer structure
-// passed to USBBufferInit().
-//
-//*****************************************************************************
-typedef struct
-{
- tUSBRingBufObject sRingBuf;
- uint32_t ui32LastSent;
- uint32_t ui32Flags;
-}
-tUSBBufferVars;
-
-//*****************************************************************************
-//
-// Flags which may be set in the tUSBBufferVars ui32Flags field.
-//
-//*****************************************************************************
-#define USB_BUFFER_FLAG_SEND_ZLP 0x00000001
-
-//*****************************************************************************
-//
-// Schedule the next packet transmission to the host if data remains to be
-// sent.
-//
-// \param psBuffer points to the buffer from which a packet transmission is
-// to be scheduled.
-//
-// This function checks to determine whether the lower layer is capable of
-// accepting a new packet for transmission and, if so, schedules the next
-// packet transmission if data remains in the buffer.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-ScheduleNextTransmission(const tUSBBuffer *psBuffer)
-{
- tUSBBufferVars *psBufVars;
- uint32_t ui32Packet, ui32Space, ui32Total, ui32Sent;
-
- //
- // Get a pointer to our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Ask the lower layer if it has space to accept another packet of data.
- //
- ui32Packet = psBuffer->pfnAvailable(psBuffer->pvHandle);
-
- //
- // If we were returned something other than zero, we can write that number
- // of bytes to the lower layer.
- //
- if(ui32Packet)
- {
- //
- // How much contiguous data do we have in the buffer?
- //
- ui32Space = USBRingBufContigUsed(&psBufVars->sRingBuf);
-
- //
- // How much total data do we have in the buffer?
- //
- ui32Total = USBRingBufUsed(&psBufVars->sRingBuf);
-
- //
- // How much data will we be sending as a result of this call?
- //
- ui32Sent = (ui32Packet < ui32Total) ? ui32Packet : ui32Total;
-
- //
- // Write the contiguous bytes to the lower layer assuming there is
- // something to send.
- //
- if(ui32Space)
- {
- //
- // There is data available to send. Update our state to indicate
- // the amount we will be sending in this packet.
- //
- psBufVars->ui32LastSent = ui32Sent;
-
- //
- // Determine the maximum sized block we can send in this transfer.
- //
- ui32Space = (ui32Space < ui32Packet) ? ui32Space : ui32Packet;
- //
- // Call the lower layer to send the new packet. If the current
- // data spans the buffer wrap, tell the lower layer that it can
- // expect a second call to fill the whole packet before it
- // transmits it.
- //
- psBuffer->pfnTransfer(psBuffer->pvHandle,
- (psBufVars->sRingBuf.pui8Buf +
- psBufVars->sRingBuf.ui32ReadIndex),
- ui32Space,
- (((ui32Space < ui32Packet) &&
- (ui32Space < ui32Total)) ? false : true));
-
- //
- // Do we need to send a second part to fill out the packet? This
- // will occur if the current packet spans the buffer wrap.
- //
- if((ui32Space < ui32Packet) && (ui32Space < ui32Total))
- {
- //
- // The packet straddled the wrap. How much space remains in
- // the packet?
- //
- ui32Packet -= ui32Space;
-
- //
- // How much data can we actually send?
- //
- ui32Space = ui32Total - ui32Space;
- ui32Space = (ui32Space > ui32Packet) ? ui32Packet : ui32Space;
-
- psBuffer->pfnTransfer(psBuffer->pvHandle,
- psBufVars->sRingBuf.pui8Buf, ui32Space,
- true);
- }
- }
- else
- {
- //
- // There is no data to send. Did we last send a full packet?
- //
- if(psBufVars->ui32LastSent == ui32Packet)
- {
- //
- // Yes - if necessary, send a zero-length packet back to the
- // host to complete the last transaction.
- //
- if(psBufVars->ui32Flags & USB_BUFFER_FLAG_SEND_ZLP)
- {
- psBufVars->ui32LastSent = 0;
- psBuffer->pfnTransfer(psBuffer->pvHandle,
- psBufVars->sRingBuf.pui8Buf, 0,
- true);
- }
- }
- }
-
- //
- // Don't update the ring buffer read index yet. We do this once we are
- // sure the packet was correctly transmitted.
- //
- }
-}
-
-//*****************************************************************************
-//
-// Handles USB_EVENT_RX_AVAILABLE for a receive buffer.
-//
-// \param psBuffer points to the buffer which is receiving the event.
-// \param ui32Size is the size reported in the event.
-// \param pui8Data is the pointer provided in the event.
-//
-// This function is responsible for reading data from the lower layer into
-// the buffer or, if we had previously passed a section of the buffer to the
-// lower layer for it to write into directly, updating the buffer write pointer
-// to add the new data to the buffer.
-//
-// If the pointer provided is NULL, we call the low level pfnTransfer function
-// to get the new data. If the pointer is not NULL and not within the existing
-// ring buffer, we copy the data directly from the pointer to the buffer and
-// return the number of bytes read.
-//
-// \return Returns the number of bytes read from the lower layer.
-//
-//*****************************************************************************
-static uint32_t
-HandleRxAvailable(tUSBBuffer *psBuffer, uint32_t ui32Size, uint8_t *pui8Data)
-{
- tUSBBufferVars *psBufVars;
- uint32_t ui32Avail, ui32Read, ui32Packet, ui32RetCount;
-
- //
- // Get a pointer to our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Has the data already been read into memory?
- //
- if(pui8Data)
- {
- //
- // Yes - is it already in our ring buffer?
- //
- if((pui8Data >= psBuffer->pui8Buffer) &&
- (pui8Data < psBuffer->pui8Buffer + psBuffer->ui32BufferSize))
- {
- //
- // The data is already in our ring buffer so merely update the
- // write pointer to add the new data.
- //
- USBRingBufAdvanceWrite(&psBufVars->sRingBuf, ui32Size);
-
- //
- // In this case, we pass back 0 to indicate that the lower layer
- // doesn't need to make any buffer pointer updates.
- //
- ui32RetCount = 0;
- }
- else
- {
- //
- // The data is not within our buffer so we need to copy it into
- // the buffer.
- //
- // How much space does the buffer have available?
- //
- ui32Avail = USBRingBufFree(&psBufVars->sRingBuf);
-
- //
- // How much should we copy?
- //
- ui32Read = (ui32Avail < ui32Size) ? ui32Avail : ui32Size;
-
- //
- // Copy the data into the buffer.
- //
- USBRingBufWrite(&psBufVars->sRingBuf, pui8Data, ui32Read);
-
- //
- // We need to return the number of bytes we read in this case
- // since the buffer supplied to us was owned by the lower layer and
- // it may need to update its read pointer.
- //
- ui32RetCount = ui32Read;
- }
- }
- else
- {
- //
- // We were passed a NULL pointer so the low level driver has not read
- // the data into memory yet. We need to call the transfer function to
- // get the packet.
- //
- // How big is the packet that we need to receive?
- //
- ui32Packet = psBuffer->pfnAvailable(psBuffer->pvHandle);
-
- //
- // How much contiguous space do we have in the buffer?
- //
- ui32Avail = USBRingBufContigFree(&psBufVars->sRingBuf);
-
- //
- // Get as much of the packet as we can in the available space.
- //
- ui32Read = psBuffer->pfnTransfer(psBuffer->pvHandle,
- (psBufVars->sRingBuf.pui8Buf +
- psBufVars->sRingBuf.ui32WriteIndex),
- ui32Avail, true);
-
- //
- // Advance the ring buffer write pointer to add our new data.
- //
- if(ui32Read)
- {
- USBRingBufAdvanceWrite(&psBufVars->sRingBuf, ui32Read);
- }
-
- //
- // Did we get the whole packet?
- //
- if(ui32Read < ui32Packet)
- {
- //
- // No - how much space do we have in the buffer?
- //
- ui32Avail = USBRingBufContigFree(&psBufVars->sRingBuf);
-
- //
- // If there is any space left, read as much of the remainder of
- // the packet as we can.
- //
- if(ui32Avail)
- {
- ui32Packet =
- psBuffer->pfnTransfer(psBuffer->pvHandle,
- (psBufVars->sRingBuf.pui8Buf +
- psBufVars->sRingBuf.ui32WriteIndex),
- ui32Avail, true);
-
- //
- // Update the write pointer after we read more data into the
- // buffer.
- //
- if(ui32Packet)
- {
- USBRingBufAdvanceWrite(&psBufVars->sRingBuf, ui32Packet);
- }
- }
- }
-
- //
- // We need to return 0 in this case to indicate that the lower layer
- // need not perform any buffer maintenance as a result of the callback.
- //
- ui32RetCount = 0;
- }
-
- //
- // How much data do we have in the buffer?
- //
- ui32Avail = USBRingBufUsed(&psBufVars->sRingBuf);
-
- //
- // Pass the event on to the client with the current read pointer and
- // available data size. The client is expected to understand the ring
- // structure and be able to deal with wrap if it wants to read the data
- // directly from the buffer.
- //
- ui32Read = psBuffer->pfnCallback(psBuffer->pvCBData,
- USB_EVENT_RX_AVAILABLE, ui32Avail,
- (psBufVars->sRingBuf.pui8Buf +
- psBufVars->sRingBuf.ui32ReadIndex));
-
- //
- // If the client read anything from the buffer, update the read pointer.
- //
- USBRingBufAdvanceRead(&psBufVars->sRingBuf, ui32Read);
-
- //
- // Return the correct value to the low level driver.
- //
- return(ui32RetCount);
-}
-
-//*****************************************************************************
-//
-// Handles USB_EVENT_DATA_REMAINING for a receive buffer.
-//
-// \param psBuffer points to the buffer which is receiving the event.
-//
-// This function determines the total number of bytes of data that remain
-// unprocessed in the client and buffer and reports this back to the caller.
-//
-// \return Returns the number of bytes remaining to be processed.
-//
-//*****************************************************************************
-static uint32_t
-HandleDataRemaining(tUSBBuffer *psBuffer)
-{
- uint32_t ui32BufData, ui32ClientData;
- tUSBBufferVars *psBufVars;
-
- //
- // Get a pointer to our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // How much data does the client currently have buffered?
- //
- ui32ClientData = psBuffer->pfnCallback(psBuffer->pvCBData,
- USB_EVENT_DATA_REMAINING, 0,
- (void *)0);
-
- //
- // How much data do we have in the buffer?
- //
- ui32BufData = USBRingBufUsed(&psBufVars->sRingBuf);
-
- //
- // Return the total number of bytes of unprocessed data to the lower layer.
- //
- return(ui32BufData + ui32ClientData);
-}
-
-//*****************************************************************************
-//
-// Handles USB_EVENT_TX_COMPLETE for a transmit buffer.
-//
-// \param psBuffer points to the buffer which is receiving the event.
-// \param ui32Size is the number of bytes that have been transmitted and
-// acknowledged.
-//
-// This function informs us that data written to the lower layer from a
-// transmit buffer has been successfully transmitted. We use this to update
-// the buffer read pointer and attempt to schedule the next transmission if
-// data remains in the buffer.
-//
-// \return Returns the number of bytes remaining to be processed.
-//
-//*****************************************************************************
-static uint32_t
-HandleTxComplete(tUSBBuffer *psBuffer, uint32_t ui32Size)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Get a pointer to our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Update the transmit buffer read pointer to remove the data that has
- // now been transmitted.
- //
- USBRingBufAdvanceRead(&psBufVars->sRingBuf, ui32Size);
-
- //
- // Try to schedule the next packet transmission if data remains to be
- // sent.
- //
- ScheduleNextTransmission(psBuffer);
-
- //
- // The return code from this event is ignored.
- //
- return(0);
-}
-
-//*****************************************************************************
-//
-// Handles USB_EVENT_REQUEST_BUFFER for a receive buffer.
-//
-// \param psBuffer points to the buffer which is receiving the event.
-// \param ui32Size is the size of the buffer requested.
-// \param ppui8Buffer is a pointer which is to be written with a pointer to
-// the returned buffer.
-//
-// This function is called by a low level driver that wishes to receive data
-// automatically and write it directly to a memory buffer, either using
-// software or DMA prior to issuing USB_EVENT_RX_AVAILABLE. The event is sent
-// in advance of receiving data to provide storage for whatever is received
-// next.
-//
-// If we have a contiguous block of space in the buffer of at least ui32Size
-// bytes immediately in front of the current write pointer, we pass this back
-// otherwise we send NULL indicating that the next packet should be notified
-// using a standard USB_EVENT_RX_AVAILABLE event without being received
-// automatically. Note that the USB_EVENT_REQUEST_BUFFER protocol allows us to
-// return less than \e ui32Size bytes if we know how much data is expected next
-// but this is not possible here since the USBBuffer knows nothing about the
-// protocol whose data it is handling.
-//
-// \return Returns the number of bytes remaining to be processed.
-//
-//*****************************************************************************
-static uint32_t
-HandleRequestBuffer(tUSBBuffer *psBuffer, uint32_t ui32Size,
- uint8_t **ppui8Buffer)
-{
- tUSBBufferVars *psBufVars;
- uint32_t ui32Space;
-
- //
- // Get a pointer to our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // How much contiguous space do we have available?
- //
- ui32Space = USBRingBufContigFree(&psBufVars->sRingBuf);
-
- //
- // Is there enough space available to satisfy the request?
- //
- if(ui32Space >= ui32Size)
- {
- //
- // Yes - return the current write pointer
- //
- *ppui8Buffer = psBufVars->sRingBuf.pui8Buf +
- psBufVars->sRingBuf.ui32WriteIndex;
- return(ui32Size);
- }
- else
- {
- //
- // We do not have enough contiguous space following the current write
- // pointer to satisfy the request so do not provide a buffer.
- //
- *ppui8Buffer = (uint8_t *)0;
- return(0);
- }
-}
-
-//*****************************************************************************
-//
-//! Initializes a USB buffer object to be used with a given USB controller and
-//! device or host class driver.
-//!
-//! \param psBuffer points to a structure containing information on the buffer
-//! memory to be used and the underlying device or host class driver whose data
-//! is to be buffered. This structure must remain accessible for as long as
-//! the buffer is in use.
-//!
-//! This function is used to initialize a USB buffer object and insert it
-//! into the function and callback interfaces between an underlying driver
-//! and the application. The caller supplies information on both the RAM
-//! to be used to buffer data, the type of buffer to be created (transmit or
-//! receive) and the functions to be called in the lower layer to transfer
-//! data to or from the USB controller.
-//!
-//! \return Returns the original buffer structure pointer if successful or
-//! NULL if an error is detected.
-//
-//*****************************************************************************
-const tUSBBuffer *
-USBBufferInit(const tUSBBuffer *psBuffer)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer && psBuffer->pvWorkspace && psBuffer->pui8Buffer &&
- psBuffer->ui32BufferSize && psBuffer->pfnAvailable &&
- psBuffer->pfnTransfer && psBuffer->pfnCallback);
-
- //
- // Get a pointer to the buffer workspace and initialize the variables it
- // contains.
- //
- psBufVars = psBuffer->pvWorkspace;
- psBufVars->ui32Flags = 0;
- USBRingBufInit(&psBufVars->sRingBuf, psBuffer->pui8Buffer,
- psBuffer->ui32BufferSize);
-
- //
- // If all is well, return the same pointer we were originally passed.
- //
- return(psBuffer);
-}
-
-//*****************************************************************************
-//
-//! Enables or disables zero-length packet insertion.
-//!
-//! \param psBuffer is the pointer to the buffer instance whose information
-//! is being queried.
-//! \param bSendZLP is \b true to send zero-length packets or \b false to
-//! prevent them from being sent.
-//!
-//! This function allows the use of zero-length packets to be controlled by
-//! an application. In cases where the USB buffer has sent a full (64 byte)
-//! packet and then discovers that the transmit buffer is empty, the default
-//! behavior is to do nothing. Some protocols, however, require that a zero-
-//! length packet be inserted to signal the end of the data. When using such
-//! a protocol, this function should be called with \e bSendZLP set to \b true
-//! to enable the desired behavior.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBBufferZeroLengthPacketInsert(const tUSBBuffer *psBuffer, bool bSendZLP)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Set the flag telling us whether or not to send a zero-length packet
- // after sending a 64 bytes packet and finding no more data to send.
- //
- if(bSendZLP)
- {
- //
- // Enable ZLP transmission.
- //
- psBufVars->ui32Flags |= USB_BUFFER_FLAG_SEND_ZLP;
- }
- else
- {
- //
- // Disable ZLP transmission.
- //
- psBufVars->ui32Flags &= ~ USB_BUFFER_FLAG_SEND_ZLP;
- }
-}
-
-//*****************************************************************************
-//
-//! Returns the current ring buffer indices for this USB buffer.
-//!
-//! \param psBuffer is the pointer to the buffer instance whose information
-//! is being queried.
-//! \param psRingBuf is a pointer to storage that will be written with the
-//! current ring buffer control structure for this USB buffer.
-//!
-//! This function is provided to aid a client wishing to write data directly
-//! into the USB buffer rather than using the USBBufferWrite() function. This
-//! may be necessary to control when the USBBuffer starts transmission of a
-//! large block of data, for example.
-//!
-//! A transmit buffer will immediately send a new packet on any call to
-//! USBBufferWrite() if the underlying layer indicates that a transmission can
-//! be started. In some cases this is not desirable and a client may wish to
-//! wishes to write more data to the buffer in advance of starting transmission
-//! to the lower layer. In such cases, this function may be called to retrieve
-//! the current ring buffer indices and the buffer accessed directly. Once the
-//! client has written all data it wishes to send, it should call function
-//! USBBufferDataWritten() to indicate that transmission may begin.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBBufferInfoGet(const tUSBBuffer *psBuffer, tUSBRingBufObject *psRingBuf)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer && psRingBuf);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Copy the current ring buffer settings to the clients storage.
- //
- *psRingBuf = psBufVars->sRingBuf;
-}
-
-//*****************************************************************************
-//
-//! Indicates that a client has written data directly into the buffer and
-//! wishes to start transmission.
-//!
-//! \param psBuffer is the pointer to the buffer instance into which data has
-//! been written.
-//! \param ui32Length is the number of bytes of data that the client has
-//! written.
-//!
-//! This function updates the USB buffer write pointer and starts transmission
-//! of the data in the buffer assuming the lower layer is ready to receive a
-//! new packet. The function is provided to aid a client wishing to write
-//! data directly into the USB buffer rather than using the USBBufferWrite()
-//! function. This may be necessary to control when the USB buffer starts
-//! transmission of a large block of data, for example.
-//!
-//! A transmit buffer will immediately send a new packet on any call to
-//! USBBufferWrite() if the underlying layer indicates that a transmission can
-//! be started. In some cases this is not desirable and a client may wish to
-//! write more data to the buffer in advance of starting transmission
-//! to the lower layer. In such cases, USBBufferInfoGet() may be called to
-//! retrieve the current ring buffer indices and the buffer accessed directly.
-//! Once the client has written all data it wishes to send (taking care to
-//! handle the ring buffer wrap), it should call this function to indicate that
-//! transmission may begin.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBBufferDataWritten(const tUSBBuffer *psBuffer, uint32_t ui32Length)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Advance the ring buffer write pointer to include the newly written
- // data.
- //
- if(ui32Length)
- {
- USBRingBufAdvanceWrite(&psBufVars->sRingBuf, ui32Length);
- }
-
- //
- // Try to schedule a new packet transmission.
- //
- ScheduleNextTransmission(psBuffer);
-}
-
-//*****************************************************************************
-//
-//! Indicates that a client has read data directly out of the buffer.
-//!
-//! \param psBuffer is the pointer to the buffer instance from which data has
-//! been read.
-//! \param ui32Length is the number of bytes of data that the client has read.
-//!
-//! This function updates the USB buffer read pointer to remove data that
-//! the client has read directly rather than via a call to USBBufferRead().
-//! The function is provided to aid a client wishing to minimize data copying.
-//! To read directly from the buffer, a client must call USBBufferInfoGet() to
-//! retrieve the current buffer inpsBufVarsdices. With this information, the
-//! data following the current read index can be read. Once the client has
-//! processed much data as it needs, USBBufferDataRemoved() must be called to
-//! advance the read pointer past the data that has been read and free up that
-//! section of the buffer. The client must take care to correctly handle the
-//! wrap point if accessing the buffer directly.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBBufferDataRemoved(const tUSBBuffer *psBuffer, uint32_t ui32Length)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Advance the ring buffer write pointer to include the newly written
- // data.
- //
- if(ui32Length)
- {
- USBRingBufAdvanceRead(&psBufVars->sRingBuf, ui32Length);
- }
-}
-
-//*****************************************************************************
-//
-//! Sets the callback pointer supplied to clients of this buffer.
-//!
-//! \param psBuffer is the pointer to the buffer instance whose callback data
-//! is to be changed.
-//! \param pvCBData is the pointer the client wishes to receive on all future
-//! callbacks from this buffer.
-//!
-//! This function sets the callback pointer which this buffer will supply
-//! to clients as the \e pvCBData parameter in all future calls to the
-//! event callback.
-//!
-//! \note If this function is to be used, the application must ensure that the
-//! tUSBBuffer structure used to describe this buffer is held in RAM rather
-//! than flash. The \e pvCBData value passed is written directly into this
-//! structure.
-//!
-//! \return Returns the previous callback pointer set for the buffer.
-//
-//*****************************************************************************
-void *
-USBBufferCallbackDataSet(tUSBBuffer *psBuffer, void *pvCBData)
-{
- void *pvOldData;
-
- //
- // Keep a copy of the old callback data.
- //
- pvOldData = psBuffer->pvCBData;
-
- //
- // Replace the callback data with the new value.
- //
- psBuffer->pvCBData = pvCBData;
-
- //
- // Give the caller the old value back.
- //
- return(pvOldData);
-}
-
-//*****************************************************************************
-//
-//! Writes a block of data to the transmit buffer and queues it for
-//! transmission to the USB controller.
-//!
-//! \param psBuffer points to the pointer instance into which data is to be
-//! written.
-//! \param pui8Data points to the first byte of data which is to be written.
-//! \param ui32Length is the number of bytes of data to write to the buffer.
-//!
-//! This function copies the supplied data into the transmit buffer. The
-//! transmit buffer data will be packetized according to the constraints
-//! imposed by the lower layer in use and sent to the USB controller as soon as
-//! possible. Once a packet is transmitted and acknowledged, a
-//! \b USB_EVENT_TX_COMPLETE event will be sent to the application callback
-//! indicating the number of bytes that have been sent from the buffer.
-//!
-//! Attempts to send more data than there is space for in the transmit buffer
-//! will result in fewer bytes than expected being written. The value returned
-//! by the function indicates the actual number of bytes copied to the buffer.
-//!
-//! \return Returns the number of bytes actually written.
-//
-//*****************************************************************************
-uint32_t
-USBBufferWrite(const tUSBBuffer *psBuffer, const uint8_t *pui8Data,
- uint32_t ui32Length)
-{
- uint32_t ui32Space;
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer && pui8Data);
- ASSERT(psBuffer->bTransmitBuffer == true);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // How much space is left in the buffer?
- //
- ui32Space = USBRingBufFree(&psBufVars->sRingBuf);
-
- //
- // How many bytes will we write?
- //
- ui32Length = (ui32Length > ui32Space) ? ui32Space : ui32Length;
-
- //
- // Write the data to the buffer.
- //
- if(ui32Length)
- {
- USBRingBufWrite(&psBufVars->sRingBuf, pui8Data, ui32Length);
- }
-
- //
- // Try to transmit the next packet to the host.
- //
- ScheduleNextTransmission(psBuffer);
-
- //
- // Tell the caller how many bytes we wrote to the buffer.
- //
- return(ui32Length);
-}
-
-//*****************************************************************************
-//
-//! Flushes a USB buffer, discarding any data that it contains.
-//!
-//! \param psBuffer is the pointer to the buffer instance which is to be
-//! flushed.
-//!
-//! This function discards all data currently in the supplied buffer without
-//! processing (transmitting it via the USB controller or passing it to the
-//! client depending upon the buffer mode).
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBBufferFlush(const tUSBBuffer *psBuffer)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Flush the ring buffer.
- //
- USBRingBufFlush(&psBufVars->sRingBuf);
-}
-
-//*****************************************************************************
-//
-//! Reads a block of data from a USB receive buffer into storage supplied by
-//! the caller.
-//!
-//! \param psBuffer is the pointer to the buffer instance from which data is
-//! to be read.
-//! \param pui8Data points to a buffer into which the received data will be
-//! written.
-//! \param ui32Length is the size of the buffer pointed to by pui8Data.
-//!
-//! This function reads up to \e ui32Length bytes of data received from the USB
-//! host into the supplied application buffer. If the receive buffer
-//! contains fewer than \e ui32Length bytes of data, the data that is present
-//! will be copied and the return code will indicate the actual number of bytes
-//! copied to \e pui8Data.
-//!
-//! \return Returns the number of bytes of data read.
-//
-//*****************************************************************************
-uint32_t
-USBBufferRead(const tUSBBuffer *psBuffer, uint8_t *pui8Data,
- uint32_t ui32Length)
-{
- tUSBBufferVars *psBufVars;
- uint32_t ui32Avail, ui32Read;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer && pui8Data && ui32Length);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // How much data is in the buffer?
- //
- ui32Avail = USBRingBufUsed(&psBufVars->sRingBuf);
-
- //
- // Determine how many bytes we can actually read.
- //
- ui32Read = (ui32Avail < ui32Length) ? ui32Avail : ui32Length;
-
- //
- // Read the data from the buffer assuming there is some to read.
- //
- if(ui32Read)
- {
- USBRingBufRead(&psBufVars->sRingBuf, pui8Data, ui32Read);
- }
-
- //
- // Tell the caller how many bytes we wrote to their buffer.
- //
- return(ui32Read);
-}
-
-//*****************************************************************************
-//
-//! Returns the number of bytes of data available in the buffer.
-//!
-//! \param psBuffer is the pointer to the buffer instance which is to be
-//! queried.
-//!
-//! This function may be used to determine the number of bytes of data in a
-//! buffer. For a receive buffer, this indicates the number of bytes that the
-//! client can read from the buffer using USBBufferRead(). For a transmit
-//! buffer, this indicates the amount of data that remains to be sent to the
-//! USB controller.
-//!
-//! \return Returns the number of bytes of data in the buffer.
-//
-//*****************************************************************************
-uint32_t
-USBBufferDataAvailable(const tUSBBuffer *psBuffer)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Return the amount of data in the buffer.
- //
- return(USBRingBufUsed(&psBufVars->sRingBuf));
-}
-
-//*****************************************************************************
-//
-//! Returns the number of free bytes in the buffer.
-//!
-//! \param psBuffer is the pointer to the buffer instance which is to be
-//! queried.
-//!
-//! This function returns the number of free bytes in the buffer. For a
-//! transmit buffer, this indicates the maximum number of bytes that can be
-//! passed on a call to USBBufferWrite() and accepted for transmission. For a
-//! receive buffer, it indicates the number of bytes that can be read from the
-//! USB controller before the buffer will be full.
-//!
-//! \return Returns the number of free bytes in the buffer.
-//
-//*****************************************************************************
-uint32_t
-USBBufferSpaceAvailable(const tUSBBuffer *psBuffer)
-{
- tUSBBufferVars *psBufVars;
-
- //
- // Check parameter validity.
- //
- ASSERT(psBuffer);
-
- //
- // Get our workspace variables.
- //
- psBufVars = psBuffer->pvWorkspace;
-
- //
- // Return the amount of space available in the buffer.
- //
- return(USBRingBufFree(&psBufVars->sRingBuf));
-}
-
-//*****************************************************************************
-//
-//! Called by the USB buffer to notify the client of asynchronous events.
-//!
-//! \param pvCBData is the client-supplied callback pointer associated with
-//! this buffer instance.
-//! \param ui32Event is the identifier of the event being sent. This will be
-//! a general event identifier of the form \b USBD_EVENT_xxxx or a device
-//! class-dependent event of the form \b USBD_CDC_EVENT_xxx or
-//! \b USBD_HID_EVENT_xxx.
-//! \param ui32MsgValue is an event-specific parameter value.
-//! \param pvMsgData is an event-specific data pointer.
-//!
-//! This function is the USB buffer event handler that applications should
-//! register with the USB device class driver as the callback for the channel
-//! which is to be buffered using this buffer.
-//!
-//! \note This function will never be called by an application. It is the
-//! handler that allows the USB buffer to be inserted above the device class
-//! driver or host pipe driver and below the application to offer buffering
-//! support.
-//!
-//! \return The return value is dependent upon the event being processed.
-//
-//*****************************************************************************
-uint32_t
-USBBufferEventCallback(void *pvCBData, uint32_t ui32Event,
- uint32_t ui32MsgValue, void *pvMsgData)
-{
- tUSBBuffer *psBuffer;
-
- //
- // Get our instance data pointers from the callback data.
- //
- psBuffer = (tUSBBuffer *)pvCBData;
- ASSERT(psBuffer);
-
- //
- // Which event have we been sent?
- //
- switch(ui32Event)
- {
- //
- // Data is available from the lower layer.
- //
- case USB_EVENT_RX_AVAILABLE:
- {
- //
- // This event is only relevant to us if we are a receive buffer.
- //
- if(!psBuffer->bTransmitBuffer)
- {
- return(HandleRxAvailable(psBuffer, ui32MsgValue, pvMsgData));
- }
- break;
- }
-
- //
- // We are being asked how much data remains to be processed.
- //
- case USB_EVENT_DATA_REMAINING:
- {
- return(HandleDataRemaining(psBuffer));
- }
-
- //
- // A previous transmission has completed.
- //
- case USB_EVENT_TX_COMPLETE:
- {
- //
- // This event is only relevant to us if we are a transmit buffer.
- //
- if(psBuffer->bTransmitBuffer)
- {
- //
- // Handle the message then drop out of the switch so that the
- // event is echoed to the layer above.
- //
- HandleTxComplete(psBuffer, ui32MsgValue);
- }
- break;
- }
-
- //
- // We are being asked to provide a buffer into which the next packet
- // can be received.
- //
- case USB_EVENT_REQUEST_BUFFER:
- {
- //
- // This event is only relevant to us if we are a receive buffer.
- //
- if(!psBuffer->bTransmitBuffer)
- {
- return(HandleRequestBuffer(psBuffer, ui32MsgValue, pvMsgData));
- }
- break;
- }
-
- //
- // All other events are merely passed through to the client.
- //
- default:
- {
- break;
- }
- }
-
- //
- // If we drop out of the switch, we need to pass the event on to the client
- // unmodified and return the relevant return code back to the lower layer.
- //
- return(psBuffer->pfnCallback(psBuffer->pvCBData, ui32Event, ui32MsgValue,
- pvMsgData));
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbcdc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbcdc.h
deleted file mode 100644
index 62705745b..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbcdc.h
+++ /dev/null
@@ -1,947 +0,0 @@
-//*****************************************************************************
-//
-// usbhid.h - Definitions used by Communication Device Class devices.
-//
-// Copyright (c) 2007-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Note: This header contains definitions related to the USB Communication
-// Device Class specification. The header is complete for ACM model
-// devices but request and notification definitions specific to other
-// modem types, ISDN, ATM and Ethernet are currently incomplete or
-// omitted.
-//
-//*****************************************************************************
-
-#ifndef __USBCDC_H__
-#define __USBCDC_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup cdc_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Generic macros to read an 8-bit, 16-bit or 32-bit value from a character
-// pointer.
-//
-//*****************************************************************************
-#define BYTE(pui8Data) (*(uint8_t *)(pui8Data))
-#define SHORT(pui8Data) (*(uint16_t *)(pui8Data))
-#define LONG(pui8Data) (*(uint32_t *)(pui8Data))
-
-//*****************************************************************************
-//
-// USB CDC subclass codes. Used in interface descriptor, bInterfaceClass
-//
-//*****************************************************************************
-#define USB_CDC_SUBCLASS_DIRECT_LINE_MODEL \
- 0x01
-#define USB_CDC_SUBCLASS_ABSTRACT_MODEL \
- 0x02
-#define USB_CDC_SUBCLASS_TELEPHONE_MODEL \
- 0x03
-#define USB_CDC_SUBCLASS_MULTI_CHANNEL_MODEL \
- 0x04
-#define USB_CDC_SUBCLASS_CAPI_MODEL \
- 0x05
-#define USB_CDC_SUBCLASS_ETHERNET_MODEL \
- 0x06
-#define USB_CDC_SUBCLASS_ATM_MODEL \
- 0x07
-
-//*****************************************************************************
-//
-// USB CDC control interface protocols. Used in control interface descriptor,
-// bInterfaceProtocol
-//
-//*****************************************************************************
-#define USB_CDC_PROTOCOL_NONE 0x00
-#define USB_CDC_PROTOCOL_V25TER 0x01
-#define USB_CDC_PROTOCOL_VENDOR 0xFF
-
-//*****************************************************************************
-//
-// USB CDC data interface protocols. Used in data interface descriptor,
-// bInterfaceProtocol
-//
-//*****************************************************************************
-// USB_CDC_PROTOCOL_NONE 0x00
-#define USB_CDC_PROTOCOL_I420 0x30
-#define USB_CDC_PROTOCOL_TRANSPARENT \
- 0x32
-#define USB_CDC_PROTOCOL_Q921M 0x50
-#define USB_CDC_PROTOCOL_Q921 0x51
-#define USB_CDC_PROTOCOL_Q921TM 0x52
-#define USB_CDC_PROTOCOL_V42BIS 0x90
-#define USB_CDC_PROTOCOL_Q921EURO \
- 0x91
-#define USB_CDC_PROTOCOL_V120 0x92
-#define USB_CDC_PROTOCOL_CAPI20 0x93
-#define USB_CDC_PROTOCOL_HOST_DRIVER \
- 0xFD
-#define USB_CDC_PROTOCOL_CDC_SPEC \
- 0xFE
-// USB_CDC_PROTOCOL_VENDOR 0xFF
-
-//*****************************************************************************
-//
-// Functional descriptor definitions
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Functional descriptor types
-//
-//*****************************************************************************
-#define USB_CDC_CS_INTERFACE 0x24
-#define USB_CDC_CS_ENDPOINT 0x25
-
-//*****************************************************************************
-//
-// Functional descriptor subtypes
-//
-//*****************************************************************************
-#define USB_CDC_FD_SUBTYPE_HEADER \
- 0x00
-#define USB_CDC_FD_SUBTYPE_CALL_MGMT \
- 0x01
-#define USB_CDC_FD_SUBTYPE_ABSTRACT_CTL_MGMT \
- 0x02
-#define USB_CDC_FD_SUBTYPE_DIRECT_LINE_MGMT \
- 0x03
-#define USB_CDC_FD_SUBTYPE_TELEPHONE_RINGER \
- 0x04
-#define USB_CDC_FD_SUBTYPE_LINE_STATE_CAPS \
- 0x05
-#define USB_CDC_FD_SUBTYPE_UNION \
- 0x06
-#define USB_CDC_FD_SUBTYPE_COUNTRY \
- 0x07
-#define USB_CDC_FD_SUBTYPE_TELEPHONE_MODES \
- 0x08
-#define USB_CDC_FD_SUBTYPE_USB_TERMINAL \
- 0x09
-#define USB_CDC_FD_SUBTYPE_NETWORK_TERMINAL \
- 0x0A
-#define USB_CDC_FD_SUBTYPE_PROTOCOL_UNIT \
- 0x0B
-#define USB_CDC_FD_SUBTYPE_EXTENSION_UNIT \
- 0x0C
-#define USB_CDC_FD_SUBTYPE_MULTI_CHANNEL_MGMT \
- 0x0D
-#define USB_CDC_FD_SUBTYPE_CAPI_MGMT \
- 0x0E
-#define USB_CDC_FD_SUBTYPE_ETHERNET \
- 0x0F
-#define USB_CDC_FD_SUBTYPE_ATM 0x10
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_CALL_MGMT, Header functional descriptor, bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_CALL_MGMT_VIA_DATA \
- 0x02
-#define USB_CDC_CALL_MGMT_HANDLED \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_ABSTRACT_CTL_MGMT, Abstract Control Management functional
-// descriptor, bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_ACM_SUPPORTS_NETWORK_CONNECTION \
- 0x08
-#define USB_CDC_ACM_SUPPORTS_SEND_BREAK \
- 0x04
-#define USB_CDC_ACM_SUPPORTS_LINE_PARAMS \
- 0x02
-#define USB_CDC_ACM_SUPPORTS_COMM_FEATURE \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_DIRECT_LINE_MGMT, Direct Line Management functional
-// descriptor, bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_DLM_NEEDS_EXTRA_PULSE_SETUP \
- 0x04
-#define USB_CDC_DLM_SUPPORTS_AUX \
- 0x02
-#define USB_CDC_DLM_SUPPORTS_PULSE \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_TELEPHONE_MODES, Telephone Operational Modes functional
-// descriptor, bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_TELEPHONE_SUPPORTS_COMPUTER \
- 0x04
-#define USB_CDC_TELEPHONE_SUPPORTS_STANDALONE \
- 0x02
-#define USB_CDC_TELEPHONE_SUPPORTS_SIMPLE \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_LINE_STATE_CAPS, Telephone Call and Line State Reporting
-// Capabilities descriptor
-//
-//*****************************************************************************
-#define USB_CDC_LINE_STATE_CHANGES_NOTIFIED \
- 0x20
-#define USB_CDC_LINE_STATE_REPORTS_DTMF \
- 0x10
-#define USB_CDC_LINE_STATE_REPORTS_DIST_RING \
- 0x08
-#define USB_CDC_LINE_STATE_REPORTS_CALLERID \
- 0x04
-#define USB_CDC_LINE_STATE_REPORTS_BUSY \
- 0x02
-#define USB_CDC_LINE_STATE_REPORTS_INT_DIALTONE \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_USB_TERMINAL, USB Terminal functional descriptor,
-// bmOptions
-//
-//*****************************************************************************
-#define USB_CDC_TERMINAL_NO_WRAPPER_USED \
- 0x00
-#define USB_CDC_TERMINAL_WRAPPER_USED \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_MULTI_CHANNEL_MGMT, Multi-Channel Management functional
-// descriptor, bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_MCM_SUPPORTS_SET_UNIT_PARAM \
- 0x04
-#define USB_CDC_MCM_SUPPORTS_CLEAR_UNIT_PARAM \
- 0x02
-#define USB_CDC_MCM_UNIT_PARAMS_NON_VOLATILE \
- 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_CAPI_MGMT, CAPI Control Management functional descriptor,
-// bmCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_CAPI_INTELLIGENT \
- 0x01
-#define USB_CDC_CAPI_SIMPLE 0x00
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_ETHERNET, Ethernet Networking functional descriptor,
-// bmEthernetStatistics
-//
-//*****************************************************************************
-#define USB_CDC_ETHERNET_XMIT_OK \
- 0x01000000
-#define USB_CDC_ETHERNET_RCV_OK 0x02000000
-#define USB_CDC_ETHERNET_XMIT_ERROR \
- 0x04000000
-#define USB_CDC_ETHERNET_RCV_ERROR \
- 0x08000000
-#define USB_CDC_ETHERNET_RCV_NO_BUFFER \
- 0x10000000
-#define USB_CDC_ETHERNET_DIRECTED_BYTES_XMIT \
- 0x20000000
-#define USB_CDC_ETHERNET_DIRECTED_FRAMES_XMIT \
- 0x40000000
-#define USB_CDC_ETHERNET_MULTICAST_BYTES_XMIT \
- 0x80000000
-#define USB_CDC_ETHERNET_MULTICAST_FRAMES_XMIT \
- 0x00010000
-#define USB_CDC_ETHERNET_BROADCAST_BYTES_XMIT \
- 0x00020000
-#define USB_CDC_ETHERNET_BROADCAST_FRAMES_XMIT \
- 0x00040000
-#define USB_CDC_ETHERNET_DIRECTED_BYTES_RCV \
- 0x00080000
-#define USB_CDC_ETHERNET_DIRECTED_FRAMES_RCV \
- 0x00100000
-#define USB_CDC_ETHERNET_MULTICAST_BYTES_RCV \
- 0x00200000
-#define USB_CDC_ETHERNET_MULTICAST_FRAMES_RCV \
- 0x00400000
-#define USB_CDC_ETHERNET_BROADCAST_BYTES_RCV \
- 0x00800000
-#define USB_CDC_ETHERNET_BROADCAST_FRAMES_RCV \
- 0x00000100
-#define USB_CDC_ETHERNET_RCV_CRC_ERROR \
- 0x00000200
-#define USB_CDC_ETHERNET_TRANSMIT_QUEUE_LENGTH \
- 0x00000400
-#define USB_CDC_ETHERNET_RCV_ERROR_ALIGNMENT \
- 0x00000800
-#define USB_CDC_ETHERNET_XMIT_ONE_COLLISION \
- 0x00001000
-#define USB_CDC_ETHERNET_XMIT_MORE_COLLISIONS \
- 0x00002000
-#define USB_CDC_ETHERNET_XMIT_DEFERRED \
- 0x00004000
-#define USB_CDC_ETHERNET_XMIT_MAX_COLLISIONS \
- 0x00008000
-#define USB_CDC_ETHERNET_RCV_OVERRUN \
- 0x00000001
-#define USB_CDC_ETHERNET_XMIT_UNDERRUN \
- 0x00000002
-#define USB_CDC_ETHERNET_XMIT_HEARTBEAT_FAILURE \
- 0x00000004
-#define USB_CDC_ETHERNET_XMIT_TIMES_CRS_LOST \
- 0x00000010
-
-//*****************************************************************************
-//
-// USB_CDC_FD_SUBTYPE_ATM, ATM Networking functional descriptor,
-// bmDataCapabilities
-//
-//*****************************************************************************
-#define USB_CDC_ATM_TYPE_3 0x08
-#define USB_CDC_ATM_TYPE_2 0x04
-#define USB_CDC_ATM_TYPE_1 0x02
-
-//*****************************************************************************
-//
-// bmATMDeviceStatistics
-//
-//*****************************************************************************
-#define USB_CDC_ATM_VC_US_CELLS_SENT \
- 0x10
-#define USB_CDC_ATM_VC_US_CELLS_RECEIVED \
- 0x08
-#define USB_CDC_ATM_DS_CELLS_HEC_ERR_CORRECTED \
- 0x04
-#define USB_CDC_ATM_US_CELLS_SENT \
- 0x02
-#define USB_CDC_ATM_US_CELLS_RECEIVED \
- 0x01
-
-//*****************************************************************************
-//
-// Management Element Requests (provided in tUSBRequest.bRequest)
-//
-//*****************************************************************************
-#define USB_CDC_SEND_ENCAPSULATED_COMMAND \
- 0x00
-#define USB_CDC_GET_ENCAPSULATED_RESPONSE \
- 0x01
-#define USB_CDC_SET_COMM_FEATURE \
- 0x02
-#define USB_CDC_GET_COMM_FEATURE \
- 0x03
-#define USB_CDC_CLEAR_COMM_FEATURE \
- 0x04
-#define USB_CDC_SET_AUX_LINE_STATE \
- 0x10
-#define USB_CDC_SET_HOOK_STATE 0x11
-#define USB_CDC_PULSE_SETUP 0x12
-#define USB_CDC_SEND_PULSE 0x13
-#define USB_CDC_SET_PULSE_TIME 0x14
-#define USB_CDC_RING_AUX_JACK 0x15
-#define USB_CDC_SET_LINE_CODING 0x20
-#define USB_CDC_GET_LINE_CODING 0x21
-#define USB_CDC_SET_CONTROL_LINE_STATE \
- 0x22
-#define USB_CDC_SEND_BREAK 0x23
-#define USB_CDC_SET_RINGER_PARMS \
- 0x30
-#define USB_CDC_GET_RINGER_PARMS \
- 0x31
-#define USB_CDC_SET_OPERATION_PARMS \
- 0x32
-#define USB_CDC_GET_OPERATION_PARMS \
- 0x33
-#define USB_CDC_SET_LINE_PARMS 0x34
-#define USB_CDC_GET_LINE_PARMS 0x35
-#define USB_CDC_DIAL_DIGITS 0x36
-#define USB_CDC_SET_UNIT_PARAMETER \
- 0x37
-#define USB_CDC_GET_UNIT_PARAMETER \
- 0x38
-#define USB_CDC_CLEAR_UNIT_PARAMETER \
- 0x39
-#define USB_CDC_GET_PROFILE 0x3A
-#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS \
- 0x40
-#define USB_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER \
- 0x41
-#define USB_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER \
- 0x42
-#define USB_CDC_SET_ETHERNET_PACKET_FILTER \
- 0x43
-#define USB_CDC_GET_ETHERNET_STATISTIC \
- 0x44
-#define USB_CDC_SET_ATM_DATA_FORMAT \
- 0x50
-#define USB_CDC_GET_ATM_DEVICE_STATISTICS \
- 0x51
-#define USB_CDC_SET_ATM_DEFAULT_VC \
- 0x52
-#define USB_CDC_GET_ATM_VC_STATISTICS \
- 0x53
-
-//*****************************************************************************
-//
-// In cases where a request defined above results in the return of a fixed size
-// data block, the following group of labels define the size of that block. In
-// each of these cases, an access macro is also provided to write the response
-// data into an appropriately-sized array of 8-bit characters.
-//
-//*****************************************************************************
-#define USB_CDC_SIZE_COMM_FEATURE \
- 2
-#define USB_CDC_SIZE_LINE_CODING \
- 7
-#define USB_CDC_SIZE_RINGER_PARMS \
- 4
-#define USB_CDC_SIZE_OPERATION_PARMS \
- 2
-#define USB_CDC_SIZE_UNIT_PARAMETER \
- 2
-#define USB_CDC_SIZE_PROFILE 64
-#define USB_CDC_SIZE_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER \
- 2
-#define USB_CDC_SIZE_ETHERNET_STATISTIC \
- 4
-#define USB_CDC_SIZE_ATM_DEVICE_STATISTICS \
- 4
-#define USB_CDC_SIZE_ATM_VC_STATISTICS \
- 4
-#define USB_CDC_SIZE_LINE_PARMS \
- 10
-
-//*****************************************************************************
-//
-// NB: USB_CDC_SIZE_LINE_PARAMS assumes only a single call. For multiple
-// calls, add 4 bytes per additional call.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// USB_CDC_GET_COMM_FEATURE & USB_CDC_SET_COMM_FEATURE
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// wValue (Feature Selector)
-//
-//*****************************************************************************
-#define USB_CDC_ABSTRACT_STATE 0x0001
-#define USB_CDC_COUNTRY_SETTING 0x0002
-
-//*****************************************************************************
-//
-// Data when feature selector is USB_DCD_ABSTRACT_STATE
-//
-//*****************************************************************************
-#define USB_CDC_ABSTRACT_CALL_DATA_MULTIPLEXED \
- 0x0002
-#define USB_CDC_ABSTRACT_ENDPOINTS_IDLE \
- 0x0001
-
-//*****************************************************************************
-//
-// Macros to populate the response data buffer (whose size in bytes is defined
-// by USB_CDC_SIZE_COMM_FEATURE).
-//
-//*****************************************************************************
-#define SetResponseCommFeature(pi8Buf, ui16Data) \
- do \
- { \
- (*(uint16_t *)(pi8Buf)) = ui16Data; \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// USB_CDC_SET_AUX_LINE_STATE, wValue
-//
-//*****************************************************************************
-#define USB_CDC_AUX_DISCONNECT 0x0000
-#define USB_CDC_AUX_CONNECT 0x0001
-
-//*****************************************************************************
-//
-// USB_CDC_SET_HOOK_STATE, wValue
-//
-//*****************************************************************************
-#define USB_CDC_ON_HOOK 0x0000
-#define USB_CDC_OFF_HOOK 0x0001
-#define USB_CDC_SNOOPING 0x0002
-
-//*****************************************************************************
-//
-// USB_CDC_GET_LINE_CODING
-//
-//*****************************************************************************
-#define USB_CDC_STOP_BITS_1 0x00
-#define USB_CDC_STOP_BITS_1_5 0x01
-#define USB_CDC_STOP_BITS_2 0x02
-
-#define USB_CDC_PARITY_NONE 0x00
-#define USB_CDC_PARITY_ODD 0x01
-#define USB_CDC_PARITY_EVEN 0x02
-#define USB_CDC_PARITY_MARK 0x03
-#define USB_CDC_PARITY_SPACE 0x04
-
-//*****************************************************************************
-//
-// Macro to populate the response data buffer (whose size in bytes is defined
-// by USB_CDC_SIZE_LINE_CODING).
-//
-//*****************************************************************************
-#define SetResponseLineCoding(pi8Buf, ui8Rate, ui8Stop, ui8Parity, \
- ui8Databits) \
- do \
- { \
- (*(uint32_t *)(pi8Buf)) = ui8Rate; \
- (*((uint8_t *)(pi8Buf) + 4)) = ui8Stop; \
- (*((uint8_t *)(pi8Buf) + 5)) = ui8Parity; \
- (*((uint8_t *)(pi8Buf) + 6)) = ui8Databits; \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// USB_CDC_SET_CONTROL_LINE_STATE, wValue
-//
-//*****************************************************************************
-#define USB_CDC_DEACTIVATE_CARRIER \
- 0x00
-#define USB_CDC_ACTIVATE_CARRIER \
- 0x02
-#define USB_CDC_DTE_NOT_PRESENT 0x00
-#define USB_CDC_DTE_PRESENT 0x01
-
-//*****************************************************************************
-//
-// USB_CDC_SET_RINGER_PARMS, USB_CDC_GET_RINGER_PARMS and
-// USB_CDC_GET_LINE_PARMS (ui32RingerBmp)
-//
-//*****************************************************************************
-#define USB_CDC_RINGER_EXISTS 0x80000000
-#define USB_CDC_RINGER_DOES_NOT_EXIST \
- 0x00000000
-
-//*****************************************************************************
-//
-// Macro to populate the response data buffer to USB_CDC_GET_RINGER_PARMS.
-// Parameter buf points to a buffer of size USB_CDC_SIZE_RINGER_PARMS bytes.
-//
-//*****************************************************************************
-#define SetResponseRingerParms(pi8Buf, ui8Pattern, ui8Volume, ui32Exists) \
- do \
- { \
- *(uint32_t *)(pi8Buf) = ((ui8Pattern) + \
- ((ui8Volume & 0xFF) << 8) + \
- (ui32Exists & USB_CDC_RINGER_EXISTS)); \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// Macros to extract fields from the USB_CDC_SET_RINGER_PARMS data
-//
-//*****************************************************************************
-#define GetRingerVolume(pi8Data) \
- (BYTE((pi8Data) + 1))
-#define GetRingerPattern(pi8Data) \
- (BYTE(pi8Data))
-#define GetRingerExists(pi8Data) \
- ((LONG(pi8Data)) & USB_CDC_RINGER_EXISTS)
-
-//*****************************************************************************
-//
-// USB_CDC_SET_OPERATION_PARMS, wValue
-//
-//*****************************************************************************
-#define USB_CDC_SIMPLE_MODE 0x0000
-#define USB_CDC_STANDALONE_MODE 0x0001
-#define USB_CDC_HOST_CENTRIC_MODE \
- 0x0002
-
-//*****************************************************************************
-//
-// Macro to populate the response data buffer to USB_CDC_GET_OPERATION_PARMS.
-// Parameter buf points to a buffer of size USB_CDC_SIZE_OPERATION_PARMS
-// bytes.
-//
-//*****************************************************************************
-#define SetResponseOperationParms(pi8Bbuf, ui16Data) \
- do \
- { \
- WORD(pi8Buf) = ui16Data; \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// USB_CDC_SET_LINE_PARMS, wParam - Line State Change
-//
-//*****************************************************************************
-#define USB_CDC_DROP_ACTIVE_CALL \
- 0x0000
-#define USB_CDC_START_NEW_CALL 0x0001
-#define USB_CDC_APPLY_RINGING 0x0002
-#define USB_CDC_REMOVE_RINGING 0x0003
-#define USB_CDC_SWITCH_CALL 0x0004
-
-//*****************************************************************************
-//
-// Line state bitmap in USB_CDC_GET_LINE_PARMS response
-//
-//*****************************************************************************
-#define USB_CDC_LINE_IS_ACTIVE 0x80000000
-#define USB_CDC_LINE_IS_IDLE 0x00000000
-#define USB_CDC_LINE_NO_ACTIVE_CALL \
- 0x000000FF
-
-#define USB_CDC_CALL_ACTIVE 0x80000000
-
-//*****************************************************************************
-//
-// Call state value definitions
-//
-//*****************************************************************************
-#define USB_CDC_CALL_IDLE 0x00000000
-#define USB_CDC_CALL_TYPICAL_DIALTONE \
- 0x00000001
-#define USB_CDC_CALL_INTERRUPTED_DIALTONE \
- 0x00000002
-#define USB_CDC_CALL_DIALING 0x00000003
-#define USB_CDC_CALL_RINGBACK 0x00000004
-#define USB_CDC_CALL_CONNECTED 0x00000005
-#define USB_CDC_CALL_INCOMING 0x00000006
-
-//*****************************************************************************
-//
-// Call state change value definitions
-//
-//*****************************************************************************
-#define USB_CDC_CALL_STATE_IDLE 0x01
-#define USB_CDC_CALL_STATE_DIALING \
- 0x02
-#define USB_CDC_CALL_STATE_RINGBACK \
- 0x03
-#define USB_CDC_CALL_STATE_CONNECTED \
- 0x04
-#define USB_CDC_CALL_STATE_INCOMING \
- 0x05
-
-//*****************************************************************************
-//
-// Extra byte of data describing the connection type for
-// USB_CDC_CALL_STATE_CONNECTED.
-//
-//*****************************************************************************
-#define USB_CDC_VOICE 0x00
-#define USB_CDC_ANSWERING_MACHINE \
- 0x01
-#define USB_CDC_FAX 0x02
-#define USB_CDC_MODEM 0x03
-#define USB_CDC_UNKNOWN 0xFF
-
-//*****************************************************************************
-//
-// Macro to extract call index from request in cases where wParam is
-// USB_CDC_SWITCH_CALL.
-//
-//*****************************************************************************
-#define GetCallIndex(pi8Data) (BYTE(pi8Data))
-
-//*****************************************************************************
-//
-// Macro to populate the CallState entries in response to request
-// USB_CDC_GET_LINE_PARMS. The ui8Index parameter is a zero based index
-// indicating which call entry in the pi8Buf response buffer to fill in. Note
-// that pi8Buf points to the first byte of the buffer (the wLength field).
-//
-//*****************************************************************************
-#define SetResponseCallState(pi8Buf, ui8Index, ui32Active, ui8StateChange, \
- ui8State) \
- do \
- { \
- (LONG((uint8_t *)(pi8Buf) + (10 + (4 * (ui8Index))))) = \
- (((ui32Active) & USB_CDC_CALL_IS_ACTIVE) + \
- (((ui8StateChange) & 0xFF) << 8) + \
- ((ui8State) & 0xFF)); \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// Macro to populate the response data buffer (whose size in bytes is defined
-// by USB_CDC_SIZE_LINE_PARMS). Note that this macro only populates fields for
-// a single call. If multiple calls are being managed, additional 4 byte
-// fields must be appended to provide call state for each call after the first.
-// This may be done using the SetResponseCallState macro with the appropriate
-// call index supplied.
-//
-//*****************************************************************************
-#define SetResponseLineParms(pi8Buf, ui16Length, \
- ui8RingPattern, ui8RingVolume, ui32RingExists, \
- ui32LineActive, ui8LineCallIndex, \
- ui32CallActive, ui8CallStateChange, \
- ui8CallState) \
- do \
- { \
- (WORD(pi8Buf)) = ui16Length; \
- SetResponseRingerParams(((uint8_t *)(pi8Buf) + 2), \
- ui8RingPattern, ui8RingVolume, \
- ui32RingExists); \
- (LONG((uint8_t *)(pi8Buf) + 6)) = \
- (((ui32LineActive) & USB_CDC_LINE_IS_ACTIVE) + \
- ((ui8LineCallIndex) & 0xFF)) ; \
- SetResponseCallState(pi8Buf, 0, ui32CallActive, \
- ui8CallStateChange, ui8CallState); \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// Notification Element definitions
-//
-//*****************************************************************************
-#define USB_CDC_NOTIFY_NETWORK_CONNECTION \
- 0x00
-#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE \
- 0x01
-#define USB_CDC_NOTIFY_AUX_JACK_HOOK_STATE \
- 0x08
-#define USB_CDC_NOTIFY_RING_DETECT \
- 0x09
-#define USB_CDC_NOTIFY_SERIAL_STATE \
- 0x20
-#define USB_CDC_NOTIFY_CALL_STATE_CHANGE \
- 0x28
-#define USB_CDC_NOTIFY_LINE_STATE_CHANGE \
- 0x29
-#define USB_CDC_NOTIFY_CONNECTION_SPEED_CHANGE \
- 0x2A
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_NETWORK_CONNECTION, wValue
-//
-//*****************************************************************************
-#define USB_CDC_NETWORK_DISCONNECTED \
- 0x0000
-#define USB_CDC_NETWORK_CONNECTED \
- 0x0001
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_AUX_JACK_HOOK_STATE, wValue
-//
-//*****************************************************************************
-#define USB_CDC_AUX_JACK_ON_HOOK \
- 0x0000
-#define USB_CDC_AUX_JACK_OFF_HOOK \
- 0x0001
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_SERIAL_STATE, Data
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Number of bytes of data returned alongside this notification.
-//
-//*****************************************************************************
-#define USB_CDC_NOTIFY_SERIAL_STATE_SIZE \
- 2
-
-#define USB_CDC_SERIAL_STATE_OVERRUN \
- 0x0040
-#define USB_CDC_SERIAL_STATE_PARITY \
- 0x0020
-#define USB_CDC_SERIAL_STATE_FRAMING \
- 0x0010
-#define USB_CDC_SERIAL_STATE_RING_SIGNAL \
- 0x0008
-#define USB_CDC_SERIAL_STATE_BREAK \
- 0x0004
-#define USB_CDC_SERIAL_STATE_TXCARRIER \
- 0x0002
-#define USB_CDC_SERIAL_STATE_RXCARRIER \
- 0x0001
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_CALL_STATE_CHANGE, wValue
-//
-// Call state values are defined above in the group beginning
-// USB_CDC_CALL_STATE_IDLE. Note that the data returned alongside this
-// notification are heavily dependent upon the call state being reported so no
-// specific lengths or access macros are provided here.
-//
-// Macro to construct the correct wValue for this notification given a state
-// and call index.
-//
-//*****************************************************************************
-#define SetNotifyCallStatewValue(pi16Result, ui8CallState, ui8Index) \
- do \
- { \
- (WORD(pi16Result)) = (((ui8CallState) & 0xFF) + \
- (((ui8Index) & 0xFF) << 8)); \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_LINE_STATE_CHANGE, wValue
-//
-// Note that the data returned alongside this notification are heavily
-// dependent upon the call state being reported so no specific lengths or
-// access macros are provided here.
-//
-//*****************************************************************************
-#define USB_CDC_LINE_STATE_IDLE 0x0000
-#define USB_CDC_LINE_STATE_HOLD 0x0001
-#define USB_CDC_LINE_STATE_OFF_HOOK \
- 0x0002
-#define USB_CDC_LINE_STATE_ON_HOOK \
- 0x0003
-
-//*****************************************************************************
-//
-// USB_CDC_NOTIFY_CONNECTION_SPEED_CHANGE, Data
-//
-// Macro to populate the 8 byte data structure returned alongside this
-// notification.
-//
-//*****************************************************************************
-#define SetNotifyConnectionSpeedChange(pi8Buf, ui32USBitRate, ui32DSBitRate) \
- do \
- { \
- LONG(pi8Buf) = ui32USBitRate; \
- LONG((uint8_t *)(pi8Buf) + 4) = ui32DSBitRate; \
- } \
- while(0)
-
-//*****************************************************************************
-//
-// Packed structure definitions for request/response data blocks
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// All structures defined in this section of the header require byte packing of
-// fields. This is usually accomplished using the PACKED macro but, for IAR
-// Embedded Workbench, this requires a pragma.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-//! USB_CDC_GET/SET_LINE_CODING request-specific data.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The data terminal rate in bits per second.
- //
- uint32_t ui32Rate;
-
- //
- //! The number of stop bits. Valid values are USB_CDC_STOP_BITS_1,
- //! USB_CDC_STOP_BITS_1_5 or USB_CDC_STOP_BITS_2
- //
- uint8_t ui8Stop;
-
- //
- //! The parity setting. Valid values are USB_CDC_PARITY_NONE,
- //! USB_CDC_PARITY_ODD, USB_CDC_PARITY_EVEN, USB_CDC_PARITY_MARK and
- //! USB_CDC_PARITY_SPACE.
- //
- uint8_t ui8Parity;
-
- //
- //! The number of data bits per character. Valid values are 5, 6, 7 and 8
- //! in this implementation.
- //
- uint8_t ui8Databits;
-}
-PACKED tLineCoding;
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBCDC_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdesc.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdesc.c
deleted file mode 100644
index 6c3360b52..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdesc.c
+++ /dev/null
@@ -1,480 +0,0 @@
-//*****************************************************************************
-//
-// usbdesc.c - USB descriptor parsing functions.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "usblib/usblib.h"
-
-//*****************************************************************************
-//
-// Assumptions:
-// ------------
-//
-// The following assumptions are made in this module. From reading chapter 9
-// of the USB 2.0 specification, these appear to be perfectly valid.
-//
-// 1. The interface number, bInterfaceNumber in the interface descriptor, is
-// a zero based index and takes values between 0 and
-// (pConfigDescriptor->bNumInterfaces - 1) inclusive.
-// 2. Similarly, the alternate setting number, bAlternateSetting in the
-// interface descriptor, is a zero based index.
-// 3. Interface descriptors are ordered by interface number in the
-// configuration descriptor.
-// 4. If alternate settings are available for an interface, the interface
-// descriptors are ordered by alternate setting value bAlternateSetting.
-// 5. Although the endpoints associated with a given interface must follow
-// their associated interface descriptor, it is possible for other,
-// device specific descriptors to be found between an interface descriptor
-// and its endpoints or between endpoint descriptors for the same
-// interface.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup general_usblib_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Determines the number of individual descriptors of a particular type within
-//! a supplied buffer.
-//!
-//! \param psDesc points to the first byte of a block of standard USB
-//! descriptors.
-//! \param ui32Size is the number of bytes of descriptor data found at pointer
-//! \e psDesc.
-//! \param ui32Type identifies the type of descriptor that is to be counted.
-//! If the value is \b USB_DESC_ANY, the function returns the total number of
-//! descriptors regardless of type.
-//!
-//! This function can be used to count the number of descriptors of a
-//! particular type within a block of descriptors. The caller can provide a
-//! specific type value which the function matches against the second byte of
-//! each descriptor or, alternatively, can specify \b USB_DESC_ANY to have the
-//! function count all descriptors regardless of their type.
-//!
-//! \return Returns the number of descriptors found in the supplied block of
-//! data.
-//
-//*****************************************************************************
-uint32_t
-USBDescGetNum(tDescriptorHeader *psDesc, uint32_t ui32Size,
- uint32_t ui32Type)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32TotLength;
- uint32_t ui32Count;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = psDesc;
- ui32TotLength = 0;
- ui32Count = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(ui32TotLength < ui32Size)
- {
- //
- // Does this descriptor match the type passed (if a specific type
- // has been specified)?
- //
- if((ui32Type == USB_DESC_ANY) ||
- (psDescCheck->bDescriptorType == (uint8_t)(ui32Type & 0xFF)))
- {
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- ui32TotLength += (uint32_t)psDescCheck->bLength;
- psDescCheck = NEXT_USB_DESCRIPTOR(psDescCheck);
- }
-
- //
- // Return the descriptor count to the caller.
- //
- return(ui32Count);
-}
-
-//*****************************************************************************
-//
-//! Determines the number of individual descriptors of a particular type within
-//! a supplied buffer.
-//!
-//! \param psDesc points to the first byte of a block of standard USB
-//! descriptors.
-//! \param ui32Size is the number of bytes of descriptor data found at pointer
-//! \e psDesc.
-//! \param ui32Type identifies the type of descriptor that is to be found. If
-//! the value is \b USB_DESC_ANY, the function returns a pointer to the n-th
-//! descriptor regardless of type.
-//! \param ui32Index is the zero based index of the descriptor whose pointer is
-//! to be returned. For example, passing value 1 in \e ui32Index returns the
-//! second matching descriptor.
-//!
-//! Return a pointer to the n-th descriptor of a particular type found in the
-//! block of \e ui32Size bytes starting at \e psDesc.
-//!
-//! \return Returns a pointer to the header of the required descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tDescriptorHeader *
-USBDescGet(tDescriptorHeader *psDesc, uint32_t ui32Size,
- uint32_t ui32Type, uint32_t ui32Index)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32TotLength;
- uint32_t ui32Count;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = psDesc;
- ui32TotLength = 0;
- ui32Count = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(ui32TotLength < ui32Size)
- {
- //
- // Does this descriptor match the type passed (if a specific type
- // has been specified)?
- //
- if((ui32Type == USB_DESC_ANY) ||
- (psDescCheck->bDescriptorType == (uint8_t)(ui32Type & 0xFF)))
- {
- //
- // We found a matching descriptor. If our count matches the
- // supplied index, we are done so return the pointer.
- //
- if(ui32Count == ui32Index)
- {
- return(psDescCheck);
- }
-
- //
- // We have not found enough descriptors yet to satisfy the supplied
- // index so increment our count and continue.
- //
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- ui32TotLength += (uint32_t)psDescCheck->bLength;
- psDescCheck = NEXT_USB_DESCRIPTOR(psDescCheck);
- }
-
- //
- // If we get here, we reached the end of the data without finding the
- // required descriptor. Return NULL.
- //
- return((tDescriptorHeader *)0);
-}
-
-//*****************************************************************************
-//
-//! Determines the number of different alternate configurations for a given
-//! interface within a configuration descriptor.
-//!
-//! \param psConfig points to the first byte of a standard USB configuration
-//! descriptor.
-//! \param ui8InterfaceNumber is the interface number for which the number of
-//! alternate configurations is to be counted.
-//!
-//! This function can be used to count the number of alternate settings for a
-//! specific interface within a configuration.
-//!
-//! \return Returns the number of alternate versions of the specified interface
-//! or 0 if the interface number supplied cannot be found in the config
-//! descriptor.
-//
-//*****************************************************************************
-uint32_t
-USBDescGetNumAlternateInterfaces(tConfigDescriptor *psConfig,
- uint8_t ui8InterfaceNumber)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32TotLength;
- uint32_t ui32Count;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = (tDescriptorHeader *)psConfig;
- ui32TotLength = 0;
- ui32Count = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(ui32TotLength < (uint32_t)psConfig->wTotalLength)
- {
- //
- // Is this an interface descriptor with the required interface number?
- //
- if((psDescCheck->bDescriptorType == USB_DTYPE_INTERFACE) &&
- (((tInterfaceDescriptor *)psDescCheck)->bInterfaceNumber ==
- ui8InterfaceNumber))
- {
- //
- // Yes - increment our count.
- //
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- ui32TotLength += (uint32_t)psDescCheck->bLength;
- psDescCheck = NEXT_USB_DESCRIPTOR(psDescCheck);
- }
-
- //
- // Return the descriptor count to the caller.
- //
- return(ui32Count);
-}
-
-//*****************************************************************************
-//
-//! Returns a pointer to the n-th interface descriptor in a config descriptor
-//! with the supplied interface number.
-//!
-//! \param psConfig points to the first byte of a standard USB configuration
-//! descriptor.
-//! \param ui8InterfaceNumber is the interface number of the descriptor that is
-//! being queried.
-//! \param ui32Index is the zero based index of the descriptor to return.
-//!
-//! This function returns a pointer to the n-th interface descriptor in the
-//! supplied configuration which has the requested interface number. It may be
-//! used by a client to retrieve the descriptors for each alternate setting
-//! of a given interface within the configuration passed.
-//!
-//! \return Returns a pointer to the n-th interface descriptor with interface
-//! number as specified or NULL of this descriptor does not exist.
-//
-//*****************************************************************************
-static tInterfaceDescriptor *
-USBDescGetAlternateInterface(tConfigDescriptor *psConfig,
- uint8_t ui8InterfaceNumber,
- uint32_t ui32Index)
-{
- tDescriptorHeader *psDescCheck;
- uint32_t ui32TotLength;
- uint32_t ui32Count;
-
- //
- // Set up for our descriptor counting loop.
- //
- psDescCheck = (tDescriptorHeader *)psConfig;
- ui32TotLength = 0;
- ui32Count = 0;
-
- //
- // Keep looking through the supplied data until we reach the end.
- //
- while(ui32TotLength < (uint32_t)psConfig->wTotalLength)
- {
- //
- // Does this descriptor match the type passed (if a specific type
- // has been specified)?
- //
- if((psDescCheck->bDescriptorType == USB_DTYPE_INTERFACE) &&
- (((tInterfaceDescriptor *)psDescCheck)->bInterfaceNumber ==
- ui8InterfaceNumber))
- {
- //
- // This is an interface descriptor for interface
- // ui8InterfaceNumber. Determine if this is the n-th one we have
- // found and, if so, return its pointer.
- //
- if(ui32Count == ui32Index)
- {
- //
- // Found it - return the pointer.
- //
- return((tInterfaceDescriptor *)psDescCheck);
- }
-
- //
- // Increment our count of matching descriptors found and go back
- // to look for another since we have not yet reached the n-th
- // match.
- //
- ui32Count++;
- }
-
- //
- // Move on to the next descriptor.
- //
- ui32TotLength += (uint32_t)psDescCheck->bLength;
- psDescCheck = NEXT_USB_DESCRIPTOR(psDescCheck);
- }
-
- //
- // If we drop out the end of the loop, we did not find the requested
- // descriptor so return NULL.
- //
- return((tInterfaceDescriptor *)0);
-}
-
-//*****************************************************************************
-//
-//! Returns a pointer to the n-th interface descriptor in a configuration
-//! descriptor that applies to the supplied alternate setting number.
-//!
-//! \param psConfig points to the first byte of a standard USB configuration
-//! descriptor.
-//! \param ui32Index is the zero based index of the interface that is to be
-//! found. If \e ui32Alt is set to a value other than \b USB_DESC_ANY, this
-//! will be equivalent to the interface number being searched for.
-//! \param ui32Alt is the alternate setting number which is to be
-//! searched for. If this value is \b USB_DESC_ANY, the alternate setting
-//! is ignored and all interface descriptors are considered in the search.
-//!
-//! Return a pointer to the n-th interface descriptor found in the supplied
-//! configuration descriptor. If \e ui32Alt is not \b USB_DESC_ANY, only
-//! interface descriptors which are part of the supplied alternate setting are
-//! considered in the search otherwise all interface descriptors are
-//! considered.
-//!
-//! Note that, although alternate settings can be applied on an interface-by-
-//! interface basis, the number of interfaces offered is fixed for a given
-//! config descriptor. Hence, this function will correctly find the unique
-//! interface descriptor for that interface's alternate setting number
-//! \e ui32Alt if \e ui32Index is set to the required interface number and
-//! \e ui32Alt is set to a valid alternate setting number for that interface.
-//!
-//! \return Returns a pointer to the required interface descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tInterfaceDescriptor *
-USBDescGetInterface(tConfigDescriptor *psConfig, uint32_t ui32Index,
- uint32_t ui32Alt)
-{
- //
- // If we are being told to ignore the alternate configuration, this boils
- // down to a very simple query.
- //
- if(ui32Alt == USB_DESC_ANY)
- {
- //
- // Return the ui32Index-th interface descriptor we find in the
- // configuration descriptor.
- //
- return((tInterfaceDescriptor *)USBDescGet(
- (tDescriptorHeader *)psConfig,
- (uint32_t)psConfig->wTotalLength,
- USB_DTYPE_INTERFACE, ui32Index));
- }
- else
- {
- //
- // In this case, a specific alternate setting number is required.
- // Given that interface numbers are zero based indices, we can
- // pass the supplied ui32Index parameter directly as the interface
- // number to USBDescGetAlternateInterface to retrieve the requested
- // interface descriptor pointer.
- //
- return(USBDescGetAlternateInterface(psConfig, ui32Index, ui32Alt));
- }
-}
-
-//*****************************************************************************
-//
-//! Return a pointer to the n-th endpoint descriptor in the supplied
-//! interface descriptor.
-//!
-//! \param psInterface points to the first byte of a standard USB interface
-//! descriptor.
-//! \param ui32Index is the zero based index of the endpoint that is to be
-//! found.
-//! \param ui32Size contains the maximum number of bytes that the function may
-//! search beyond \e psInterface while looking for the requested endpoint
-//! descriptor.
-//!
-//! Return a pointer to the n-th endpoint descriptor found in the supplied
-//! interface descriptor. If the \e ui32Index parameter is invalid (greater
-//! than or equal to the bNumEndpoints field of the interface descriptor) or
-//! the endpoint cannot be found within \e ui32Size bytes of the interface
-//! descriptor pointer, the function will return NULL.
-//!
-//! Note that, although the USB 2.0 specification states that endpoint
-//! descriptors must follow the interface descriptor that they relate to, it
-//! also states that device specific descriptors should follow any standard
-//! descriptor that they relate to. As a result, we cannot assume that each
-//! interface descriptor will be followed by nothing but an ordered list of
-//! its own endpoints and, hence, the function needs to be provided \e ui32Size
-//! to limit the search range.
-//!
-//! \return Returns a pointer to the requested endpoint descriptor if
-//! found or NULL otherwise.
-//
-//*****************************************************************************
-tEndpointDescriptor *
-USBDescGetInterfaceEndpoint(tInterfaceDescriptor *psInterface,
- uint32_t ui32Index, uint32_t ui32Size)
-{
- //
- // Is the index passed valid?
- //
- if(ui32Index >= psInterface->bNumEndpoints)
- {
- //
- // It's out of bounds so return a NULL.
- //
- return((tEndpointDescriptor *)0);
- }
- else
- {
- //
- // Endpoint index is valid so find the descriptor.
- //
- return((tEndpointDescriptor *)USBDescGet(
- (tDescriptorHeader *)psInterface,
- ui32Size, USB_DTYPE_ENDPOINT, ui32Index));
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdfu.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdfu.h
deleted file mode 100644
index 602b113ae..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdfu.h
+++ /dev/null
@@ -1,504 +0,0 @@
-//*****************************************************************************
-//
-// usbdfu.h - Definitions related to the USB Device Firmware Upgrade class.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBDFU_H__
-#define __USBDFU_H__
-
-//*****************************************************************************
-//
-// DFU attributes as published in the functional descriptor.
-//
-//*****************************************************************************
-#define DFU_ATTR_WILL_DETACH 0x08
-#define DFU_ATTR_MANIFEST_TOLERANT \
- 0x04
-#define DFU_ATTR_CAN_UPLOAD 0x02
-#define DFU_ATTR_CAN_DOWNLOAD 0x01
-
-//*****************************************************************************
-//
-// The states that the DFU device can be in. These values are reported to
-// the host in response to a USBD_DFU_REQUEST_GETSTATE request.
-//
-//*****************************************************************************
-typedef enum
-{
- eDFUStateAppIdle = 0,
- eDFUStateAppDetach,
- eDFUStateIdle,
- eDFUStateDnloadSync,
- eDFUStateDnBusy,
- eDFUStateDnloadIdle,
- eDFUStateManifestSync,
- eDFUStateManifest,
- eDFUStateManifestWaitReset,
- eDFUStateUploadIdle,
- eDFUStateError
-}
-tDFUState;
-
-//*****************************************************************************
-//
-// The current error status of the DFU device. These values are reported to
-// the host in response to a USBD_DFU_REQUEST_GETSTATUS request.
-//
-//*****************************************************************************
-typedef enum
-{
- eDFUStatusOk = 0,
- eDFUStatusErrTarget,
- eDFUStatusErrFile,
- eDFUStatusErrWrite,
- eDFUStatusErrErase,
- eDFUStatusErrCheckErased,
- eDFUStatusErrProg,
- eDFUStatusErrVerify,
- eDFUStatusErrAddress,
- eDFUStatusErrNotDone,
- eDFUStatusErrFirmware,
- eDFUStatusErrVendor,
- eDFUStatusErrUSBR,
- eDFUStatusErrPOR,
- eDFUStatusErrUnknown,
- eDFUStatusErrStalledPkt
-}
-tDFUStatus;
-
-//*****************************************************************************
-//
-// The descriptor type for the DFU functional descriptor.
-//
-//*****************************************************************************
-#define USB_DFU_FUNC_DESCRIPTOR_TYPE \
- 0x21
-
-//*****************************************************************************
-//
-// The subclass identifier for DFU as reported to the host in the
-// bInterfaceSubClass field of the DFU interface descriptor.
-//
-//*****************************************************************************
-#define USB_DFU_SUBCLASS 0x01
-
-//*****************************************************************************
-//
-// The protocol identifier for DFU as reported to the host in the
-// bInterfaceProtocol field of the DFU interface descriptor.
-//
-//*****************************************************************************
-#define USB_DFU_PROTOCOL 0x02
-#define USB_DFU_RUNTIME_PROTOCOL \
- 0x01
-
-//*****************************************************************************
-//
-// DFU class-specific request identifiers.
-//
-//*****************************************************************************
-#define USBD_DFU_REQUEST_DETACH 0
-#define USBD_DFU_REQUEST_DNLOAD 1
-#define USBD_DFU_REQUEST_UPLOAD 2
-#define USBD_DFU_REQUEST_GETSTATUS \
- 3
-#define USBD_DFU_REQUEST_CLRSTATUS \
- 4
-#define USBD_DFU_REQUEST_GETSTATE \
- 5
-#define USBD_DFU_REQUEST_ABORT 6
-
-//*****************************************************************************
-//
-// Request 1KB blocks from the host. This value is published in the USB
-// functional descriptor.
-//
-//*****************************************************************************
-#define DFU_TRANSFER_SIZE 1024
-
-//*****************************************************************************
-//
-// USBLib-specific request identifier. This is used to determine whether
-// the target device supports our DFU command protocol. It is expected that
-// a device not supporting our extensions will stall this request. This
-// request is only supported while the DFU device is in eDFUStateIdle.
-//
-// An IN request containing the following parameters will result in the device
-// sending back a tDFUQueryTivaProtocol structure indicating that
-// USBLib extensions are supported. The actual values in wValue and wIndex
-// have no meaning other than to act as markers in the unlikely event that
-// another DFU device also chooses to use request ID 0x42 for some other
-// purpose.
-//
-// wValue - 0x23(REQUEST_TIVA_VALUE)
-// wIndex - Interface number
-// wLength - sizeof(tDFUQueryTivaProtocol)
-//
-//*****************************************************************************
-#define USBD_DFU_REQUEST_TIVA 0x42
-#define REQUEST_TIVA_VALUE 0x23
-
-#define DFU_PROTOCOL_TIVA_MARKER \
- 0x4C4D
-#define DFU_PROTOCOL_TIVA_VERSION_1 \
- 0x0001
-
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-// The structure sent to the host when a valid USBD_DFU_REQUEST_TIVA is
-// received while the DFU device is in idle state.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // The protocol marker(DFU_PROTOCOL_TIVA_MARKER)
- //
- uint16_t ui16Marker;
-
- //
- // The protocol version(DFU_PROTOCOL_TIVA_VERSION_1)
- //
- uint16_t ui16Version;
-}
-PACKED tDFUQueryTivaProtocol;
-
-//*****************************************************************************
-//
-// Structure sent to the host in response to USBD_DFU_REQUEST_GETSTATUS.
-//
-//*****************************************************************************
-typedef struct
-{
- uint8_t bStatus;
- uint8_t bwPollTimeout[3];
- uint8_t bState;
- uint8_t iString;
-}
-PACKED tDFUGetStatusResponse;
-
-//*****************************************************************************
-//
-// Firmware Download Commands
-//
-// The data passed on a USBD_DFU_REQUEST_DNLOAD request is comprised of a
-// header which instructs the boot loader how to interpret the block and
-// block-specific data. The following definitions relate to the download
-// block headers.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Supported command identifiers
-//
-//*****************************************************************************
-#define DFU_CMD_PROG 0x01
-#define DFU_CMD_READ 0x02
-#define DFU_CMD_CHECK 0x03
-#define DFU_CMD_ERASE 0x04
-#define DFU_CMD_INFO 0x05
-#define DFU_CMD_BIN 0x06
-#define DFU_CMD_RESET 0x07
-
-//*****************************************************************************
-//
-// Generic download command header.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Command identifier.
- //
- uint8_t ui8Command;
-
- //
- // Command-specific data elements.
- //
- uint8_t pui8Data[7];
-}
-PACKED tDFUDownloadHeader;
-
-//*****************************************************************************
-//
-// Header for the DFU_CMD_PROG command.
-//
-// This command is used to program a section of the flash with the binary data
-// which immediately follows the header. The start address of the data is
-// expressed as a 1KB block number so 0 would represent the bottom of flash
-// (which, incidentally, the USB boot loader will not let you program) and 0x10
-// would represent address 16KB or 16384 (0x4000). The ui32Length field
-// contains the total number of bytes of data in the following programming
-// operation. The DFU device will not look for any command header on following
-// USBD_DFU_REQUEST_DNLOAD requests until the operation is completed or
-// aborted.
-//
-// By using this protocol, the DFU_CMD_PROG command header may be used as a
-// simple header on the binary files to be sent to the DFU device for
-// programming. If we enforce the requirement that the DFU_CMD_PROG header is
-// applied to each USBD_DFU_REQUEST_DNLOAD (one per block), this means that the
-// host-side DFU application must be aware of the underlying protocol and
-// insert these headers dynamically during programming operations. This could
-// be handled by post processing the binary to insert the headers at the
-// appropriate points but this would then tie the binary structure to the
-// chosen transfer size and break the operation if the transfer size were to
-// change in the future.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // DFU_CMD_PROG
- //
- uint8_t ui8Command;
-
- //
- // Reserved - set to 0x00.
- //
- uint8_t ui8Reserved;
-
- //
- // Block start address / 1024
- //
- uint16_t ui16StartAddr;
-
- //
- // Total length, in bytes, of following data for the complete download
- // operation.
- //
- uint32_t ui32Length;
-}
-PACKED tDFUDownloadProgHeader;
-
-//*****************************************************************************
-//
-// Header for the DFU_CMD_READ and DFU_CMD_CHECK commands.
-//
-// This command may be used to set the address range whose content will be
-// returned on subsequent USBD_DFU_REQUEST_UPLOAD requests from the host.
-//
-// To read back a the contents of a region of flash, the host should send
-// USBD_DFU_REQUEST_DNLOAD with ui8Command DFU_CMD_READ, ui16StartAddr set to
-// the 1KB block start address and ui32Length set to the number of bytes to
-// read. The host should then send one or more USBD_DFU_REQUEST_UPLOAD
-// requests to receive the current flash contents from the configured
-// addresses. Data returned will include an 8 byte DFU_CMD_PROG prefix
-// structure unless the prefix has been disabled by sending a DFU_CMD_BIN
-// command with the bBinary parameter set to 1.
-//
-// To check that a region of flash is erased, the DFU_CMD_CHECK command should
-// be sent with ui16StartAddr and ui32Length set to describe the region to
-// check. The host should then send a USBD_DFU_REQUEST_GETSTATUS. If the
-// erase check was successful, the returned bStatus value will be STATUS_OK,
-// otherwise it will be STATUS_ERR_CHECK_ERASED. Note that ui32Length passed
-// must be a multiple of 4. If this is not the case, the value will be
-// truncated before the check is performed.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // DFU_CMD_READ or DFU_CMD_CHECK
- //
- uint8_t ui8Command;
-
- //
- // Reserved - write to 0
- //
- uint8_t ui8Reserved;
-
- //
- // Block start address / 1024
- //
- uint16_t ui16StartAddr;
-
- //
- // The number of bytes of data to read back or check.
- //
- uint32_t ui32Length;
-}
-PACKED tDFUDownloadReadCheckHeader;
-
-//*****************************************************************************
-//
-// Header for the DFU_CMD_ERASE command.
-//
-// This command may be used to erase a number of flash blocks. The address of
-// the first block to be erased is passed in ui16StartAddr with ui16NumBlocks
-// containing the number of blocks to be erased from this address. The block
-// size of the device may be determined using the DFU_CMD_INFO command.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // DFU_CMD_ERASE
- //
- uint8_t ui8Command;
-
- //
- // Reserved - set to 0.
- //
- uint8_t ui8Reserved;
-
- //
- // Block start address / 1024
- //
- uint16_t ui16StartAddr;
-
- //
- // The number of blocks to erase.
- //
- uint16_t ui16NumBlocks;
-
- //
- // Reserved - set to 0.
- //
- uint8_t pui8Reserved2[2];
-}
-PACKED tDFUDownloadEraseHeader;
-
-//*****************************************************************************
-//
-// Header for the DFU_CMD_INFO command.
-//
-// This command may be used to query information about the connected device.
-// After sending the command, the information is returned on the next
-// USBD_DFU_REQUEST_UPLOAD request.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // DFU_CMD_INFO
- //
- uint8_t ui8Command;
-
- //
- // Reserved - set to 0.
- //
- uint8_t pui8Reserved[7];
-}
-PACKED tDFUDownloadInfoHeader;
-
-//*****************************************************************************
-//
-// Header for the DFU_CMD_BIN command.
-//
-// This command may be used to set the format of uploaded data. By default,
-// images read using USBD_DFU_REQUEST_UPLOAD are formatted with the appropriate
-// header to allow the same image to be flashed back to the device and have it
-// located at the address from which it originated. This is a requirement of
-// the DFU class specification (section 6.2 "the uploaded image must be
-// usable in a subsequent download") but may not be helpful in some cases where
-// the application wishes to receive only the binary image from flash. To
-// instruct the DFU device to omit the position and size header, send this
-// command with the bBinary field set to \b true prior to issuing a
-// USBD_DFU_REQUEST_UPLOAD for image data. The format choice remains in effect
-// until the command is sent once again with bBinary set to \b false.
-//
-// Note that the format choice affects only image data sent and not responses
-// read via USBD_DFU_REQUEST_UPLOAD following USBLib-specific commands such
-// as DFU_CMD_INFO.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // DFU_CMD_BIN
- //
- uint8_t ui8Command;
-
- //
- // Set to true to omit image header or false to include it (the default).
- //
- uint8_t ui8Binary;
-
- //
- // Reserved - set to 0.
- //
- uint8_t pui8Reserved[6];
-}
-PACKED tDFUDownloadBinHeader;
-
-//*****************************************************************************
-//
-// The DFU_CMD_RESET command uses a tDFUDownloadHeader structure since
-// only the ui8Command field is important. This command causes an immediate
-// reset of the the target board.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Payload returned in response to the DFU_CMD_INFO command.
-//!
-//! This is structure is returned in response to the first
-//! USBD_DFU_REQUEST_UPLOAD request following a DFU_CMD_INFO command.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The size of a flash block in bytes.
- //
- uint16_t ui16FlashBlockSize;
-
- //
- //! The number of blocks of flash in the device. Total flash size is
- //! ui16NumFlashBlocks * ui16FlashBlockSize.
- //
- uint16_t ui16NumFlashBlocks;
-
- //
- //! Information on the part number, family, version and package as
- //! read from SYSCTL register DID1.
- //
- uint32_t ui32PartInfo;
-
- //
- //! Information on the part class and revision as read from SYSCTL DID0.
- //
- uint32_t ui32ClassInfo;
-
- //
- //! Address 1 byte above the highest location the boot loader can access.
- //
- uint32_t ui32FlashTop;
-
- //
- //! Lowest address the boot loader can write or erase.
- //
- uint32_t ui32AppStartAddr;
-}
-PACKED tDFUDeviceInfo;
-
-#ifdef ewarm
-#pragma pack()
-#endif
-
-#endif // __USBDFU_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdma.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdma.c
deleted file mode 100644
index d78de6015..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbdma.c
+++ /dev/null
@@ -1,885 +0,0 @@
-//*****************************************************************************
-//
-// usbdma.c - USB Library DMA handling functions.
-//
-// Copyright (c) 2012-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "inc/hw_ints.h"
-#include "inc/hw_sysctl.h"
-#include "inc/hw_udma.h"
-#include "driverlib/debug.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/rtos_bindings.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/udma.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_dma_api Internal USB DMA functions
-//! @{
-//
-//*****************************************************************************
-
-static tUSBDMAInstance g_psUSBDMAInst[1];
-
-//*****************************************************************************
-//
-// Macros used to determine if a uDMA endpoint configuration is used for
-// receive or transmit.
-//
-//*****************************************************************************
-#define UDMAConfigIsRx(ui32Config) \
- ((ui32Config & UDMA_SRC_INC_NONE) == UDMA_SRC_INC_NONE)
-#define UDMAConfigIsTx(ui32Config) \
- ((ui32Config & UDMA_DEST_INC_NONE) == UDMA_DEST_INC_NONE)
-
-//*****************************************************************************
-//
-// USBLibDMAChannelStatus() for USB controllers that use the uDMA for DMA.
-//
-//*****************************************************************************
-static uint32_t
-uDMAUSBChannelStatus(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel)
-{
- uint32_t ui32Status;
-
- //
- // Initialize the current status to no events.
- //
- ui32Status = USBLIBSTATUS_DMA_IDLE;
-
- //
- // Check if there is a pending DMA transfer.
- //
- if(psUSBDMAInst->ui32Complete & (1 << (ui32Channel - 1)))
- {
- //
- // Return that the DMA transfer has completed and clear the
- // DMA pending flag.
- //
- ui32Status = USBLIBSTATUS_DMA_COMPLETE;
- }
- else if(psUSBDMAInst->ui32Pending & (1 << (ui32Channel - 1)))
- {
- //
- // DMA transfer is still pending.
- //
- ui32Status = USBLIBSTATUS_DMA_PENDING;
- }
- else
- {
- //
- // DMA transfer is still pending.
- //
- ui32Status = USBLIBSTATUS_DMA_IDLE;
- }
-
- return(ui32Status);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAIntStatus() for USB controllers that use uDMA.
-//
-//*****************************************************************************
-static uint32_t
-uDMAUSBIntStatus(tUSBDMAInstance *psUSBDMAInst)
-{
- uint32_t ui32Status, ui32Pending;
- int32_t i32Channel;
-
- //
- // Initialize the current status to no events.
- //
- ui32Status = 0;
-
- //
- // No pending interrupts by default.
- //
- ui32Status = 0;
-
- //
- // Save the pending channels.
- //
- ui32Pending = psUSBDMAInst->ui32Pending;
-
- //
- // Loop through channels to find out if any pending DMA transfers have
- // completed.
- //
- for(i32Channel = 0; i32Channel < USB_MAX_DMA_CHANNELS; i32Channel++)
- {
- //
- // If pending and stopped then the DMA completed.
- //
- if((ui32Pending & 1) &&
- (MAP_uDMAChannelModeGet(i32Channel) == UDMA_MODE_STOP))
- {
- ui32Status |= (1 << i32Channel);
- }
- ui32Pending >>= 1;
-
- //
- // Done if this is zero.
- //
- if(ui32Pending == 0)
- {
- break;
- }
- }
-
- return(ui32Status);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAIntStatusClear() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static void
-DMAUSBIntStatusClear(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Status)
-{
- //
- // Clear out the requested interrupts. Since the USB interface does not
- // have a true interrupt clear, this clears the current completed
- // status for the requested channels.
- //
- psUSBDMAInst->ui32Complete &= ~ui32Status;
-
- return;
-}
-
-//*****************************************************************************
-//
-// USBLibDMAIntHandler() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static void
-DMAUSBIntHandler(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32DMAIntStatus)
-{
- uint32_t ui32Channel;
-
- if(ui32DMAIntStatus == 0)
- {
- return;
- }
-
- //
- // Determine if the uDMA is used or the USB DMA controller.
- //
- for(ui32Channel = 0; ui32Channel < USB_MAX_DMA_CHANNELS; ui32Channel++)
- {
- //
- // Mark any pending interrupts as completed.
- //
- if(ui32DMAIntStatus & 1)
- {
- psUSBDMAInst->ui32Pending &= ~(1 << ui32Channel);
- psUSBDMAInst->ui32Complete |= (1 << ui32Channel);
- }
-
- //
- // Check the next channel.
- //
- ui32DMAIntStatus >>= 1;
-
- //
- // Break if there are no more pending DMA interrupts.
- //
- if(ui32DMAIntStatus == 0)
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelEnable() for USB controllers that use uDMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBChannelEnable(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel)
-{
- uint32_t ui32IntEnabled;
-
- //
- // Save if the interrupt was enabled or not.
- //
- ui32IntEnabled = IntIsEnabled(psUSBDMAInst->ui32IntNum);
-
- //
- // Disable the USB interrupt if it was enabled.
- //
- if(ui32IntEnabled)
- {
- OS_INT_DISABLE(psUSBDMAInst->ui32IntNum);
- }
-
- //
- // Mark this channel as pending and not complete.
- //
- psUSBDMAInst->ui32Pending |= (1 << (ui32Channel - 1));
- psUSBDMAInst->ui32Complete &= ~(1 << (ui32Channel - 1));
-
- //
- // Enable DMA for the endpoint.
- //
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- MAP_USBEndpointDMAEnable(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- USB_EP_DEV_OUT | USB_EP_HOST_IN);
- }
- else
- {
- MAP_USBEndpointDMAEnable(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- USB_EP_DEV_IN | USB_EP_HOST_OUT);
- }
-
- //
- // Enable the DMA in the uDMA controller.
- //
- MAP_uDMAChannelEnable(ui32Channel - 1);
-
- //
- // Enable the USB interrupt if it was enabled before.
- //
- if(ui32IntEnabled)
- {
- OS_INT_ENABLE(psUSBDMAInst->ui32IntNum);
- }
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelDisable() for USB controllers that use uDMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBChannelDisable(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel)
-{
- //
- // Disable DMA for the endpoint.
- //
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- USB_EP_DEV_OUT);
- }
- else
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- USB_EP_DEV_IN);
- }
-
- //
- // Disable the DMA channel in the uDMA controller.
- //
- MAP_uDMAChannelDisable(ui32Channel - 1);
-
- //
- // Clear out any pending or complete flag set for this DMA channel.
- //
- psUSBDMAInst->ui32Pending &= ~(1 << (ui32Channel - 1));
- psUSBDMAInst->ui32Complete &= ~(1 << (ui32Channel - 1));
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelIntEnable() for USB controllers that use uDMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBChannelIntEnable(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel)
-{
- //
- // There is no way to Enable channel interrupts when using uDMA.
- //
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelIntDisable() for USB controllers that use uDMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBChannelIntDisable(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel)
-{
- //
- // There is no way to Disable channel interrupts when using uDMA.
- //
-}
-
-//*****************************************************************************
-//
-// USBLibDMATransfer() for USB controllers that use the uDMA controller.
-//
-//*****************************************************************************
-static uint32_t
-uDMAUSBTransfer(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel,
- void *pvBuffer, uint32_t ui32Size)
-{
- void *pvFIFO;
- uint32_t uluDMAChannel;
- uint32_t ui32PacketCount;
- uint32_t ui32TransferCount;
-
- if((ui32Size < 64) || ((uint32_t)pvBuffer & 0x3))
- {
- return(0);
- }
-
- //
- // Mark this channel as pending and not complete.
- //
- psUSBDMAInst->ui32Pending |= (1 << (ui32Channel - 1));
- psUSBDMAInst->ui32Complete &= ~(1 << (ui32Channel - 1));
-
- //
- // Save the pointer to the data and the byte count.
- //
- psUSBDMAInst->ppui32Data[ui32Channel - 1] = pvBuffer;
- psUSBDMAInst->pui32Count[ui32Channel - 1] = ui32Size;
-
- //
- // Need the address of the FIFO.
- //
- pvFIFO = (void *)USBFIFOAddrGet(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1]);
-
- //
- // Calculate the uDMA channel for this RX channel.
- //
- uluDMAChannel = UDMA_CHANNEL_USBEP1RX + ui32Channel - 1;
-
- ui32TransferCount = ui32Size;
-
- if((psUSBDMAInst->pui32Config[ui32Channel - 1] & UDMA_SIZE_32) ==
- UDMA_SIZE_32)
- {
- ui32TransferCount >>= 2;
- }
- else if((psUSBDMAInst->pui32Config[ui32Channel - 1] & UDMA_SIZE_32) ==
- UDMA_SIZE_32)
- {
- ui32TransferCount >>= 1;
- }
-
- //
- // If source increment is none this is an RX transfer.
- //
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- MAP_uDMAChannelTransferSet(uluDMAChannel, UDMA_MODE_BASIC, pvFIFO,
- pvBuffer, ui32TransferCount);
- }
- else
- {
- MAP_uDMAChannelTransferSet(uluDMAChannel, UDMA_MODE_BASIC, pvBuffer,
- pvFIFO, ui32TransferCount);
- }
-
- //
- // Set the mode based on the size of the transfer. More than one
- // packet requires mode 1.
- //
- if(ui32Size > psUSBDMAInst->pui32MaxPacketSize[ui32Channel - 1])
- {
- //
- // Calculate the number of packets required for this transfer.
- //
- ui32PacketCount = ((ui32Size /
- psUSBDMAInst->pui32MaxPacketSize[ui32Channel - 1]));
-
- //
- // Set the packet count so that the last packet does not generate
- // another IN request.
- //
- USBEndpointPacketCountSet(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- ui32PacketCount);
-
- //
- // Configure the USB endpoint in mode 1 for this DMA transfer.
- //
- USBEndpointDMAConfigSet(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- psUSBDMAInst->pui32EPDMAMode1[ui32Channel - 1]);
- }
- else
- {
- //
- // Configure the USB endpoint in mode 0 for this DMA transfer.
- //
- USBEndpointDMAConfigSet(psUSBDMAInst->ui32Base,
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1],
- psUSBDMAInst->pui32EPDMAMode0[ui32Channel -1]);
- }
-
- //
- // Enable the uDMA channel to start the transfer
- //
- uDMAUSBChannelEnable(psUSBDMAInst, ui32Channel);
-
- return(ui32Size);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelAllocate() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static uint32_t
-uDMAUSBChannelAllocate(tUSBDMAInstance *psUSBDMAInst, uint8_t ui8Endpoint,
- uint32_t ui32MaxPacketSize, uint32_t ui32Config)
-{
- uint32_t ui32Channel;
-
- //
- // The DMA channels are organized in pairs on this controller and the
- // transmit channels are 1, 3, and 5 while receive are 0, 2, and 4.
- //
- if(ui32Config & USB_DMA_EP_RX)
- {
- ui32Channel = 0;
- }
- else
- {
- ui32Channel = 1;
- }
-
- //
- // Search for an available DMA channel to use.
- //
- for(; ui32Channel < USB_MAX_DMA_CHANNELS_0; ui32Channel += 2)
- {
- //
- // If the current endpoint value is zero then this channel is
- // available.
- //
- if(psUSBDMAInst->pui8Endpoint[ui32Channel] == 0)
- {
- //
- // Save the endpoint for this DMA channel.
- //
- psUSBDMAInst->pui8Endpoint[ui32Channel] = ui8Endpoint;
-
- //
- // Save the maximum packet size for the endpoint.
- //
- psUSBDMAInst->pui32MaxPacketSize[ui32Channel] = ui32MaxPacketSize;
-
- //
- // Set the channel configuration based on the direction.
- //
- if(ui32Config & USB_DMA_EP_RX)
- {
- psUSBDMAInst->pui32Config[ui32Channel] =
- UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
- UDMA_ARB_64;
-
- //
- // If in device mode and Isochronous.
- //
- if(((ui32Config & USB_DMA_EP_HOST) == 0) &&
- ((ui32Config & USB_DMA_EP_TYPE_M) == USB_DMA_EP_TYPE_ISOC))
- {
- //
- // USB_EP_AUTO_REQUEST is required for device
- // Isochronous endpoints.
- //
- psUSBDMAInst->pui32EPDMAMode0[ui32Channel] =
- USB_EP_DMA_MODE_0 |
- USB_EP_AUTO_REQUEST |
- USB_EP_HOST_IN;
- }
- else
- {
- psUSBDMAInst->pui32EPDMAMode0[ui32Channel] =
- USB_EP_DMA_MODE_0 |
- USB_EP_AUTO_CLEAR |
- USB_EP_HOST_IN;
- }
-
- //
- // Do not set auto request in device mode unless it is an
- // isochronous endpoint.
- //
- if(((ui32Config & USB_DMA_EP_HOST) == 0) &&
- ((ui32Config & USB_DMA_EP_TYPE_M) != USB_DMA_EP_TYPE_ISOC))
- {
- psUSBDMAInst->pui32EPDMAMode1[ui32Channel] =
- USB_EP_DMA_MODE_1 |
- USB_EP_HOST_IN |
- USB_EP_AUTO_CLEAR;
- }
- else
- {
- psUSBDMAInst->pui32EPDMAMode1[ui32Channel] =
- USB_EP_DMA_MODE_1 |
- USB_EP_HOST_IN |
- USB_EP_AUTO_REQUEST |
- USB_EP_AUTO_CLEAR;
- }
- }
- else
- {
- psUSBDMAInst->pui32Config[ui32Channel] =
- UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
- UDMA_ARB_64;
-
- psUSBDMAInst->pui32EPDMAMode0[ui32Channel] = USB_EP_DMA_MODE_0 |
- USB_EP_HOST_OUT;
- psUSBDMAInst->pui32EPDMAMode1[ui32Channel] = USB_EP_DMA_MODE_1 |
- USB_EP_HOST_OUT |
- USB_EP_AUTO_SET;
- }
-
- //
- // Map the uDMA channel to the given endpoint.
- //
- MAP_USBEndpointDMAChannel(psUSBDMAInst->ui32Base, ui8Endpoint,
- ui32Channel);
-
- //
- // Clear out the attributes on this channel.
- //
- MAP_uDMAChannelAttributeDisable(ui32Channel, UDMA_ATTR_ALL);
-
- //
- // Configure the uDMA channel for the pipe
- //
- MAP_uDMAChannelControlSet(ui32Channel,
- psUSBDMAInst->pui32Config[ui32Channel]);
-
- if(ui32Config & USB_DMA_EP_RX)
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base, ui8Endpoint,
- USB_EP_DEV_OUT);
- }
- else
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base, ui8Endpoint,
- USB_EP_DEV_IN);
- }
-
- //
- // Outside of this function all channels are 1 based as
- // zero is not a valid channel.
- //
- return(ui32Channel + 1);
- }
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAChannelRelease() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBChannelRelease(tUSBDMAInstance *psUSBDMAInst, uint8_t ui32Channel)
-{
- ASSERT(ui32Channel < USB_MAX_DMA_CHANNELS_0);
-
- //
- // Clear out the attributes on this channel.
- //
- MAP_uDMAChannelAttributeDisable(ui32Channel - 1, UDMA_ATTR_ALL);
-
- if(psUSBDMAInst->pui8Endpoint[ui32Channel] & USB_DMA_EP_RX)
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base,
- (psUSBDMAInst->pui8Endpoint[ui32Channel] & ~USB_DMA_EP_RX),
- USB_EP_DEV_OUT);
- }
- else
- {
- MAP_USBEndpointDMADisable(psUSBDMAInst->ui32Base,
- (psUSBDMAInst->pui8Endpoint[ui32Channel] & ~USB_DMA_EP_RX),
- USB_EP_DEV_IN);
- }
-
- //
- // Clear out the state for this endpoint.
- //
- psUSBDMAInst->pui8Endpoint[ui32Channel - 1] = 0;
- psUSBDMAInst->pui32Config[ui32Channel - 1] = 0;
- psUSBDMAInst->ui32Pending &= ~(1 << (ui32Channel - 1));
- psUSBDMAInst->ui32Complete &= ~(1 << (ui32Channel - 1));
- psUSBDMAInst->pui32MaxPacketSize[ui32Channel - 1] = 0;
-}
-
-//*****************************************************************************
-//
-// USBLibDMAUnitSizeSet() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBUnitSizeSet(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel,
- uint32_t ui32BitSize)
-{
- uint32_t ui32Value;
-
- ASSERT((ui32BitSize == UDMA_SIZE_8) || (ui32BitSize == UDMA_SIZE_16) ||
- (ui32BitSize == UDMA_SIZE_32));
-
- ASSERT(ui32Channel < USB_MAX_DMA_CHANNELS_0);
-
- if(ui32BitSize == 8)
- {
- ui32Value = UDMA_SIZE_8;
-
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- //
- // Receive increments destination and not source.
- //
- ui32Value |= UDMA_DST_INC_8 | UDMA_SRC_INC_NONE;
- }
- else
- {
- //
- // Transmit increments source and not destination.
- //
- ui32Value |= UDMA_SRC_INC_8 | UDMA_DST_INC_NONE;
- }
- }
- else if(ui32BitSize == 16)
- {
- ui32Value = UDMA_SIZE_16;
-
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- //
- // Receive increments destination and not source.
- //
- ui32Value |= UDMA_DST_INC_16 | UDMA_SRC_INC_NONE;
- }
- else
- {
- //
- // Transmit increments source and not destination.
- //
- ui32Value |= UDMA_SRC_INC_16 | UDMA_DST_INC_NONE;
- }
- }
- else
- {
- ui32Value = UDMA_SIZE_32;
-
- if(UDMAConfigIsRx(psUSBDMAInst->pui32Config[ui32Channel - 1]))
- {
- //
- // Receive increments destination and not source.
- //
- ui32Value |= (UDMA_DST_INC_32 | UDMA_SRC_INC_NONE);
- }
- else
- {
- //
- // Transmit increments source and not destination.
- //
- ui32Value |= (UDMA_SRC_INC_32 | UDMA_DST_INC_NONE);
- }
- }
-
- //
- // Keep the current arbitration size and or in the size.
- //
- psUSBDMAInst->pui32Config[ui32Channel - 1] &= 0x00ffffff;
- psUSBDMAInst->pui32Config[ui32Channel - 1] |= ui32Value;
- MAP_uDMAChannelControlSet(ui32Channel - 1,
- psUSBDMAInst->pui32Config[ui32Channel - 1]);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAArbSizeSet() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static void
-uDMAUSBArbSizeSet(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel,
- uint32_t ui32ArbSize)
-{
- uint32_t ui32Value;
-
- ASSERT(ui32Channel < USB_MAX_DMA_CHANNELS_0);
-
- //
- // Get the arbitration size value.
- //
- if(ui32ArbSize == 2)
- {
- ui32Value = UDMA_ARB_2;
- }
- else if(ui32ArbSize == 4)
- {
- ui32Value = UDMA_ARB_4;
- }
- else if(ui32ArbSize == 8)
- {
- ui32Value = UDMA_ARB_8;
- }
- else if(ui32ArbSize == 16)
- {
- ui32Value = UDMA_ARB_16;
- }
- else if(ui32ArbSize == 32)
- {
- ui32Value = UDMA_ARB_32;
- }
- else if(ui32ArbSize == 64)
- {
- ui32Value = UDMA_ARB_64;
- }
- else if(ui32ArbSize == 128)
- {
- ui32Value = UDMA_ARB_128;
- }
- else if(ui32ArbSize == 256)
- {
- ui32Value = UDMA_ARB_256;
- }
- else
- {
- //
- // Default to arbitration size of 1.
- //
- ui32Value = UDMA_ARB_1;
- }
-
- //
- // Keep the current size and or in the new arbitration size.
- //
- psUSBDMAInst->pui32Config[ui32Channel - 1] &= 0xff000000;
- psUSBDMAInst->pui32Config[ui32Channel - 1] |= ui32Value;
-
- //
- // Set the uDMA channel control, remember its channel starts at 0 and
- // not 1.
- //
- MAP_uDMAChannelControlSet(ui32Channel - 1,
- psUSBDMAInst->pui32Config[ui32Channel - 1]);
-}
-
-//*****************************************************************************
-//
-// USBLibDMAStatus() for USB controllers that use uDMA for DMA.
-//
-//*****************************************************************************
-static uint32_t
-DMAUSBStatus(tUSBDMAInstance *psUSBDMAInst)
-{
- return(0);
-}
-
-//*****************************************************************************
-//
-//! This function is used to initialize the DMA interface for a USB instance.
-//!
-//! \param ui32Index is the index of the USB controller for this instance.
-//!
-//! This function performs any initialization and configuration of the DMA
-//! portions of the USB controller. This function returns a pointer that
-//! is used with the remaining USBLibDMA APIs or the function returns zero
-//! if the requested controller cannot support DMA. If this function is called
-//! when already initialized it will not reinitialize the DMA controller and
-//! will instead return the previously initialized DMA instance.
-//!
-//! \return A pointer to use with USBLibDMA APIs.
-//
-//*****************************************************************************
-tUSBDMAInstance *
-USBLibDMAInit(uint32_t ui32Index)
-{
- uint32_t ui32Channel;
-
- ASSERT(ui32Index == 0);
-
- //
- // Make sure that the DMA has not already been initialized.
- //
- if(g_psUSBDMAInst[0].ui32Base == USB0_BASE)
- {
- return(&g_psUSBDMAInst[0]);
- }
-
- //
- // Save the base address of the USB controller.
- //
- g_psUSBDMAInst[0].ui32Base = USB0_BASE;
-
- //
- // Save the interrupt number for the USB controller.
- //
- g_psUSBDMAInst[0].ui32IntNum = INT_USB0_BLIZZARD;
-
- //
- // Initialize the function pointers.
- //
- g_psUSBDMAInst[0].pfnArbSizeSet = uDMAUSBArbSizeSet;
- g_psUSBDMAInst[0].pfnChannelAllocate = uDMAUSBChannelAllocate;
- g_psUSBDMAInst[0].pfnChannelDisable = uDMAUSBChannelDisable;
- g_psUSBDMAInst[0].pfnChannelEnable = uDMAUSBChannelEnable;
- g_psUSBDMAInst[0].pfnChannelIntEnable = uDMAUSBChannelIntEnable;
- g_psUSBDMAInst[0].pfnChannelIntDisable = uDMAUSBChannelIntDisable;
- g_psUSBDMAInst[0].pfnChannelRelease = uDMAUSBChannelRelease;
- g_psUSBDMAInst[0].pfnChannelStatus = uDMAUSBChannelStatus;
- g_psUSBDMAInst[0].pfnIntHandler = DMAUSBIntHandler;
- g_psUSBDMAInst[0].pfnIntStatus = uDMAUSBIntStatus;
- g_psUSBDMAInst[0].pfnIntStatusClear = DMAUSBIntStatusClear;
- g_psUSBDMAInst[0].pfnStatus = DMAUSBStatus;
- g_psUSBDMAInst[0].pfnTransfer = uDMAUSBTransfer;
- g_psUSBDMAInst[0].pfnUnitSizeSet = uDMAUSBUnitSizeSet;
-
- //
- // Clear out the endpoint and the current configuration.
- //
- for(ui32Channel = 0; ui32Channel < USB_MAX_DMA_CHANNELS; ui32Channel++)
- {
- g_psUSBDMAInst[0].pui8Endpoint[ui32Channel] = 0;
- g_psUSBDMAInst[0].pui32Config[ui32Channel] = 0;
- g_psUSBDMAInst[0].ui32Pending = 0;
- g_psUSBDMAInst[0].ui32Complete = 0;
- }
- return(&g_psUSBDMAInst[0]);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbhid.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbhid.h
deleted file mode 100644
index 0b7b9f50d..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbhid.h
+++ /dev/null
@@ -1,661 +0,0 @@
-//*****************************************************************************
-//
-// usbhid.h - Definitions used by HID class devices and hosts.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBHID_H__
-#define __USBHID_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup hid_device_class_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// HID Interface descriptor Subclasses.
-//
-//*****************************************************************************
-#define USB_HID_SCLASS_NONE 0x00
-#define USB_HID_SCLASS_BOOT 0x01
-
-//*****************************************************************************
-//
-// USB Interface descriptor HID protocols.
-//
-//*****************************************************************************
-#define USB_HID_PROTOCOL_NONE 0
-#define USB_HID_PROTOCOL_KEYB 1
-#define USB_HID_PROTOCOL_MOUSE 2
-
-//*****************************************************************************
-//
-// HID Class descriptor types.
-//
-//*****************************************************************************
-#define USB_HID_DTYPE_HID 0x21
-#define USB_HID_DTYPE_REPORT 0x22
-#define USB_HID_DTYPE_PHYSICAL 0x23
-
-//*****************************************************************************
-//
-// HID USB requests.
-//
-//*****************************************************************************
-#define USBREQ_GET_REPORT 0x01
-#define USBREQ_GET_IDLE 0x02
-#define USBREQ_GET_PROTOCOL 0x03
-#define USBREQ_SET_REPORT 0x09
-#define USBREQ_SET_IDLE 0x0a
-#define USBREQ_SET_PROTOCOL 0x0b
-
-//*****************************************************************************
-//
-// GET_REPORT or SET_REPORT Definitions.
-//
-//*****************************************************************************
-#define USB_HID_REPORT_IN 0x01
-#define USB_HID_REPORT_OUTPUT 0x02
-#define USB_HID_REPORT_FEATURE 0x03
-
-//*****************************************************************************
-//
-// GET_PROTOCOL or SET_PROTOCOL Definitions.
-//
-//*****************************************************************************
-#define USB_HID_PROTOCOL_BOOT 0
-#define USB_HID_PROTOCOL_REPORT 1
-
-//*****************************************************************************
-//
-// Report Values used with the Report macros.
-//
-//*****************************************************************************
-#define USB_HID_GENERIC_DESKTOP 0x01
-#define USB_HID_BUTTONS 0x09
-#define USB_HID_X 0x30
-#define USB_HID_Y 0x31
-
-#define USB_HID_POINTER 0x01
-#define USB_HID_MOUSE 0x02
-#define USB_HID_KEYBOARD 0x06
-
-#define USB_HID_PHYSICAL 0x00
-#define USB_HID_APPLICATION 0x01
-#define USB_HID_LOGICAL 0x02
-
-#define USB_HID_USAGE_POINTER 0x0109
-#define USB_HID_USAGE_BUTTONS 0x0509
-#define USB_HID_USAGE_LEDS 0x0508
-#define USB_HID_USAGE_KEYCODES 0x0507
-
-//*****************************************************************************
-//
-// HID mouse button definitions as used in the first byte of the output report
-// used in the BIOS mouse protocol.
-//
-//*****************************************************************************
-#define HID_MOUSE_BUTTON_1 0x01
-#define HID_MOUSE_BUTTON_2 0x02
-#define HID_MOUSE_BUTTON_3 0x04
-
-//*****************************************************************************
-//
-// HID Keyboard LED definitions as used in the first byte of the output report
-// used in the BIOS keyboard protocol.
-//
-//*****************************************************************************
-#define HID_KEYB_NUM_LOCK 0x01
-#define HID_KEYB_CAPS_LOCK 0x02
-#define HID_KEYB_SCROLL_LOCK 0x04
-#define HID_KEYB_COMPOSE 0x08
-#define HID_KEYB_KANA 0x10
-
-//*****************************************************************************
-//
-// HID Keyboard key modifiers as provided in the first byte of the input report
-// used in the BIOS keyboard protocol.
-//
-//*****************************************************************************
-#define HID_KEYB_LEFT_CTRL 0x01
-#define HID_KEYB_LEFT_SHIFT 0x02
-#define HID_KEYB_LEFT_ALT 0x04
-#define HID_KEYB_LEFT_GUI 0x08
-#define HID_KEYB_RIGHT_CTRL 0x10
-#define HID_KEYB_RIGHT_SHIFT 0x20
-#define HID_KEYB_RIGHT_ALT 0x40
-#define HID_KEYB_RIGHT_GUI 0x80
-
-//*****************************************************************************
-//
-// A subset of the HID keyboard usage IDs.
-//
-//*****************************************************************************
-#define HID_KEYB_USAGE_RESERVED 0x00
-#define HID_KEYB_USAGE_ROLLOVER 0x01
-#define HID_KEYB_USAGE_A 0x04
-#define HID_KEYB_USAGE_B 0x05
-#define HID_KEYB_USAGE_C 0x06
-#define HID_KEYB_USAGE_D 0x07
-#define HID_KEYB_USAGE_E 0x08
-#define HID_KEYB_USAGE_F 0x09
-#define HID_KEYB_USAGE_G 0x0A
-#define HID_KEYB_USAGE_H 0x0B
-#define HID_KEYB_USAGE_I 0x0C
-#define HID_KEYB_USAGE_J 0x0D
-#define HID_KEYB_USAGE_K 0x0E
-#define HID_KEYB_USAGE_L 0x0F
-#define HID_KEYB_USAGE_M 0x10
-#define HID_KEYB_USAGE_N 0x11
-#define HID_KEYB_USAGE_O 0x12
-#define HID_KEYB_USAGE_P 0x13
-#define HID_KEYB_USAGE_Q 0x14
-#define HID_KEYB_USAGE_R 0x15
-#define HID_KEYB_USAGE_S 0x16
-#define HID_KEYB_USAGE_T 0x17
-#define HID_KEYB_USAGE_U 0x18
-#define HID_KEYB_USAGE_V 0x19
-#define HID_KEYB_USAGE_W 0x1A
-#define HID_KEYB_USAGE_X 0x1B
-#define HID_KEYB_USAGE_Y 0x1C
-#define HID_KEYB_USAGE_Z 0x1D
-#define HID_KEYB_USAGE_1 0x1E
-#define HID_KEYB_USAGE_2 0x1F
-#define HID_KEYB_USAGE_3 0x20
-#define HID_KEYB_USAGE_4 0x21
-#define HID_KEYB_USAGE_5 0x22
-#define HID_KEYB_USAGE_6 0x23
-#define HID_KEYB_USAGE_7 0x24
-#define HID_KEYB_USAGE_8 0x25
-#define HID_KEYB_USAGE_9 0x26
-#define HID_KEYB_USAGE_0 0x27
-#define HID_KEYB_USAGE_ENTER 0x28
-#define HID_KEYB_USAGE_ESCAPE 0x29
-#define HID_KEYB_USAGE_BACKSPACE \
- 0x2A
-#define HID_KEYB_USAGE_TAB 0x2B
-#define HID_KEYB_USAGE_SPACE 0x2C
-#define HID_KEYB_USAGE_MINUS 0x2D
-#define HID_KEYB_USAGE_EQUAL 0x2E
-#define HID_KEYB_USAGE_LBRACKET 0x2F
-#define HID_KEYB_USAGE_RBRACKET 0x30
-#define HID_KEYB_USAGE_BSLASH 0x31
-#define HID_KEYB_USAGE_SEMICOLON \
- 0x33
-#define HID_KEYB_USAGE_FQUOTE 0x34
-#define HID_KEYB_USAGE_BQUOTE 0x35
-#define HID_KEYB_USAGE_COMMA 0x36
-#define HID_KEYB_USAGE_PERIOD 0x37
-#define HID_KEYB_USAGE_FSLASH 0x38
-#define HID_KEYB_USAGE_CAPSLOCK 0x39
-#define HID_KEYB_USAGE_F1 0x3A
-#define HID_KEYB_USAGE_F2 0x3B
-#define HID_KEYB_USAGE_F3 0x3C
-#define HID_KEYB_USAGE_F4 0x3D
-#define HID_KEYB_USAGE_F5 0x3E
-#define HID_KEYB_USAGE_F6 0x3F
-#define HID_KEYB_USAGE_F7 0x40
-#define HID_KEYB_USAGE_F8 0x41
-#define HID_KEYB_USAGE_F9 0x42
-#define HID_KEYB_USAGE_F10 0x43
-#define HID_KEYB_USAGE_F11 0x44
-#define HID_KEYB_USAGE_F12 0x45
-#define HID_KEYB_USAGE_SCROLLOCK \
- 0x47
-#define HID_KEYB_USAGE_PAGE_UP 0x4B
-#define HID_KEYB_USAGE_PAGE_DOWN \
- 0x4E
-#define HID_KEYB_USAGE_RIGHT_ARROW \
- 0x4F
-#define HID_KEYB_USAGE_LEFT_ARROW \
- 0x50
-#define HID_KEYB_USAGE_DOWN_ARROW \
- 0x51
-#define HID_KEYB_USAGE_UP_ARROW 0x52
-#define HID_KEYB_USAGE_NUMLOCK 0x53
-#define HID_KEYB_USAGE_KEYPAD_SLASH \
- 0x54
-#define HID_KEYB_USAGE_KEYPAD_STAR \
- 0x55
-#define HID_KEYB_USAGE_KEYPAD_MINUS \
- 0x56
-#define HID_KEYB_USAGE_KEYPAD_PLUS \
- 0x57
-#define HID_KEYB_USAGE_KEPAD_ENTER \
- 0x58
-#define HID_KEYB_USAGE_KEYPAD_1 0x59
-#define HID_KEYB_USAGE_KEYPAD_2 0x5A
-#define HID_KEYB_USAGE_KEYPAD_3 0x5B
-#define HID_KEYB_USAGE_KEYPAD_4 0x5C
-#define HID_KEYB_USAGE_KEYPAD_5 0x5D
-#define HID_KEYB_USAGE_KEYPAD_6 0x5E
-#define HID_KEYB_USAGE_KEYPAD_7 0x5F
-#define HID_KEYB_USAGE_KEYPAD_8 0x60
-#define HID_KEYB_USAGE_KEYPAD_9 0x61
-#define HID_KEYB_USAGE_KEYPAD_0 0x62
-#define HID_KEYB_USAGE_KEPAD_PERIOD \
- 0x63
-
-//*****************************************************************************
-//
-// HID descriptor country codes (most of these are described as "countries" in
-// the HID specification even though they are really languages).
-//
-//*****************************************************************************
-#define USB_HID_COUNTRY_NONE 0x00
-#define USB_HID_COUNTRY_ARABIC 0x01
-#define USB_HID_COUNTRY_BELGIAN 0x02
-#define USB_HID_COUNTRY_CANADA_BI \
- 0x03
-#define USB_HID_COUNTRY_CANADA_FR \
- 0x04
-#define USB_HID_COUNTRY_CZECH_REPUBLIC \
- 0x05
-#define USB_HID_COUNTRY_DANISH 0x06
-#define USB_HID_COUNTRY_FINNISH 0x07
-#define USB_HID_COUNTRY_FRENCH 0x08
-#define USB_HID_COUNTRY_GERMAN 0x09
-#define USB_HID_COUNTRY_GREEK 0x0A
-#define USB_HID_COUNTRY_HEBREW 0x0B
-#define USB_HID_COUNTRY_HUNGARY 0x0C
-#define USB_HID_COUNTRY_INTERNATIONAL_ISO \
- 0x0D
-#define USB_HID_COUNTRY_ITALIAN 0x0E
-#define USB_HID_COUNTRY_JAPAN_KATAKANA \
- 0x0F
-#define USB_HID_COUNTRY_KOREAN 0x10
-#define USB_HID_COUNTRY_LATIN_AMERICAN \
- 0x11
-#define USB_HID_COUNTRY_NETHERLANDS \
- 0x12
-#define USB_HID_COUNTRY_NORWEGIAN \
- 0x13
-#define USB_HID_COUNTRY_PERSIAN 0x14
-#define USB_HID_COUNTRY_POLAND 0x15
-#define USB_HID_COUNTRY_PORTUGUESE \
- 0x16
-#define USB_HID_COUNTRY_RUSSIA 0x17
-#define USB_HID_COUNTRY_SLOVAKIA \
- 0x18
-#define USB_HID_COUNTRY_SPANISH 0x19
-#define USB_HID_COUNTRY_SWEDISH 0x1A
-#define USB_HID_COUNTRY_SWISS_FRENCH \
- 0x1B
-#define USB_HID_COUNTRY_SWISS_GERMAN \
- 0x1C
-#define USB_HID_COUNTRY_SWITZERLAND \
- 0x1D
-#define USB_HID_COUNTRY_TAIWAN 0x1E
-#define USB_HID_COUNTRY_TURKISH_Q \
- 0x1F
-#define USB_HID_COUNTRY_UK 0x20
-#define USB_HID_COUNTRY_US 0x21
-#define USB_HID_COUNTRY_YUGOSLAVIA \
- 0x22
-#define USB_HID_COUNTRY_TURKISH_F \
- 0x23
-
-//*****************************************************************************
-//
-// Data flags used in Input item tags within report descriptors.
-//
-//*****************************************************************************
-#define USB_HID_INPUT_DATA 0x0000
-#define USB_HID_INPUT_CONSTANT 0x0001
-#define USB_HID_INPUT_ARRAY 0x0000
-#define USB_HID_INPUT_VARIABLE 0x0002
-#define USB_HID_INPUT_ABS 0x0000
-#define USB_HID_INPUT_RELATIVE 0x0004
-#define USB_HID_INPUT_NOWRAP 0x0000
-#define USB_HID_INPUT_WRAP 0x0008
-#define USB_HID_INPUT_LINEAR 0x0000
-#define USB_HID_INPUT_NONLINEAR 0x0010
-#define USB_HID_INPUT_PREFER 0x0000
-#define USB_HID_INPUT_NONPREFER 0x0020
-#define USB_HID_INPUT_NONULL 0x0000
-#define USB_HID_INPUT_NULL 0x0040
-#define USB_HID_INPUT_BITF 0x0100
-#define USB_HID_INPUT_BYTES 0x0000
-
-//*****************************************************************************
-//
-// Data flags used in Feature item tags within report descriptors.
-//
-//*****************************************************************************
-#define USB_HID_FEATURE_DATA 0x0000
-#define USB_HID_FEATURE_CONSTANT \
- 0x0001
-#define USB_HID_FEATURE_ARRAY 0x0000
-#define USB_HID_FEATURE_VARIABLE \
- 0x0002
-#define USB_HID_FEATURE_ABS 0x0000
-#define USB_HID_FEATURE_RELATIVE \
- 0x0004
-#define USB_HID_FEATURE_NOWRAP 0x0000
-#define USB_HID_FEATURE_WRAP 0x0008
-#define USB_HID_FEATURE_LINEAR 0x0000
-#define USB_HID_FEATURE_NONLINEAR \
- 0x0010
-#define USB_HID_FEATURE_PREFER 0x0000
-#define USB_HID_FEATURE_NONPREFER \
- 0x0020
-#define USB_HID_FEATURE_NONULL 0x0000
-#define USB_HID_FEATURE_NULL 0x0040
-#define USB_HID_FEATURE_BITF 0x0100
-#define USB_HID_FEATURE_BYTES 0x0000
-
-//*****************************************************************************
-//
-// Data flags used in Output item tags within report descriptors.
-//
-//*****************************************************************************
-#define USB_HID_OUTPUT_DATA 0x0000
-#define USB_HID_OUTPUT_CONSTANT 0x0001
-#define USB_HID_OUTPUT_ARRAY 0x0000
-#define USB_HID_OUTPUT_VARIABLE 0x0002
-#define USB_HID_OUTPUT_ABS 0x0000
-#define USB_HID_OUTPUT_RELATIVE 0x0004
-#define USB_HID_OUTPUT_NOWRAP 0x0000
-#define USB_HID_OUTPUT_WRAP 0x0008
-#define USB_HID_OUTPUT_LINEAR 0x0000
-#define USB_HID_OUTPUT_NONLINEAR \
- 0x0010
-#define USB_HID_OUTPUT_PREFER 0x0000
-#define USB_HID_OUTPUT_NONPREFER \
- 0x0020
-#define USB_HID_OUTPUT_NONULL 0x0000
-#define USB_HID_OUTPUT_NULL 0x0040
-#define USB_HID_OUTPUT_BITF 0x0100
-#define USB_HID_OUTPUT_BYTES 0x0000
-
-//*****************************************************************************
-//
-// Physical descriptor bias values.
-//
-//*****************************************************************************
-#define USB_HID_BIAS_NOT_APPLICABLE \
- 0x00
-#define USB_HID_BIAS_RIGHT_HAND 0x01
-#define USB_HID_BIAS_LEFT_HAND 0x02
-#define USB_HID_BIAS_BOTH_HANDS 0x03
-#define USB_HID_BIAS_EITHER_HAND \
- 0x04
-
-//*****************************************************************************
-//
-// Physical descriptor designator values.
-//
-//*****************************************************************************
-#define USB_HID_DESIGNATOR_NONE 0x00
-#define USB_HID_DESIGNATOR_HAND 0x01
-#define USB_HID_DESIGNATOR_EYEBALL \
- 0x02
-#define USB_HID_DESIGNATOR_EYEBROW \
- 0x03
-#define USB_HID_DESIGNATOR_EYELID \
- 0x04
-#define USB_HID_DESIGNATOR_EAR 0x05
-#define USB_HID_DESIGNATOR_NOSE 0x06
-#define USB_HID_DESIGNATOR_MOUTH \
- 0x07
-#define USB_HID_DESIGNATOR_UPPER_LIP \
- 0x08
-#define USB_HID_DESIGNATOR_LOWER_LIP \
- 0x09
-#define USB_HID_DESIGNATOR_JAW 0x0A
-#define USB_HID_DESIGNATOR_NECK 0x0B
-#define USB_HID_DESIGNATOR_UPPER_ARM \
- 0x0C
-#define USB_HID_DESIGNATOR_ELBOW \
- 0x0D
-#define USB_HID_DESIGNATOR_FOREARM \
- 0x0E
-#define USB_HID_DESIGNATOR_WRIST \
- 0x0F
-#define USB_HID_DESIGNATOR_PALM 0x10
-#define USB_HID_DESIGNATOR_THUMB \
- 0x11
-#define USB_HID_DESIGNATOR_INDEX_FINGER \
- 0x12
-#define USB_HID_DESIGNATOR_MIDDLE_FINGER \
- 0x13
-#define USB_HID_DESIGNATOR_RING_FINGER \
- 0x14
-#define USB_HID_DESIGNATOR_LITTLE_FINGER \
- 0x15
-#define USB_HID_DESIGNATOR_HEAD 0x16
-#define USB_HID_DESIGNATOR_SHOULDER \
- 0x17
-#define USB_HID_DESIGNATOR_HIP 0x18
-#define USB_HID_DESIGNATOR_WAIST \
- 0x19
-#define USB_HID_DESIGNATOR_THIGH \
- 0x1A
-#define USB_HID_DESIGNATOR_KNEE 0x1B
-#define USB_HID_DESIGNATOR_CALF 0x1C
-#define USB_HID_DESIGNATOR_ANKLE \
- 0x1D
-#define USB_HID_DESIGNATOR_FOOT 0x1E
-#define USB_HID_DESIGNATOR_HEEL 0x1F
-#define USB_HID_DESIGNATOR_BALL_OF_FOOT \
- 0x20
-#define USB_HID_DESIGNATOR_BIG_TOE \
- 0x21
-#define USB_HID_DESIGNATOR_SECOND_TOE \
- 0x22
-#define USB_HID_DESIGNATOR_THIRD_TOE \
- 0x23
-#define USB_HID_DESIGNATOR_FOURTH_TOE \
- 0x24
-#define USB_HID_DESIGNATOR_LITTLE_TOE \
- 0x25
-#define USB_HID_DESIGNATOR_BROW 0x26
-#define USB_HID_DESIGNATOR_CHEEK \
- 0x27
-
-//*****************************************************************************
-//
-// Physical descriptor qualifier values.
-//
-//*****************************************************************************
-#define USB_HID_QUALIFIER_NOT_APPLICABLE \
- (0x00 << 5)
-#define USB_HID_QUALIFIER_RIGHT (0x01 << 5)
-#define USB_HID_QUALIFIER_LEFT (0x02 << 5)
-#define USB_HID_QUALIFIER_BOTH (0x03 << 5)
-#define USB_HID_QUALIFIER_EITHER \
- (0x04 << 5)
-#define USB_HID_QUALIFIER_CENTER \
- (0x05 << 5)
-
-//*****************************************************************************
-//
-// This is the maximum value for a usage code.
-//
-//*****************************************************************************
-#define USBH_HID_MAX_USAGE 256
-#define USBH_HID_CAPS_ARRAY_SZ (USBH_HID_MAX_USAGE/sizeof(uint32_t))
-
-//*****************************************************************************
-//
-// All structures defined in this section of the header require byte packing of
-// fields. This is usually accomplished using the PACKED macro but, for IAR
-// Embedded Workbench, this requires a pragma.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-//! The class descriptor information structure is used to announce the presence
-//! of HID-specific class descriptors within the HID descriptor.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The type of HID class descriptor. This will be USB_HID_DTYPE_REPORT or
- //! USB_HID_DTYPE_PHYSICAL.
- //
- uint8_t bDescriptorType;
-
- //
- //! The total length of the HID class descriptor.
- //
- uint16_t wDescriptorLength;
-}
-PACKED tHIDClassDescriptorInfo;
-
-//*****************************************************************************
-//
-//! The HID descriptor is inserted following the interface descriptor and
-//! before the endpoint descriptors for a HID class device.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a HID descriptor, this will be
- //! USB_HID_DTYPE_HID (0x21).
- //
- uint8_t bDescriptorType;
-
- //
- //! A BCD value identifying the HID Class specification release supported
- //! by the device. For version 1.11, for example, this value would be
- //! 0x0111.
- //
- uint16_t bcdHID;
-
- //
- //! The country code for which this hardware is localized or 0 if no
- //! localization has been performed. Valid country (or language) codes are
- //! in labels of the form USB_HID_COUNTRY_xxx.
- uint8_t bCountryCode;
-
- //
- //! The number of class-specific descriptors that exist for this device.
- //! This indicates the number of class descriptor information structures
- //! that are appended to this structure and must be at least 1 (since all
- //! HID devices must publish at least 1 report descriptor).
- //
- uint8_t bNumDescriptors;
-
- //
- //! A table announcing each of the class-specific descriptors that this
- //! device publishes. The actual number of entries in the array is given
- //! by the bNumDescriptors field.
- //
- tHIDClassDescriptorInfo sClassDescriptor[1];
-}
-PACKED tHIDDescriptor;
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-//! This structure defines the mapping of USB usage identifiers to printable
-//! characters. The structure has three members that hold this information.
-//! The ui8BytesPerChar, indicates the number of bytes per character in
-//! the table. The pui32CapsLock array holds a packed bit array of usage
-//! identifiers that can be modified by the Caps Lock key. The pCharMapping
-//! array is treated as a double indexed array with two "columns". In the case
-//! of a single byte character it is treated as pairs of 8 bit values for
-//! unshifted and shifted values. In the case of a double byte characters it
-//! is treated as pairs of 16 bit values.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! Number of bytes per character in the pCharMapping table of this
- //! structure.
- //
- uint8_t ui8BytesPerChar;
-
- //
- //! This is a packed bitmasked structure with a one bit flags that
- //! indicates if the corresponding Usage ID is affected by the Caps Lock
- //! key.
- //
- uint32_t pui32CapsLock[USBH_HID_CAPS_ARRAY_SZ];
-
- //
- //! This is the indexed table of Usage ID to character value. It must be
- //! at least ui8BytesPerChar * 2 * USBH_HID_MAX_USAGE bytes in size as it
- //! is treated as a double indexed array.
- //
- void *pvCharMapping;
-}
-tHIDKeyboardUsageTable;
-
-//*****************************************************************************
-//
-// The US Keyboard mapping used by USB keyboard usage ID to character mapping.
-//
-//*****************************************************************************
-extern const tHIDKeyboardUsageTable g_sUSKeyboardMap;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBHID_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbkeyboardmap.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbkeyboardmap.c
deleted file mode 100644
index 97b685450..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbkeyboardmap.c
+++ /dev/null
@@ -1,145 +0,0 @@
-//*****************************************************************************
-//
-// usbkeyboardmap.c - This file holds the table to enable USB keyboard usage
-// identifiers to be mapped to printable characters.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "usblib/usblib.h"
-#include "usblib/usbhid.h"
-
-//*****************************************************************************
-//
-// This is the array that hold the unshifted and shifted ASCII character for
-// each usage ID.
-//
-//*****************************************************************************
-const uint8_t g_pui8KeyBoardMap[USBH_HID_MAX_USAGE][2] =
-{
-//
-// Usage ID to character mapping Usage ID CAPS Lock
-//
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 0 - 3 0
- {'a', 'A'}, {'b', 'B'}, {'c', 'C'}, {'d', 'D'}, // 4 - 7 f
- {'e', 'E'}, {'f', 'F'}, {'g', 'G'}, {'h', 'H'}, // 8 - 11 f
- {'i', 'I'}, {'j', 'J'}, {'k', 'K'}, {'l', 'L'}, // 12 - 15 f
- {'m', 'M'}, {'n', 'N'}, {'o', 'O'}, {'p', 'P'}, // 16 - 19 f
- {'q', 'Q'}, {'r', 'R'}, {'s', 'S'}, {'t', 'T'}, // 20 - 23 f
- {'u', 'U'}, {'v', 'V'}, {'w', 'W'}, {'x', 'X'}, // 24 - 27 f
- {'y', 'Y'}, {'z', 'Z'}, {'1', '!'}, {'2', '@'}, // 28 - 31 3
-
- {'3', '#'}, {'4', '$'}, {'5', '%'}, {'6', '^'}, // 32 - 35 0
- {'7', '&'}, {'8', '*'}, {'9', '('}, {'0', ')'}, // 36 - 39 0
- {'\n', '\n'}, {0, 0}, {0, 0}, {'\t', '\t'}, // 40 - 43 0
- {' ', ' '}, {'-', '_'}, {'=', '+'}, {'[', '{'}, // 44 - 47 0
- {']', '}'}, {'\\', '|'},{'`', '~'}, {';', ':'}, // 48 - 51 0
- {'\'', '"'}, {'`', '~'}, {',', '<'}, {'.', '>'},// 52 - 55 0
- {'/', '?'}, {0, 0}, {0, 0}, {0, 0}, // 56 - 59 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 60 - 63 0
-
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 64 - 67 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 68 - 71 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 72 - 75 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 76 - 79 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 80 - 83 0
- {'/', '/'}, {'*', '*'}, {'-', '-'}, {'+', '+'}, // 84 - 87 0
- {'\n', '\n'}, {'1', 0}, {'2', 0}, {'3', 0}, // 88 - 91 0
- {'4', 0}, {'5', 0}, {'6', 0}, {'7', 0}, // 92 - 95 0
-
- {'8', 0}, {'9', 0}, {'0', 0}, {'.', 0}, // 96 - 99 0
- {'\\', '|'},{0, 0}, {0, 0}, {'=', '+'}, // 100 - 103 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 104 - 107 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 108 - 111 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 112 - 115 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 116 - 119 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 120 - 123 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 124 - 127 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 128 - 131 0
-
- {0, 0}, {',', ','}, {'=', '='}, {0, 0}, // 132 - 135 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 136 - 139 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 140 - 143 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 144 - 147 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 148 - 151 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 152 - 155 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 156 - 159 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 160 - 163 0
-
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 164 - 167 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 168 - 171 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 172 - 175 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 174 - 179 0
- {0, 0}, {0, 0}, {'(', '('}, {')', ')'}, // 180 - 183 0
- {'{', '{'}, {'}', '}'}, {'\t', '\t'}, {0, 0}, // 184 - 187 0
- {'A', 'A'}, {'B', 'B'}, {'C', 'C'}, {'D', 'D'}, // 188 - 191 0
- {'E', 'E'}, {'F', 'F'}, {0, 0}, {'^', '^'}, // 192 - 195 0
-
- {'%', '%'}, {'<', '<'}, {'>', '>'}, {'&', '&'}, // 196 - 199 0
- {'&', '&'}, {'|', '|'}, {'|', '|'}, {':', ':'}, // 200 - 203 0
- {'#', '#'}, {' ', ' '}, {'@', '@'}, {'!', '!'}, // 204 - 207 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 208 - 211 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 212 - 215 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 216 - 219 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 220 - 223 0
-
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 224 - 227 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 228 - 231 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 232 - 235 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 236 - 239 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 240 - 243 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 244 - 247 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 248 - 251 0
- {0, 0}, {0, 0}, {0, 0}, {0, 0}, // 252 - 255 0
-};
-
-//*****************************************************************************
-//
-// This is the structure that defines the mapping of USB usage IDs to ASCII
-// values for printing.
-//
-//*****************************************************************************
-const tHIDKeyboardUsageTable g_sUSKeyboardMap =
-{
- //
- // One byte per character.
- //
- 1,
- //
- // Packed bit array of usages codes that are effected by Caps Lock state.
- //
- {
- 0x3ffffff0, // Alpha characters are only one affected by CAPS LOCK
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- },
- //
- // The large table of the direct mapping of usage id's to ascii characters.
- //
- (void *)g_pui8KeyBoardMap
-};
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblib.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblib.h
deleted file mode 100644
index e5d7168dd..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblib.h
+++ /dev/null
@@ -1,1799 +0,0 @@
-//*****************************************************************************
-//
-// usblib.h - Main header file for the USB Library.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBLIB_H__
-#define __USBLIB_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-// This is the maximum number of devices we can support when in host mode and
-// using a hub. By default, we support up to 4 devices (plus 1 internally for
-// the hub itself).
-//
-//*****************************************************************************
-#ifndef MAX_USB_DEVICES
-#define MAX_USB_DEVICES 5
-#endif
-
-//*****************************************************************************
-//
-// This is the maximum number of endpoints supported by the usblib.
-//
-//*****************************************************************************
-#ifndef USBLIB_NUM_EP
-#define USBLIB_NUM_EP 8 // Number of supported endpoints.
-#endif
-
-//*****************************************************************************
-//
-// The following macro allows compiler-independent syntax to be used to
-// define packed structures. A typical structure definition using these
-// macros will look similar to the following example:
-//
-// #ifdef ewarm
-// #pragma pack(1)
-// #endif
-//
-// typedef struct _PackedStructName
-// {
-// uint32_t ui32FirstField;
-// int8_t i8CharMember;
-// uint16_t ui16Short;
-// }
-// PACKED tPackedStructName;
-//
-// #ifdef ewarm
-// #pragma pack()
-// #endif
-//
-// The conditional blocks related to ewarm include the #pragma pack() lines
-// only if the IAR Embedded Workbench compiler is being used. Unfortunately,
-// it is not possible to emit a #pragma from within a macro definition so this
-// must be done explicitly.
-//
-//*****************************************************************************
-#if defined(ccs) || \
- defined(codered) || \
- defined(gcc) || \
- defined(rvmdk) || \
- defined(__ARMCC_VERSION) || \
- defined(sourcerygxx)
-#define PACKED __attribute__ ((packed))
-#elif defined(ewarm)
-#define PACKED
-#else
-#error Unrecognized COMPILER!
-#endif
-//*****************************************************************************
-//
-// Assorted language IDs from the document "USB_LANGIDs.pdf" provided by the
-// USB Implementers' Forum (Version 1.0).
-//
-//*****************************************************************************
-#define USB_LANG_CHINESE_PRC 0x0804 // Chinese (PRC)
-#define USB_LANG_CHINESE_TAIWAN 0x0404 // Chinese (Taiwan)
-#define USB_LANG_EN_US 0x0409 // English (United States)
-#define USB_LANG_EN_UK 0x0809 // English (United Kingdom)
-#define USB_LANG_EN_AUS 0x0C09 // English (Australia)
-#define USB_LANG_EN_CA 0x1009 // English (Canada)
-#define USB_LANG_EN_NZ 0x1409 // English (New Zealand)
-#define USB_LANG_FRENCH 0x040C // French (Standard)
-#define USB_LANG_GERMAN 0x0407 // German (Standard)
-#define USB_LANG_HINDI 0x0439 // Hindi
-#define USB_LANG_ITALIAN 0x0410 // Italian (Standard)
-#define USB_LANG_JAPANESE 0x0411 // Japanese
-#define USB_LANG_KOREAN 0x0412 // Korean
-#define USB_LANG_ES_TRAD 0x040A // Spanish (Traditional)
-#define USB_LANG_ES_MODERN 0x0C0A // Spanish (Modern)
-#define USB_LANG_SWAHILI 0x0441 // Swahili (Kenya)
-#define USB_LANG_URDU_IN 0x0820 // Urdu (India)
-#define USB_LANG_URDU_PK 0x0420 // Urdu (Pakistan)
-
-//*****************************************************************************
-//
-//! \addtogroup usbchap9_src
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Note:
-//
-// Structure definitions which are derived directly from the USB specification
-// use field names from the specification. Since a somewhat different version
-// of Hungarian prefix notation is used from the standard, beware of making
-// assumptions about field sizes based on the field prefix when using
-// these structures. Of particular note is the difference in the meaning of
-// the 'i' prefix. In USB structures, this indicates a single byte index
-// whereas in other code, this is an integer or enumeration variable.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// All structures defined in this section of the header require byte packing of
-// fields. This is usually accomplished using the PACKED macro but, for IAR
-// Embedded Workbench, this requires a pragma.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-// Definitions related to standard USB device requests (sections 9.3 & 9.4)
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! The standard USB request header as defined in section 9.3 of the USB 2.0
-//! specification.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! Determines the type and direction of the request.
- //
- uint8_t bmRequestType;
-
- //
- //! Identifies the specific request being made.
- //
- uint8_t bRequest;
-
- //
- //! Word-sized field that varies according to the request.
- //
- uint16_t wValue;
-
- //
- //! Word-sized field that varies according to the request; typically used
- //! to pass an index or offset.
- //
- uint16_t wIndex;
-
- //
- //! The number of bytes to transfer if there is a data stage to the
- //! request.
- //
- uint16_t wLength;
-
-}
-PACKED tUSBRequest;
-
-//*****************************************************************************
-//
-// The following defines are used with the bmRequestType member of tUSBRequest.
-//
-// Request types have 3 bit fields:
-// 4:0 - Is the recipient type.
-// 6:5 - Is the request type.
-// 7 - Is the direction of the request.
-//
-//*****************************************************************************
-#define USB_RTYPE_DIR_IN 0x80
-#define USB_RTYPE_DIR_OUT 0x00
-
-#define USB_RTYPE_TYPE_M 0x60
-#define USB_RTYPE_VENDOR 0x40
-#define USB_RTYPE_CLASS 0x20
-#define USB_RTYPE_STANDARD 0x00
-
-#define USB_RTYPE_RECIPIENT_M 0x1f
-#define USB_RTYPE_OTHER 0x03
-#define USB_RTYPE_ENDPOINT 0x02
-#define USB_RTYPE_INTERFACE 0x01
-#define USB_RTYPE_DEVICE 0x00
-
-//*****************************************************************************
-//
-// Standard USB requests IDs used in the bRequest field of tUSBRequest.
-//
-//*****************************************************************************
-#define USBREQ_GET_STATUS 0x00
-#define USBREQ_CLEAR_FEATURE 0x01
-#define USBREQ_SET_FEATURE 0x03
-#define USBREQ_SET_ADDRESS 0x05
-#define USBREQ_GET_DESCRIPTOR 0x06
-#define USBREQ_SET_DESCRIPTOR 0x07
-#define USBREQ_GET_CONFIG 0x08
-#define USBREQ_SET_CONFIG 0x09
-#define USBREQ_GET_INTERFACE 0x0a
-#define USBREQ_SET_INTERFACE 0x0b
-#define USBREQ_SYNC_FRAME 0x0c
-
-//*****************************************************************************
-//
-// Data returned from a USBREQ_GET_STATUS request to a device.
-//
-//*****************************************************************************
-#define USB_STATUS_SELF_PWR 0x0001 // Currently self powered.
-#define USB_STATUS_BUS_PWR 0x0000 // Currently bus-powered.
-#define USB_STATUS_PWR_M 0x0001 // Mask for power mode.
-#define USB_STATUS_REMOTE_WAKE 0x0002 // Remote wake-up is currently enabled.
-
-//*****************************************************************************
-//
-// Feature Selectors (tUSBRequest.wValue) passed on USBREQ_CLEAR_FEATURE and
-// USBREQ_SET_FEATURE.
-//
-//*****************************************************************************
-#define USB_FEATURE_EP_HALT 0x0000 // Endpoint halt feature.
-#define USB_FEATURE_REMOTE_WAKE 0x0001 // Remote wake feature, device only.
-#define USB_FEATURE_TEST_MODE 0x0002 // Test mode
-
-//*****************************************************************************
-//
-// Endpoint Selectors (tUSBRequest.wIndex) passed on USBREQ_CLEAR_FEATURE,
-// USBREQ_SET_FEATURE and USBREQ_GET_STATUS.
-//
-//*****************************************************************************
-#define USB_REQ_EP_NUM_M 0x007F
-#define USB_REQ_EP_DIR_M 0x0080
-#define USB_REQ_EP_DIR_IN 0x0080
-#define USB_REQ_EP_DIR_OUT 0x0000
-
-//*****************************************************************************
-//
-// Standard USB descriptor types. These values are passed in the upper bytes
-// of tUSBRequest.wValue on USBREQ_GET_DESCRIPTOR and also appear in the
-// bDescriptorType field of standard USB descriptors.
-//
-//*****************************************************************************
-#define USB_DTYPE_DEVICE 1
-#define USB_DTYPE_CONFIGURATION 2
-#define USB_DTYPE_STRING 3
-#define USB_DTYPE_INTERFACE 4
-#define USB_DTYPE_ENDPOINT 5
-#define USB_DTYPE_DEVICE_QUAL 6
-#define USB_DTYPE_OSPEED_CONF 7
-#define USB_DTYPE_INTERFACE_PWR 8
-#define USB_DTYPE_OTG 9
-#define USB_DTYPE_INTERFACE_ASC 11
-#define USB_DTYPE_CS_INTERFACE 36
-#define USB_DTYPE_HUB 41
-
-//*****************************************************************************
-//
-// Definitions related to USB descriptors (sections 9.5 & 9.6)
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This structure describes a generic descriptor header. These fields are to
-//! be found at the beginning of all valid USB descriptors.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor (including this length byte) expressed
- //! in bytes.
- //
- uint8_t bLength;
-
- //
- //! The type identifier of the descriptor whose information follows. For
- //! standard descriptors, this field could contain, for example,
- //! USB_DTYPE_DEVICE to identify a device descriptor or USB_DTYPE_ENDPOINT
- //! to identify an endpoint descriptor.
- //
- uint8_t bDescriptorType;
-}
-PACKED tDescriptorHeader;
-
-//*****************************************************************************
-//
-//! This structure describes the USB device descriptor as defined in USB
-//! 2.0 specification section 9.6.1.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. All device descriptors are
- //! 18 bytes long.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a device descriptor, this will be
- //! USB_DTYPE_DEVICE (1).
- //
- uint8_t bDescriptorType;
-
- //
- //! The USB Specification Release Number in BCD format. For USB 2.0, this
- //! will be 0x0200.
- //
- uint16_t bcdUSB;
-
- //
- //! The device class code.
- //
- uint8_t bDeviceClass;
-
- //
- //! The device subclass code. This value qualifies the value found in the
- //! bDeviceClass field.
- //
- uint8_t bDeviceSubClass;
-
- //
- //! The device protocol code. This value is qualified by the values of
- //! bDeviceClass and bDeviceSubClass.
- //
- uint8_t bDeviceProtocol;
-
- //
- //! The maximum packet size for endpoint zero. Valid values are 8, 16, 32
- //! and 64.
- //
- uint8_t bMaxPacketSize0;
-
- //
- //! The device Vendor ID (VID) as assigned by the USB-IF.
- //
- uint16_t idVendor;
-
- //
- //! The device Product ID (PID) as assigned by the manufacturer.
- //
- uint16_t idProduct;
-
- //
- //! The device release number in BCD format.
- //
- uint16_t bcdDevice;
-
- //
- //! The index of a string descriptor describing the manufacturer.
- //
- uint8_t iManufacturer;
-
- //
- //! The index of a string descriptor describing the product.
- //
- uint8_t iProduct;
-
- //
- //! The index of a string descriptor describing the device's serial
- //! number.
- //
- uint8_t iSerialNumber;
-
- //
- //! The number of possible configurations offered by the device. This
- //! field indicates the number of distinct configuration descriptors that
- //! the device offers.
- //
- uint8_t bNumConfigurations;
-}
-PACKED tDeviceDescriptor;
-
-//*****************************************************************************
-//
-// USB Device Class codes used in the tDeviceDescriptor.bDeviceClass field.
-// Definitions for the bDeviceSubClass and bDeviceProtocol fields are device
-// specific and can be found in the appropriate device class header files.
-//
-//*****************************************************************************
-#define USB_CLASS_DEVICE 0x00
-#define USB_CLASS_AUDIO 0x01
-#define USB_CLASS_CDC 0x02
-#define USB_CLASS_HID 0x03
-#define USB_CLASS_PHYSICAL 0x05
-#define USB_CLASS_IMAGE 0x06
-#define USB_CLASS_PRINTER 0x07
-#define USB_CLASS_MASS_STORAGE 0x08
-#define USB_CLASS_HUB 0x09
-#define USB_CLASS_CDC_DATA 0x0a
-#define USB_CLASS_SMART_CARD 0x0b
-#define USB_CLASS_SECURITY 0x0d
-#define USB_CLASS_VIDEO 0x0e
-#define USB_CLASS_HEALTHCARE 0x0f
-#define USB_CLASS_DIAG_DEVICE 0xdc
-#define USB_CLASS_WIRELESS 0xe0
-#define USB_CLASS_MISC 0xef
-#define USB_CLASS_APP_SPECIFIC 0xfe
-#define USB_CLASS_VEND_SPECIFIC 0xff
-#define USB_CLASS_EVENTS 0xffffffff
-
-//*****************************************************************************
-//
-// Generic values for undefined subclass and protocol.
-//
-//*****************************************************************************
-#define USB_SUBCLASS_UNDEFINED 0x00
-#define USB_PROTOCOL_UNDEFINED 0x00
-
-//*****************************************************************************
-//
-// The following are the miscellaneous subclass values.
-//
-//*****************************************************************************
-#define USB_MISC_SUBCLASS_SYNC 0x01
-#define USB_MISC_SUBCLASS_COMMON \
- 0x02
-
-//*****************************************************************************
-//
-// These following are miscellaneous protocol values.
-//
-//*****************************************************************************
-#define USB_MISC_PROTOCOL_IAD 0x01
-
-//*****************************************************************************
-//
-// These following are hub protocol values.
-//
-//*****************************************************************************
-#define USB_HUB_PROTOCOL_FS 0x00
-#define USB_HUB_PROTOCOL_SINGLE 0x01
-#define USB_HUB_PROTOCOL_MULTI 0x02
-
-//*****************************************************************************
-//
-//! This structure describes the USB device qualifier descriptor as defined in
-//! the USB 2.0 specification, section 9.6.2.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. All device qualifier
- //! descriptors are 10 bytes long.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a device descriptor, this will be
- //! USB_DTYPE_DEVICE_QUAL (6).
- //
- uint8_t bDescriptorType;
-
- //
- //! The USB Specification Release Number in BCD format. For USB 2.0, this
- //! will be 0x0200.
- //
- uint16_t bcdUSB;
-
- //
- //! The device class code.
- //
- uint8_t bDeviceClass;
-
- //
- //! The device subclass code. This value qualifies the value found in the
- //! bDeviceClass field.
- //
- uint8_t bDeviceSubClass;
-
- //
- //! The device protocol code. This value is qualified by the values of
- //! bDeviceClass and bDeviceSubClass.
- //
- uint8_t bDeviceProtocol;
-
- //
- //! The maximum packet size for endpoint zero when operating at a speed
- //! other than high speed.
- //
- uint8_t bMaxPacketSize0;
-
- //
- //! The number of other-speed configurations supported.
- //
- uint8_t bNumConfigurations;
-
- //
- //! Reserved for future use. Must be set to zero.
- //
- uint8_t bReserved;
-}
-PACKED tDeviceQualifierDescriptor;
-
-//*****************************************************************************
-//
-//! This structure describes the USB configuration descriptor as defined in
-//! USB 2.0 specification section 9.6.3. This structure also applies to the
-//! USB other speed configuration descriptor defined in section 9.6.4.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. All configuration descriptors
- //! are 9 bytes long.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a configuration descriptor, this will
- //! be USB_DTYPE_CONFIGURATION (2).
- //
- uint8_t bDescriptorType;
-
- //
- //! The total length of data returned for this configuration. This
- //! includes the combined length of all descriptors (configuration,
- //! interface, endpoint and class- or vendor-specific) returned for this
- //! configuration.
- //
- uint16_t wTotalLength;
-
- //
- //! The number of interface supported by this configuration.
- //
- uint8_t bNumInterfaces;
-
- //
- //! The value used as an argument to the SetConfiguration standard request
- //! to select this configuration.
- //
- uint8_t bConfigurationValue;
-
- //
- //! The index of a string descriptor describing this configuration.
- //
- uint8_t iConfiguration;
-
- //
- //! Attributes of this configuration.
- //
- uint8_t bmAttributes;
-
- //
- //! The maximum power consumption of the USB device from the bus in this
- //! configuration when the device is fully operational. This is expressed
- //! in units of 2mA so, for example, 100 represents 200mA.
- //
- uint8_t bMaxPower;
-}
-PACKED tConfigDescriptor;
-
-//*****************************************************************************
-//
-// Flags used in constructing the value assigned to the field
-// tConfigDescriptor.bmAttributes. Note that bit 7 is reserved and must be set
-// to 1.
-//
-//*****************************************************************************
-#define USB_CONF_ATTR_PWR_M 0xC0
-
-#define USB_CONF_ATTR_SELF_PWR 0xC0
-#define USB_CONF_ATTR_BUS_PWR 0x80
-#define USB_CONF_ATTR_RWAKE 0xA0
-
-//*****************************************************************************
-//
-//! This structure describes the USB interface descriptor as defined in USB
-//! 2.0 specification section 9.6.5.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. All interface descriptors
- //! are 9 bytes long.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an interface descriptor, this will
- //! be USB_DTYPE_INTERFACE (4).
- //
- uint8_t bDescriptorType;
-
- //
- //! The number of this interface. This is a zero based index into the
- //! array of concurrent interfaces supported by this configuration.
- //
- uint8_t bInterfaceNumber;
-
- //
- //! The value used to select this alternate setting for the interface
- //! defined in bInterfaceNumber.
- //
- uint8_t bAlternateSetting;
-
- //
- //! The number of endpoints used by this interface (excluding endpoint
- //! zero).
- //
- uint8_t bNumEndpoints;
-
- //
- //! The interface class code as assigned by the USB-IF.
- //
- uint8_t bInterfaceClass;
-
- //
- //! The interface subclass code as assigned by the USB-IF.
- //
- uint8_t bInterfaceSubClass;
-
- //
- //! The interface protocol code as assigned by the USB-IF.
- //
- uint8_t bInterfaceProtocol;
-
- //
- //! The index of a string descriptor describing this interface.
- //
- uint8_t iInterface;
-}
-PACKED tInterfaceDescriptor;
-
-//*****************************************************************************
-//
-//! This structure describes the USB endpoint descriptor as defined in USB
-//! 2.0 specification section 9.6.6.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. All endpoint descriptors
- //! are 7 bytes long.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For an endpoint descriptor, this will
- //! be USB_DTYPE_ENDPOINT (5).
- //
- uint8_t bDescriptorType;
-
- //
- //! The address of the endpoint. This field contains the endpoint number
- //! ORed with flag USB_EP_DESC_OUT or USB_EP_DESC_IN to indicate the
- //! endpoint direction.
- //
- uint8_t bEndpointAddress;
-
- //
- //! The endpoint transfer type, USB_EP_ATTR_CONTROL, USB_EP_ATTR_ISOC,
- //! USB_EP_ATTR_BULK or USB_EP_ATTR_INT and, if isochronous, additional
- //! flags indicating usage type and synchronization method.
- //
- uint8_t bmAttributes;
-
- //
- //! The maximum packet size this endpoint is capable of sending or
- //! receiving when this configuration is selected. For high speed
- //! isochronous or interrupt endpoints, bits 11 and 12 are used to
- //! pass additional information.
- //
- uint16_t wMaxPacketSize;
-
- //
- //! The polling interval for data transfers expressed in frames or
- //! micro frames depending upon the operating speed.
- //
- uint8_t bInterval;
-}
-PACKED tEndpointDescriptor;
-
-//*****************************************************************************
-//
-// Flags used in constructing the value assigned to the field
-// tEndpointDescriptor.bEndpointAddress.
-//
-//*****************************************************************************
-#define USB_EP_DESC_OUT 0x00
-#define USB_EP_DESC_IN 0x80
-#define USB_EP_DESC_NUM_M 0x0f
-
-//*****************************************************************************
-//
-// Mask used to extract the maximum packet size (in bytes) from the
-// wMaxPacketSize field of the endpoint descriptor.
-//
-//*****************************************************************************
-#define USB_EP_MAX_PACKET_COUNT_M \
- 0x07FF
-
-//*****************************************************************************
-//
-// Endpoint attributes used in tEndpointDescriptor.bmAttributes.
-//
-//*****************************************************************************
-#define USB_EP_ATTR_CONTROL 0x00
-#define USB_EP_ATTR_ISOC 0x01
-#define USB_EP_ATTR_BULK 0x02
-#define USB_EP_ATTR_INT 0x03
-#define USB_EP_ATTR_TYPE_M 0x03
-
-#define USB_EP_ATTR_ISOC_M 0x0c
-#define USB_EP_ATTR_ISOC_NOSYNC 0x00
-#define USB_EP_ATTR_ISOC_ASYNC 0x04
-#define USB_EP_ATTR_ISOC_ADAPT 0x08
-#define USB_EP_ATTR_ISOC_SYNC 0x0c
-#define USB_EP_ATTR_USAGE_M 0x30
-#define USB_EP_ATTR_USAGE_DATA 0x00
-#define USB_EP_ATTR_USAGE_FEEDBACK \
- 0x10
-#define USB_EP_ATTR_USAGE_IMPFEEDBACK \
- 0x20
-
-//*****************************************************************************
-//
-//! This structure describes the USB string descriptor for index 0 as defined
-//! in USB 2.0 specification section 9.6.7. Note that the number of language
-//! IDs is variable and can be determined by examining bLength. The number of
-//! language IDs present in the descriptor is given by ((bLength - 2) / 2).
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. This value will vary
- //! depending upon the number of language codes provided in the descriptor.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a string descriptor, this will be
- //! USB_DTYPE_STRING (3).
- //
- uint8_t bDescriptorType;
-
- //
- //! The language code (LANGID) for the first supported language. Note that
- //! this descriptor may support multiple languages, in which case, the
- //! number of elements in the wLANGID array will increase and bLength will
- //! be updated accordingly.
- //
- uint16_t wLANGID[1];
-}
-PACKED tString0Descriptor;
-
-//*****************************************************************************
-//
-//! This structure describes the USB string descriptor for all string indexes
-//! other than 0 as defined in USB 2.0 specification section 9.6.7.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The length of this descriptor in bytes. This value will be 2 greater
- //! than the number of bytes comprising the UNICODE string that the
- //! descriptor contains.
- //
- uint8_t bLength;
-
- //
- //! The type of the descriptor. For a string descriptor, this will be
- //! USB_DTYPE_STRING (3).
- //
- uint8_t bDescriptorType;
-
- //
- //! The first byte of the UNICODE string. This string is not NULL
- //! terminated. Its length (in bytes) can be computed by subtracting 2
- //! from the value in the bLength field.
- //
- uint8_t bString;
-}
-PACKED tStringDescriptor;
-
-//*****************************************************************************
-//
-//! Write a 16-bit value to a USB descriptor block.
-//!
-//! \param ui16Value is the 16-bit value to write to the descriptor.
-//!
-//! This helper macro is used in descriptor definitions to write two-byte
-//! values. Since the configuration descriptor contains all interface and
-//! endpoint descriptors in a contiguous block of memory, these descriptors are
-//! typically defined using an array of bytes rather than as packed structures.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define USBShort(ui16Value) (ui16Value & 0xff), (ui16Value >> 8)
-
-//*****************************************************************************
-//
-//! Write a 24-bit value to a USB descriptor block.
-//!
-//! \param ui32Value is the 24-bit value that to write to the descriptor.
-//!
-//! This helper macro is used in descriptor definitions to write three-byte
-//! values. Since the configuration descriptor contains all interface and
-//! endpoint descriptors in a contiguous block of memory, these descriptors are
-//! typically defined using an array of bytes rather than as packed structures.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define USB3Byte(ui32Value) (ui32Value & 0xff), \
- ((ui32Value >> 8) & 0xff), \
- ((ui32Value >> 16) & 0xff)
-
-//*****************************************************************************
-//
-//! Write a 32-bit value to a USB descriptor block.
-//!
-//! \param ui32Value is the 32-bit value that to write to the descriptor.
-//!
-//! This helper macro is used in descriptor definitions to write four-byte
-//! values. Since the configuration descriptor contains all interface and
-//! endpoint descriptors in a contiguous block of memory, these descriptors are
-//! typically defined using an array of bytes rather than as packed structures.
-//!
-//! \return Not a function.
-//
-//*****************************************************************************
-#define USBLong(ui32Value) (ui32Value & 0xff), \
- ((ui32Value >> 8) & 0xff), \
- ((ui32Value >> 16) & 0xff), \
- ((ui32Value >> 24) & 0xff)
-
-//*****************************************************************************
-//
-//! Traverse to the next USB descriptor in a block.
-//!
-//! \param ptr points to the first byte of a descriptor in a block of
-//! USB descriptors.
-//!
-//! This macro aids in traversing lists of descriptors by returning a pointer
-//! to the next descriptor in the list given a pointer to the current one.
-//!
-//! \return Returns a pointer to the next descriptor in the block following
-//! \e ptr.
-//!
-//*****************************************************************************
-#define NEXT_USB_DESCRIPTOR(ptr) \
- (tDescriptorHeader *)(((uint8_t *)(ptr)) + \
- *((uint8_t *)(ptr)))
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-// Close the usbchap9_src Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup device_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Function prototype for any standard USB request.
-//
-//*****************************************************************************
-typedef void (* tStdRequest)(void *pvInstance, tUSBRequest *pUSBRequest);
-
-//*****************************************************************************
-//
-// Data callback for receiving data from an endpoint.
-//
-//*****************************************************************************
-typedef void (* tInfoCallback)(void *pvInstance, uint32_t ui32Info);
-
-//*****************************************************************************
-//
-// Callback made to indicate that an interface alternate setting change has
-// occurred.
-//
-//*****************************************************************************
-typedef void (* tInterfaceCallback)(void *pvInstance, uint8_t ui8InterfaceNum,
- uint8_t ui8AlternateSetting);
-
-//*****************************************************************************
-//
-// Generic interrupt handler callbacks.
-//
-//*****************************************************************************
-typedef void (* tUSBIntHandler)(void *pvInstance);
-
-//*****************************************************************************
-//
-// Interrupt handler callbacks that have status information.
-//
-//*****************************************************************************
-typedef void (* tUSBEPIntHandler)(void *pvInstance, uint32_t ui32Status);
-
-//*****************************************************************************
-//
-// Generic handler callbacks that are used when the callers needs to call into
-// an instance of class.
-//
-//*****************************************************************************
-typedef void (* tUSBDeviceHandler)(void *pvInstance, uint32_t ui32Request,
- void *pvRequestData);
-
-//*****************************************************************************
-//
-//! USB event handler functions used during enumeration and operation of the
-//! device stack.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! This callback is made whenever the USB host requests a non-standard
- //! descriptor from the device.
- //
- tStdRequest pfnGetDescriptor;
-
- //
- //! This callback is made whenever the USB host makes a non-standard
- //! request.
- //
- tStdRequest pfnRequestHandler;
-
- //
- //! This callback is made in response to a SetInterface request from the
- //! host.
- //
- tInterfaceCallback pfnInterfaceChange;
-
- //
- //! This callback is made in response to a SetConfiguration request from
- //! the host.
- //
- tInfoCallback pfnConfigChange;
-
- //
- //! This callback is made when data has been received following to a call
- //! to USBDCDRequestDataEP0.
- //
- tInfoCallback pfnDataReceived;
-
- //
- //! This callback is made when data has been transmitted following a call
- //! to USBDCDSendDataEP0.
- //
- tInfoCallback pfnDataSent;
-
- //
- //! This callback is made when a USB reset is detected.
- //
- tUSBIntHandler pfnResetHandler;
-
- //
- //! This callback is made when the bus has been inactive long enough to
- //! trigger a suspend condition.
- //
- tUSBIntHandler pfnSuspendHandler;
-
- //
- //! This is called when resume signaling is detected.
- //
- tUSBIntHandler pfnResumeHandler;
-
- //
- //! This callback is made when the device is disconnected from the USB bus.
- //
- tUSBIntHandler pfnDisconnectHandler;
-
- //
- //! This callback is made to inform the device of activity on all endpoints
- //! other than endpoint zero.
- //
- tUSBEPIntHandler pfnEndpointHandler;
-
- //
- //! This generic handler is provided to allow requests based on
- //! a given instance to be passed into a device. This is commonly used
- //! by a top level composite device that is using multiple instances of
- //! a class.
- //
- tUSBDeviceHandler pfnDeviceHandler;
-}
-tCustomHandlers;
-
-//*****************************************************************************
-//
-//! This structure defines a contiguous block of data which contains a group
-//! of descriptors that form part of a configuration descriptor for a device.
-//! It is assumed that a config section contains only whole descriptors. It is
-//! not valid to split a single descriptor across multiple sections.
-//!
-//*****************************************************************************
-typedef struct
-{
- //
- //! The number of bytes of descriptor data pointed to by pui8Data.
- //
- uint16_t ui16Size;
-
- //
- //! A pointer to a block of data containing an integral number of
- //! USB descriptors which form part of a larger configuration descriptor.
- //
- const uint8_t *pui8Data;
-}
-tConfigSection;
-
-//*****************************************************************************
-//
-//! This is the top level structure defining a USB device configuration
-//! descriptor. A configuration descriptor contains a collection of device-
-//! specific descriptors in addition to the basic config, interface and
-//! endpoint descriptors. To allow flexibility in constructing the
-//! configuration, the descriptor is described in terms of a list of data
-//! blocks. The first block must contain the configuration descriptor itself
-//! and the following blocks are appended to this in order to produce the
-//! full descriptor sent to the host in response to a GetDescriptor request
-//! for the configuration descriptor.
-//!
-//*****************************************************************************
-typedef struct
-{
- //
- //! The number of sections comprising the full descriptor for this
- //! configuration.
- //
- uint8_t ui8NumSections;
-
- //
- //! A pointer to an array of ui8NumSections section pointers which must
- //! be concatenated to form the configuration descriptor.
- //
- const tConfigSection * const *psSections;
-}
-tConfigHeader;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup general_usblib_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Predeclare of the DMA instance structure.
-//
-//*****************************************************************************
-typedef struct tUSBDMAInstance tUSBDMAInstance;
-
-//*****************************************************************************
-//
-// USB descriptor parsing functions found in usbdesc.c
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! The USB_DESC_ANY label is used as a wild card in several of the descriptor
-//! parsing APIs to determine whether or not particular search criteria should
-//! be ignored.
-//
-//*****************************************************************************
-#define USB_DESC_ANY 0xFFFFFFFF
-
-extern uint32_t USBDescGetNum(tDescriptorHeader *psDesc, uint32_t ui32Size,
- uint32_t ui32Type);
-extern tDescriptorHeader *USBDescGet(tDescriptorHeader *psDesc,
- uint32_t ui32Size, uint32_t ui32Type,
- uint32_t ui32Index);
-extern uint32_t
- USBDescGetNumAlternateInterfaces(tConfigDescriptor *psConfig,
- uint8_t ui8InterfaceNumber);
-extern tInterfaceDescriptor *USBDescGetInterface(tConfigDescriptor *psConfig,
- uint32_t ui32Index,
- uint32_t ui32AltCfg);
-extern tEndpointDescriptor *
- USBDescGetInterfaceEndpoint(tInterfaceDescriptor *psInterface,
- uint32_t ui32Index, uint32_t ui32Size);
-
-//*****************************************************************************
-//
-//! The operating mode required by the USB library client. This type is used
-//! by applications which wish to be able to switch between host and device
-//! modes by calling the USBStackModeSet() API.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- //! Operate in USB device mode with active monitoring of VBUS and the
- //! ID pin must be pulled to a logic high value.
- //
- eUSBModeDevice = 0,
-
- //
- //! Operate in USB host mode with active monitoring of VBUS and the ID pin
- //! must be pulled to a logic low value.
- //
- eUSBModeHost,
-
- //
- //! Operate as an On-The-Go device which requires both VBUS and ID to be
- //! connected directly to the USB controller from the USB connector.
- //
- eUSBModeOTG,
-
- //
- //! A marker indicating that no USB mode has yet been set by the
- //! application.
- //
- eUSBModeNone,
-
- //
- //! Force host mode so that the VBUS and ID pins are not used or monitored
- //! by the USB controller.
- //
- eUSBModeForceHost,
-
- //
- //! Forcing device mode so that the VBUS and ID pins are not used or
- //! monitored by the USB controller.
- //
- eUSBModeForceDevice,
-}
-tUSBMode;
-
-//*****************************************************************************
-//
-// A pointer to a USB mode callback function. This function is called by the
-// USB library to indicate to the application which operating mode it should
-// use, host or device.
-//
-//*****************************************************************************
-typedef void (*tUSBModeCallback)(uint32_t ui32Index, tUSBMode iMode);
-
-//*****************************************************************************
-//
-//! USB callback function.
-//!
-//! \param pvCBData is the callback pointer associated with the instance
-//! generating the callback. This is a value provided by the client during
-//! initialization of the instance making the callback.
-//! \param ui32Event is the identifier of the asynchronous event which is being
-//! notified to the client.
-//! \param ui32MsgParam is an event-specific parameter.
-//! \param pvMsgData is an event-specific data pointer.
-//!
-//! A function pointer provided to the USB layer by the application
-//! which will be called to notify it of all asynchronous events relating to
-//! data transmission or reception. This callback is used by device class
-//! drivers and host pipe functions.
-//!
-//! \return Returns an event-dependent value.
-//
-//*****************************************************************************
-typedef uint32_t (* tUSBCallback)(void *pvCBData, uint32_t ui32Event,
- uint32_t ui32MsgParam, void *pvMsgData);
-
-//*****************************************************************************
-//
-// Error sources reported via USB_EVENT_ERROR.
-//
-//*****************************************************************************
-
-//
-//! The host received an invalid PID in a transaction.
-//
-#define USBERR_HOST_IN_PID_ERROR \
- 0x01000000
-
-//
-//! The host did not receive a response from a device.
-//
-#define USBERR_HOST_IN_NOT_COMP 0x00100000
-
-//
-//! The host received a stall on an IN endpoint.
-//
-#define USBERR_HOST_IN_STALL 0x00400000
-
-//
-//! The host detected a CRC or bit-stuffing error (isochronous mode).
-//
-#define USBERR_HOST_IN_DATA_ERROR \
- 0x00080000
-
-//
-//! The host received NAK on an IN endpoint for longer than the specified
-//! timeout period (interrupt, bulk and control modes).
-//
-#define USBERR_HOST_IN_NAK_TO 0x00080000
-
-//
-//! The host failed to communicate with a device via an IN endpoint.
-//
-#define USBERR_HOST_IN_ERROR 0x00040000
-
-//
-//! The host receive FIFO is full.
-//
-#define USBERR_HOST_IN_FIFO_FULL \
- 0x00020000
-//
-//! The host received NAK on an OUT endpoint for longer than the specified
-//! timeout period (bulk, interrupt and control modes).
-//
-#define USBERR_HOST_OUT_NAK_TO 0x00000080
-
-//
-//! The host did not receive a response from a device (isochronous mode).
-//
-#define USBERR_HOST_OUT_NOT_COMP \
- 0x00000080
-
-//
-//! The host received a stall on an OUT endpoint.
-//
-#define USBERR_HOST_OUT_STALL 0x00000020
-
-//
-//! The host failed to communicate with a device via an OUT endpoint.
-//
-#define USBERR_HOST_OUT_ERROR 0x00000004
-
-//
-//! The host received NAK on endpoint 0 for longer than the configured
-//! timeout.
-//
-#define USBERR_HOST_EP0_NAK_TO 0x00000080
-
-//
-//! The host failed to communicate with a device via an endpoint zero.
-//
-#define USBERR_HOST_EP0_ERROR 0x00000010
-
-//
-//! The device detected a CRC error in received data.
-//
-#define USBERR_DEV_RX_DATA_ERROR \
- 0x00080000
-
-//
-//! The device was unable to receive a packet from the host since the receive
-//! FIFO is full.
-//
-#define USBERR_DEV_RX_OVERRUN 0x00040000
-
-//
-//! The device receive FIFO is full.
-//
-#define USBERR_DEV_RX_FIFO_FULL 0x00020000
-
-//*****************************************************************************
-//
-// Close the general_usblib_api Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_events
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! This structure is used to return generic event based information to an
-//! application. The following events are currently supported:
-//! USB_EVENT_CONNECTED, USB_EVENT_DISCONNECTED, USB_EVENT_POWER_FAULT,
-//! USB_EVENT_POWER_FAULT, USB_EVENT_POWER_ENABLE,
-//! USB_EVENT_POWER_DISABLE and USB_EVENT_SOF.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! One of the USB_EVENT_ values.
- //
- uint32_t ui32Event;
-
- //
- //! The caller supplied instance value that is passed to event handlers.
- //
- uint32_t ui32Instance;
-}
-tEventInfo;
-
-//*****************************************************************************
-//
-// Base identifiers for groups of USB events. These are used by both the
-// device class drivers and host layer.
-//
-// USB_CLASS_EVENT_BASE is the lowest identifier that should be used for
-// a class-specific event. Individual event bases are defined for each
-// of the supported device class drivers. Events with IDs between
-// USB_EVENT_BASE and USB_CLASS_EVENT_BASE are reserved for stack use.
-//
-//*****************************************************************************
-#define USB_EVENT_BASE 0x0000
-#define USB_CLASS_EVENT_BASE 0x8000
-
-//*****************************************************************************
-//
-// Event base identifiers for the various device classes supported in host
-// and device modes.
-// The first 0x800 values of a range are reserved for the device specific
-// messages and the second 0x800 values of a range are used for the host
-// specific messages for a given class.
-//
-//*****************************************************************************
-#define USBD_CDC_EVENT_BASE (USB_CLASS_EVENT_BASE + 0)
-#define USBD_HID_EVENT_BASE (USB_CLASS_EVENT_BASE + 0x1000)
-#define USBD_HID_KEYB_EVENT_BASE \
- (USBD_HID_EVENT_BASE + 0x100)
-#define USBD_BULK_EVENT_BASE (USB_CLASS_EVENT_BASE + 0x2000)
-#define USBD_MSC_EVENT_BASE (USB_CLASS_EVENT_BASE + 0x3000)
-#define USBD_AUDIO_EVENT_BASE (USB_CLASS_EVENT_BASE + 0x4000)
-#define USBD_DFU_EVENT_BASE (USB_CLASS_EVENT_BASE + 0x5000)
-
-#define USBH_CDC_EVENT_BASE (USBD_CDC_EVENT_BASE + 0x800)
-#define USBH_HID_EVENT_BASE (USBD_HID_EVENT_BASE + 0x800)
-#define USBH_BULK_EVENT_BASE (USBD_BULK_EVENT_BASE + 0x800)
-#define USBH_MSC_EVENT_BASE (USBD_MSC_EVENT_BASE + 0x800)
-#define USBH_AUDIO_EVENT_BASE (USBD_AUDIO_EVENT_BASE + 0x800)
-
-//*****************************************************************************
-//
-// General events supported by device classes and host pipes.
-//
-//*****************************************************************************
-
-//
-//! The device is now attached to a USB host and ready to begin sending
-//! and receiving data (used by device classes only).
-//
-#define USB_EVENT_CONNECTED (USB_EVENT_BASE + 0)
-
-//
-//! The device has been disconnected from the USB host (used by device classes
-//! only).
-//!
-//! \note In device mode, the USB_EVENT_DISCONNECTED will not be reported if
-//! the MCU's PB1/USB0VBUS pin is connected to a fixed +5 Volts rather than
-//! directly to the VBUS pin on the USB connector.
-//
-#define USB_EVENT_DISCONNECTED (USB_EVENT_BASE + 1)
-
-//
-//! Data has been received and is in the buffer provided or is ready to be
-//! read from the FIFO.
-//
-#define USB_EVENT_RX_AVAILABLE (USB_EVENT_BASE + 2)
-
-//
-//! This event is sent by a lower layer to inquire about the amount of
-//! unprocessed data buffered in the layers above. It is used in cases
-//! where a low level driver needs to ensure that all preceding data has
-//! been processed prior to performing some action or making some notification.
-//! Clients receiving this event should return the number of bytes of data
-//! that are unprocessed or 0 if no outstanding data remains.
-//
-#define USB_EVENT_DATA_REMAINING \
- (USB_EVENT_BASE + 3)
-
-//
-//! This event is sent by a lower layer supporting DMA to request a buffer in
-//! which the next received packet may be stored. The \e ui32MsgValue
-//! parameter indicates the maximum size of packet that can be received in this
-//! channel and \e pvMsgData points to storage which should be written with the
-//! returned buffer pointer. The return value from the callback should be the
-//! size of the buffer allocated (which may be less than the maximum size
-//! passed in \e ui32MsgValue if the client knows that fewer bytes are expected
-//! to be received) or 0 if no buffer is being returned.
-//
-#define USB_EVENT_REQUEST_BUFFER \
- (USB_EVENT_BASE + 4)
-
-//
-//! Data has been sent and acknowledged. If this event is received via the
-//! USB buffer callback, the \e ui32MsgValue parameter indicates the number of
-//! bytes from the transmit buffer that have been successfully transmitted
-//! and acknowledged.
-//
-#define USB_EVENT_TX_COMPLETE (USB_EVENT_BASE + 5)
-
-//
-//! An error has been reported on the channel or pipe. The \e ui32MsgValue
-//! parameter indicates the source(s) of the error and is the logical OR
-//! combination of "USBERR_" flags defined below.
-//
-#define USB_EVENT_ERROR (USB_EVENT_BASE + 6)
-
-//
-//! The bus has entered suspend state.
-//
-#define USB_EVENT_SUSPEND (USB_EVENT_BASE + 7)
-
-//
-//! The bus has left suspend state.
-//
-#define USB_EVENT_RESUME (USB_EVENT_BASE + 8)
-
-//
-//! A scheduler event has occurred.
-//
-#define USB_EVENT_SCHEDULER (USB_EVENT_BASE + 9)
-//
-//! A device or host has detected a stall condition.
-//
-#define USB_EVENT_STALL (USB_EVENT_BASE + 10)
-
-//
-//! The host detected a power fault condition.
-//
-#define USB_EVENT_POWER_FAULT (USB_EVENT_BASE + 11)
-
-//
-//! The controller has detected a A-Side cable and needs power applied This is
-//! only generated on OTG parts if automatic power control is disabled.
-//
-#define USB_EVENT_POWER_ENABLE (USB_EVENT_BASE + 12)
-
-//
-//! The controller needs power removed, This is only generated on OTG parts
-//! if automatic power control is disabled.
-//
-#define USB_EVENT_POWER_DISABLE (USB_EVENT_BASE + 13)
-
-//
-//! This define is used with a device class's pfnDeviceHandler handler function
-//! to indicate that the USB library has changed the interface number. This
-//! event is typically due to the class being included in a composite device.
-//!
-//! The \e pvInstance is a pointer to an instance of the device being accessed.
-//!
-//! The \e ui32Request is USB_EVENT_COMP_IFACE_CHANGE.
-//!
-//! The \e pvRequestData is a pointer to a two byte array where the first value
-//! is the old interface number and the second is the new interface number.
-//
-#define USB_EVENT_COMP_IFACE_CHANGE \
- (USB_EVENT_BASE + 14)
-
-//
-//! This define is used with a device class's pfnDeviceHandler handler function
-//! to indicate that the USB library has changed the endpoint number. This
-//! event is typically due to the class being included in a composite device.
-//!
-//! The \e pvInstance is a pointer to an instance of the device being accessed.
-//!
-//! The \e ui32Request is USB_EVENT_COMP_EP_CHANGE.
-//!
-//! The \e pvRequestData is a pointer to a two byte array where the first value
-//! is the old endpoint number and the second is the new endpoint number. The
-//! endpoint numbers should be exactly as USB specification defines them and
-//! bit 7 set indicates an IN endpoint and bit 7 clear indicates an OUT
-//! endpoint.
-//
-#define USB_EVENT_COMP_EP_CHANGE \
- (USB_EVENT_BASE + 15)
-
-//
-//! This define is used with a device class's pfnDeviceHandler handler function
-//! to indicate that the USB library has changed the string index number for a
-//! string. This event is typically due to the class being included in a
-//! composite device.
-//!
-//! The \e pvInstance is a pointer to an instance of the device being accessed.
-//!
-//! The \e ui32Request is USB_EVENT_COMP_STR_CHANGE.
-//!
-//! The \e pvRequestData is a pointer to a two byte array where the first value
-//! is the old string index and the second is the new string index.
-//
-#define USB_EVENT_COMP_STR_CHANGE \
- (USB_EVENT_BASE + 16)
-
-//
-//! This define is used with a device class's pfnDeviceHandler handler function
-//! to indicate that the USB library has changed the configuration descriptor.
-//! This allows the class to make final adjustments to the configuration
-//! descriptor. This event is typically due to the class being included in a
-//! composite device.
-//!
-//! The \e pvInstance is a pointer to an instance of the device being accessed.
-//!
-//! The \e ui32Request is USB_EVENT_COMP_CONFIG.
-//!
-//! The \e pvRequestData is a pointer to the beginning of the configuration
-//! descriptor for the device instance.
-//
-#define USB_EVENT_COMP_CONFIG (USB_EVENT_BASE + 17)
-
-//
-//! An unknown device is now attached to a USB host. This value is only valid
-//! for the generic event handler and not other device handlers. It is
-//! useful for applications that want to know when an unknown device is
-//! connected and what the class is of the unknown device.
-//!
-//! The \e ui32Instance is actually the class of the unsupported
-//! device that was connected.
-//
-#define USB_EVENT_UNKNOWN_CONNECTED \
- (USB_EVENT_BASE + 18)
-
-//
-//! A start of frame event has occurred. This event is disabled by default
-//! and must be enabled via a call from the application to USBHCDEventEnable().
-//
-#define USB_EVENT_SOF (USB_EVENT_BASE + 19)
-
-//*****************************************************************************
-//
-// Close the usblib_events Doxygen group.
-//! @}
-//
-//*****************************************************************************
-//*****************************************************************************
-//
-//! \addtogroup usblib_buffer_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! A function pointer type which describes either a class driver packet read
-//! or packet write function (both have the same prototype) to the USB
-//! buffer object.
-//
-//*****************************************************************************
-typedef uint32_t (* tUSBPacketTransfer)(void *pvHandle, uint8_t *pi8Data,
- uint32_t ui32Length, bool bLast);
-
-//*****************************************************************************
-//
-//! A function pointer type which describes either a class driver transmit
-//! or receive packet available function (both have the same prototype) to the
-//! USB buffer object.
-//
-//*****************************************************************************
-typedef uint32_t (* tUSBPacketAvailable)(void *pvHandle);
-
-//*****************************************************************************
-//
-//! The number of bytes of workspace that each USB buffer object requires.
-//! This workspace memory is provided to the buffer on USBBufferInit() in
-//! the \e pvWorkspace field of the \e tUSBBuffer structure.
-//
-//*****************************************************************************
-#define USB_BUFFER_WORKSPACE_SIZE \
- 24
-
-//*****************************************************************************
-//
-//! The structure used by the application to initialize a buffer object that
-//! will provide buffered access to either a transmit or receive channel.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! This field sets the mode of the buffer. If true, the buffer
- //! operates as a transmit buffer and supports calls to USBBufferWrite
- //! by the client. If false, the buffer operates as a receive buffer
- //! and supports calls to USBBufferRead.
- //
- bool bTransmitBuffer;
-
- //
- //! A pointer to the callback function which will be called to notify
- //! the application of all asynchronous events related to the operation
- //! of the buffer.
- //
- tUSBCallback pfnCallback;
-
- //
- //! A pointer that the buffer will pass back to the client in the
- //! first parameter of all callbacks related to this instance.
- //
- void *pvCBData;
-
- //
- //! The function which should be called to transmit a packet of data
- //! in transmit mode or receive a packet in receive mode.
- //
- tUSBPacketTransfer pfnTransfer;
-
- //
- //! The function which should be called to determine if the endpoint is
- //! ready to accept a new packet for transmission in transmit mode or
- //! to determine the size of the buffer required to read a packet in
- //! receive mode.
- //
- tUSBPacketAvailable pfnAvailable;
-
- //
- //! The handle to pass to the low level function pointers
- //! provided in the pfnTransfer and pfnAvailable members. For USB device
- //! use, this is the psDevice parameter required by the relevant device
- //! class driver APIs. For USB host use, this is the pipe identifier
- //! returned by USBHCDPipeAlloc.
- //
- void *pvHandle;
-
- //
- //! A pointer to memory to be used as the ring buffer for this
- //! instance.
- //
- uint8_t *pui8Buffer;
-
- //
- //! The size, in bytes, of the buffer pointed to by pi8Buffer.
- //
- uint32_t ui32BufferSize;
-
- //
- //! A pointer to USB_BUFFER_WORKSPACE_SIZE bytes of RAM that the buffer
- //! object can use for workspace.
- //
- void *pvWorkspace;
-}
-tUSBBuffer;
-
-//*****************************************************************************
-//
-//! The structure used for encapsulating all the items associated with a
-//! ring buffer.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- //! The ring buffer size.
- //
- uint32_t ui32Size;
-
- //
- //! The ring buffer write index.
- //
- volatile uint32_t ui32WriteIndex;
-
- //
- //! The ring buffer read index.
- //
- volatile uint32_t ui32ReadIndex;
-
- //
- //! The ring buffer.
- //
- uint8_t *pui8Buf;
-}
-tUSBRingBufObject;
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// USB buffer API function prototypes.
-//
-//*****************************************************************************
-extern const tUSBBuffer *USBBufferInit(const tUSBBuffer *psBuffer);
-extern void USBBufferZeroLengthPacketInsert(const tUSBBuffer *psBuffer,
- bool bSendZLP);
-extern void USBBufferInfoGet(const tUSBBuffer *psBuffer,
- tUSBRingBufObject *psRingBuf);
-extern void *USBBufferCallbackDataSet(tUSBBuffer *psBuffer, void *pvCBData);
-extern uint32_t USBBufferWrite(const tUSBBuffer *psBuffer,
- const uint8_t *pui8Data, uint32_t ui32Length);
-extern void USBBufferDataWritten(const tUSBBuffer *psBuffer,
- uint32_t ui32Length);
-extern void USBBufferDataRemoved(const tUSBBuffer *psBuffer,
- uint32_t ui32Length);
-extern void USBBufferFlush(const tUSBBuffer *psBuffer);
-extern uint32_t USBBufferRead(const tUSBBuffer *psBuffer, uint8_t *pui8Data,
- uint32_t ui32Length);
-extern uint32_t USBBufferDataAvailable(const tUSBBuffer *psBuffer);
-extern uint32_t USBBufferSpaceAvailable(const tUSBBuffer *psBuffer);
-extern uint32_t USBBufferEventCallback(void *pvCBData, uint32_t ui32Event,
- uint32_t ui32MsgValue, void *pvMsgData);
-extern bool USBRingBufFull(tUSBRingBufObject *psUSBRingBuf);
-extern bool USBRingBufEmpty(tUSBRingBufObject *psUSBRingBuf);
-extern void USBRingBufFlush(tUSBRingBufObject *psUSBRingBuf);
-extern uint32_t USBRingBufUsed(tUSBRingBufObject *psUSBRingBuf);
-extern uint32_t USBRingBufFree(tUSBRingBufObject *psUSBRingBuf);
-extern uint32_t USBRingBufContigUsed(tUSBRingBufObject *psUSBRingBuf);
-extern uint32_t USBRingBufContigFree(tUSBRingBufObject *psUSBRingBuf);
-extern uint32_t USBRingBufSize(tUSBRingBufObject *psUSBRingBuf);
-extern uint8_t USBRingBufReadOne(tUSBRingBufObject *psUSBRingBuf);
-extern void USBRingBufRead(tUSBRingBufObject *psUSBRingBuf,
- uint8_t *pui8Data, uint32_t ui32Length);
-extern void USBRingBufWriteOne(tUSBRingBufObject *psUSBRingBuf,
- uint8_t ui8Data);
-extern void USBRingBufWrite(tUSBRingBufObject *psUSBRingBuf,
- const uint8_t *pui8Data, uint32_t ui32Length);
-extern void USBRingBufAdvanceWrite(tUSBRingBufObject *psUSBRingBuf,
- uint32_t ui32NumBytes);
-extern void USBRingBufAdvanceRead(tUSBRingBufObject *psUSBRingBuf,
- uint32_t ui32NumBytes);
-extern void USBRingBufInit(tUSBRingBufObject *psUSBRingBuf,
- uint8_t *pui8Buf, uint32_t ui32Size);
-
-//*****************************************************************************
-//
-// Mode selection and dual mode interrupt steering functions.
-//
-//*****************************************************************************
-extern void USBStackModeSet(uint32_t ui32Index, tUSBMode iUSBMode,
- tUSBModeCallback pfnCallback);
-extern void USBDualModeInit(uint32_t ui32Index);
-extern void USBDualModeTerm(uint32_t ui32Index);
-extern void USBOTGMain(uint32_t ui32MsTicks);
-extern void USBOTGPollRate(uint32_t ui32Index, uint32_t ui32PollRate);
-extern void USBOTGModeInit(uint32_t ui32Index, uint32_t ui32PollRate,
- void *pHostData, uint32_t ui32HostDataSize);
-extern void USBOTGModeTerm(uint32_t ui32Index);
-extern void USB0OTGModeIntHandler(void);
-extern void USB0DualModeIntHandler(void);
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBLIB_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblibpriv.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblibpriv.h
deleted file mode 100644
index 6c5fb593c..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usblibpriv.h
+++ /dev/null
@@ -1,525 +0,0 @@
-//*****************************************************************************
-//
-// usblibpriv.h - Private header file used to share internal variables and
-// function prototypes between the various modules in the USB
-// library. This header MUST NOT be used by application code.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBLIBPRIV_H__
-#define __USBLIBPRIV_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_dma_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Internal interrupt handlers called from the main vectors in device and
-// host mode.
-//
-//*****************************************************************************
-extern void USBDeviceIntHandlerInternal(uint32_t ui32Index,
- uint32_t ui32Status);
-extern void USBHostIntHandlerInternal(uint32_t ui32Index, uint32_t ui32Status);
-
-//*****************************************************************************
-//
-// The maximum number of tick handlers that can be registered in a system.
-//
-//*****************************************************************************
-#define MAX_USB_TICK_HANDLERS 6
-
-//*****************************************************************************
-//
-// This value defines the number of SOF ticks that must pass before a call
-// is made to InternalUSBStartOfFrameTick. The value 5 ensures that the
-// function is called every 5 milliseconds assuming that SOF interrupts are
-// enabled and SOF is present.
-//
-//*****************************************************************************
-#define USB_SOF_TICK_DIVIDE 5
-
-//*****************************************************************************
-//
-// Tick handler function pointer type.
-//
-//*****************************************************************************
-typedef void(* tUSBTickHandler)(void *pvInstance, uint32_t ui32TicksmS);
-
-//*****************************************************************************
-//
-// Internal functions use to initialize the tick handler and register tick
-// callbacks.
-//
-//*****************************************************************************
-extern void InternalUSBTickInit(void);
-extern void InternalUSBTickReset(void);
-extern int32_t InternalUSBRegisterTickHandler(tUSBTickHandler pfnHandler,
- void *pvInstance);
-extern void InternalUSBStartOfFrameTick(uint32_t ui32TicksmS);
-extern void InternalUSBHCDSendEvent(uint32_t ui32Index, tEventInfo *psEvent,
- uint32_t ui32EvFlag);
-
-//*****************************************************************************
-//
-// g_ui32CurrentUSBTick holds the elapsed time in milliseconds since the
-// tick module was first initialized based on calls to the function
-// InternalUSBStartOfFrameTick. The granularity is USB_SOF_TICK_DIVIDE
-// milliseconds.
-//
-//*****************************************************************************
-extern uint32_t g_ui32CurrentUSBTick;
-
-//*****************************************************************************
-//
-// g_ui32USBSOFCount is a global counter for Start of Frame interrupts. It is
-// incremented by the low level device- or host-mode interrupt handlers.
-//
-//*****************************************************************************
-extern uint32_t g_ui32USBSOFCount;
-
-//*****************************************************************************
-//
-// InternalUSBGetTime is a macro which will return the system time in
-// milliseconds as calculated based on calls to the function
-// InternalUSBStartOfFrameTick. The granularity is USB_SOF_TICK_DIVIDE
-// milliseconds.
-//
-// Currently, this merely returns the value of a global variable.
-//
-//*****************************************************************************
-#define InternalUSBGetTime() g_ui32CurrentUSBTick
-
-//*****************************************************************************
-//
-// Macros to convert between USB controller base address and an index. These
-// are currently trivial but are included to allow for the possibility of
-// supporting more than one controller in the future.
-//
-//*****************************************************************************
-#define USBBaseToIndex(BaseAddr)(0)
-#define USBIndexToBase(Index) (USB0_BASE)
-
-//
-// Maximum number of channels for Type 0 USB controllers.
-//
-#define USB_MAX_DMA_CHANNELS_0 6
-
-//
-// Maximum number of channels for all other USB controllers.
-//
-#define USB_MAX_DMA_CHANNELS 8
-
-//*****************************************************************************
-//
-// Values returned by the USBLibDMAChannelStatus() function.
-//
-//*****************************************************************************
-#define USBLIBSTATUS_DMA_IDLE 0x00000000
-#define USBLIBSTATUS_DMA_COMPLETE \
- 0x00000001
-#define USBLIBSTATUS_DMA_ERROR 0x00000002
-#define USBLIBSTATUS_DMA_PENDING \
- 0x00000004
-
-//*****************************************************************************
-//
-// DMA endpoint types used with the USBLibDMAChannelAllocate() function.
-//
-//*****************************************************************************
-#define USB_DMA_EP_RX 0x00000080
-#define USB_DMA_EP_TX 0x00000000
-#define USB_DMA_EP_HOST 0x00000040
-#define USB_DMA_EP_DEVICE 0x00000000
-#define USB_DMA_EP_TYPE_CTRL 0x00000000
-#define USB_DMA_EP_TYPE_ISOC 0x00000001
-#define USB_DMA_EP_TYPE_BULK 0x00000002
-#define USB_DMA_EP_TYPE_INT 0x00000003
-#define USB_DMA_EP_TYPE_M 0x00000003
-
-//*****************************************************************************
-//
-// This is the internal instance data for the DMA functions and should not
-// be modified outside the usbdma.c file.
-//
-//*****************************************************************************
-struct tUSBDMAInstance
-{
- uint32_t ui32Base;
-
- uint32_t ui32IntNum;
-
- uint32_t pui32Config[USB_MAX_DMA_CHANNELS];
-
- uint32_t pui32MaxPacketSize[USB_MAX_DMA_CHANNELS];
-
- uint32_t *ppui32Data[USB_MAX_DMA_CHANNELS];
-
- uint32_t pui32Count[USB_MAX_DMA_CHANNELS];
-
- uint8_t pui8Endpoint[USB_MAX_DMA_CHANNELS];
-
- uint32_t pui32EPDMAMode0[USB_MAX_DMA_CHANNELS];
-
- uint32_t pui32EPDMAMode1[USB_MAX_DMA_CHANNELS];
-
- uint32_t ui32Pending;
-
- uint32_t ui32Complete;
-
- void (* pfnArbSizeSet)(tUSBDMAInstance *psUSBDMAInst, uint32_t ui32Channel,
- uint32_t ui32ArbSize);
- uint32_t (* pfnChannelAllocate)(tUSBDMAInstance *psUSBDMAInst,
- uint8_t ui8Endpoint,
- uint32_t ui32MaxPacketSize,
- uint32_t ui32Config);
- void (* pfnChannelEnable)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel);
- void (* pfnChannelDisable)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel);
- void (* pfnChannelRelease)(tUSBDMAInstance *psUSBDMAInst,
- uint8_t ui8Endpoint);
- uint32_t (* pfnChannelStatus)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel);
- void (* pfnChannelIntDisable)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel);
- void (* pfnChannelIntEnable)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel);
- void (* pfnIntHandler)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Status);
- uint32_t (* pfnIntStatus)(tUSBDMAInstance *psUSBDMAInst);
- void (* pfnIntStatusClear)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Status);
- uint32_t (* pfnStatus)(tUSBDMAInstance *psUSBDMAInst);
- uint32_t (* pfnTransfer)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel, void *pvBuffer,
- uint32_t ui32Size);
- void (* pfnUnitSizeSet)(tUSBDMAInstance *psUSBDMAInst,
- uint32_t ui32Channel,
- uint32_t ui32BitSize);
-};
-
-//*****************************************************************************
-//
-// These are the USB libraries DMA functions.
-//
-//*****************************************************************************
-extern tUSBDMAInstance * USBLibDMAInit(uint32_t ui32Index);
-
-//*****************************************************************************
-//
-//! This function returns the current DMA status for a given DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel number used to retrieve the DMA
-//! status.
-//!
-//! This function returns the current status of a DMA transfer on a given
-//! DMA channel. The DMA channel is specified by the \e ui32Channel parameter.
-//!
-//! \return This function returns one of the \b USBLIBSTATUS_DMA_* values.
-//
-//*****************************************************************************
-#define USBLibDMAChannelStatus(psUSBDMAInst, ui32Channel) \
- psUSBDMAInst->pfnChannelStatus(psUSBDMAInst, ui32Channel)
-
-//*****************************************************************************
-//
-//! This function is used to return any global status information for USB DMA.
-//!
-//! \param psUSBDMAInst is a generic instance pointer that can be used to
-//! distinguish between different hardware instances.
-//!
-//! This function performs returns the global status for the USB DMA
-//! interface.
-//!
-//! \return Always returns 0.
-//
-//*****************************************************************************
-#define USBLibDMAStatus(psUSBDMAInst) psUSBDMAInst->pfnStatus(psUSBDMAInst)
-
-//*****************************************************************************
-//
-//! This function returns the current DMA interrupt status.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//!
-//! This function returns the interrupt status for all DMA channels. The value
-//! returned is a per channel interrupt mapping with the DMA channels mapped
-//! into bits 0-31 by channel number with channel 1 starting at bit 0.
-//!
-//! \note This function does not return an endpoint interrupt status, but the
-//! interrupt status for the DMA interface used with the USB controller.
-//!
-//! \return This function returns the pending DMA interrupts.
-//
-//*****************************************************************************
-#define USBLibDMAIntStatus(psUSBDMAInst) \
- psUSBDMAInst->pfnIntStatus(psUSBDMAInst)
-
-//*****************************************************************************
-//
-//! This function clears the requested DMA interrupt status.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Status contains the interrupts to clear.
-//!
-//! This function clears the current DMA interrupt status for the
-//! controller specified by the \e ui32Instance parameter. The \e ui32Status
-//! value has the same format as the value returned from the
-//! USBLibDMAIntStatus() function which is a per channel interrupt mapping.
-//! The DMA channels are mapped into bits 0-31 by channel number with channel 1
-//!starting at bit 0.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAIntStatusClear(psUSBDMAInst, ui32Status) \
- psUSBDMAInst->pfnIntStatusClear(psUSBDMAInst, ui32Status)
-
-//*****************************************************************************
-//
-//! This function enables DMA for a given channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel to enable.
-//!
-//! This function enables DMA on the channel number passed in the
-//! \e ui32Channel parameter.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAChannelEnable(psUSBDMAInst, ui32Channel) \
- psUSBDMAInst->pfnChannelEnable(psUSBDMAInst, ui32Channel)
-
-//*****************************************************************************
-//
-//! This function disables DMA for a given DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel to disable.
-//!
-//! This function disables DMA on the channel number passed in the
-//!\e ui32Channel parameter.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAChannelDisable(psUSBDMAInst, ui32Channel) \
- psUSBDMAInst->pfnChannelDisable(psUSBDMAInst, ui32Channel)
-
-//*****************************************************************************
-//
-//! This function is configures a USB transfer on a given DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel to use.
-//! \param pvBuffer is a pointer to the buffer to use for the transfer.
-//! \param ui32Size is the size of the data to be transferred in bytes.
-//!
-//! This function is called to configure a transfer using the USB
-//! controller depending on the parameters. The \e ui32Channel parameter
-//! holds the channel number to use for this transfer which must have already
-//! been allocated with a call to the USBLibDMAChannelAllocate() function. The
-//! transaction is configured to transfer \e ui32Size bytes to/from the buffer
-//! held in the \e pvBuffer pointer.
-//!
-//! \return This function returns the number of bytes scheduled to be
-//! transferred.
-//
-//*****************************************************************************
-#define USBLibDMATransfer(psUSBDMAInst, ui32Channel, pvBuffer, ui32Size) \
- psUSBDMAInst->pfnTransfer(psUSBDMAInst, ui32Channel, \
- pvBuffer, ui32Size)
-
-//*****************************************************************************
-//
-//! This function is called by the USB interrupt handler.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Status is the DMA interrupt status.
-//!
-//! This function is called by the USB interrupt handler to allow the DMA
-//! interface to handle interrupts outside of the context of the normal USB
-//! interrupt handler. The \e ui32Status is the current DMA interrupt status
-//! at the time of the USB interrupt. Since some DMA controller interrupts are
-//! cleared automatically when read, this value must be retrieved by calling
-//! the USBLibDMAIntStatus() function and passed into this function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAIntHandler(psUSBDMAInst, ui32Status) \
- psUSBDMAInst->pfnIntHandler(psUSBDMAInst, ui32Status)
-
-//*****************************************************************************
-//
-//! This function is used to assign a DMA channel to an endpoint.
-//!
-//! \param psUSBDMAInst is the DMA instance data for a USB controller.
-//! \param ui8Endpoint is the endpoint number to assign a DMA channel.
-//! \param ui32MaxPacketSize is the maximum packet size for the endpoint
-//! assigned that is being assigned to the DMA channel.
-//! \param ui32Config are the basic configuration options for the DMA channel.
-//!
-//! This function assigns a DMA channel to a given endpoint. The
-//! \e ui8Endpoint parameter is the zero based endpoint number that is assigned
-//! a DMA channel. The \e ui32Config parameter contains any configuration
-//! options for the DMA channel. The current options include the following:
-//! - \b USB_DMA_EP_TX - this request is for a transmit DMA channel.
-//! - \b USB_DMA_EP_RX - this request is for a receive DMA channel.
-//!
-//! \note The maximum number of available DMA channels to endpoints varies
-//! between devices.
-//!
-//! \return Zero or the DMA channel assigned to the endpoint.
-//
-//*****************************************************************************
-#define USBLibDMAChannelAllocate(psUSBDMAInst, ui8Endpoint, ui32MaxPacketSize,\
- ui32Config) \
- psUSBDMAInst->pfnChannelAllocate(psUSBDMAInst, \
- ui8Endpoint, \
- ui32MaxPacketSize, \
- ui32Config)
-
-//*****************************************************************************
-//
-//! This function is used to free a DMA channel that was assigned to an
-//! endpoint.
-//!
-//! \param psUSBDMAInst is the DMA instance data for a USB controller.
-//! \param ui8Endpoint is the DMA channel number to free up.
-//!
-//! This function frees up a DMA channel that was allocated to an endpoint
-//! by the USBLibDMAChannelAllocate() function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAChannelRelease(psUSBDMAInst, ui8Endpoint) \
- psUSBDMAInst->pfnChannelRelease(psUSBDMAInst, ui8Endpoint)
-
-//*****************************************************************************
-//
-//! This function is used to set the individual transfer size of a DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA instance data for a USB controller.
-//! \param ui32Channel is the DMA channel number to modify.
-//! \param ui32BitSize is the individual transfer size in bits(8, 16 or 32).
-//!
-//! This function configures the individual transfer size of the DMA channel
-//! provided in the \e ui32Channel parameter. The \e ui32Channel must already
-//! be allocated to an endpoint by calling the USBLibDMAChannelAllocate()
-//! function. The \e ui32BitSize parameter should be on of the following
-//! values: 8, 16 or 32.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAUnitSizeSet(psUSBDMAInst, ui32Channel, ui32BitSize) \
- psUSBDMAInst->pfnUnitSizeSet(psUSBDMAInst, ui32Channel, \
- ui32BitSize);
-
-//*****************************************************************************
-//
-//! This function is used to set the arbitration size for a DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA instance data for a USB controller.
-//! \param ui32Channel is the DMA channel number to modify.
-//! \param ui32ArbSize is the transfer arbitration size in bytes.
-//!
-//! This function configures the individual transfer size of the DMA channel
-//! provided in the \e ui32Channel parameter. The \e ui32Channel must already
-//! be allocated to an endpoint by calling the USBLibDMAChannelAllocate()
-//! function.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAArbSizeSet(psUSBDMAInst, ui32Channel, ui32ArbSize) \
- psUSBDMAInst->pfnArbSizeSet(psUSBDMAInst, ui32Channel, \
- ui32ArbSize);
-
-//*****************************************************************************
-//
-//! This function enables the DMA interrupt for a given channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel interrupt to enable.
-//!
-//! This function enables DMA interrupt on the channel number passed in the
-//! \e ui32Channel parameter.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAChannelIntEnable(psUSBDMAInst, ui32Channel) \
- psUSBDMAInst->pfnChannelIntEnable(psUSBDMAInst, ui32Channel)
-
-//*****************************************************************************
-//
-//! This function disables DMA interrupt for a given DMA channel.
-//!
-//! \param psUSBDMAInst is the DMA structure pointer for this instance.
-//! \param ui32Channel is the DMA channel interrupt to disable.
-//!
-//! This function disables the DMA interrupt on the channel number passed in
-//! the \e ui32Channel parameter.
-//!
-//! \return None.
-//
-//*****************************************************************************
-#define USBLibDMAChannelIntDisable(psUSBDMAInst, ui32Channel) \
- psUSBDMAInst->pfnChannelIntDisable(psUSBDMAInst, ui32Channel)
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
-
-#endif // __USBLIBPRIV_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmode.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmode.c
deleted file mode 100644
index 9348d6708..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmode.c
+++ /dev/null
@@ -1,1132 +0,0 @@
-//*****************************************************************************
-//
-// usbmode.c - Functions related to dual mode USB device/host operation.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_ints.h"
-#include "inc/hw_memmap.h"
-#include "inc/hw_types.h"
-#include "inc/hw_sysctl.h"
-#include "inc/hw_usb.h"
-#include "driverlib/debug.h"
-#include "driverlib/interrupt.h"
-#include "driverlib/rom.h"
-#include "driverlib/rom_map.h"
-#include "driverlib/sysctl.h"
-#include "driverlib/usbdrv.h"
-#include "driverlib/rtos_bindings.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-#include "usblib/device/usbdevice.h"
-#include "usblib/host/usbhost.h"
-#include "usblib/host/usbhostpriv.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup general_usblib_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// The following label defines interrupts that we will always pass to the host
-// interrupt handler even if we are in dual mode and not yet sure of which
-// mode we are operating in.
-//
-//*****************************************************************************
-#define USB_HOST_INTS (USB_INTCTRL_VBUS_ERR)
-
-//*****************************************************************************
-//
-// Global variable indicating which mode of operation the application has
-// requested.
-//
-//*****************************************************************************
-volatile tUSBMode g_iUSBMode = eUSBModeNone;
-
-//*****************************************************************************
-//
-// The default and the current polling rate for the USB OTG library.
-//
-//*****************************************************************************
-volatile uint32_t g_ui32PollRate;
-
-//*****************************************************************************
-//
-// The current time remaining in milliseconds before checking the cable
-// connection.
-//
-//*****************************************************************************
-volatile uint32_t g_ui32WaitTicks = 0;
-
-//*****************************************************************************
-//
-// This enum holds the various states that we can be in while performing
-// USB mode checking. This involves use of the OTG session request to poll
-// the USB ID pin to determine whether a device or a host is connected.
-//
-//*****************************************************************************
-typedef enum
-{
- //
- // No checking is currently pending.
- //
- eUSBOTGModeIdle,
-
- //
- // Waiting on ID mode detection.
- //
- eUSBOTGModeWaitID,
-
- //
- // Waiting for next poll interval.
- //
- eUSBOTGModeWait,
-
- //
- // Now in B-side wait for connect.
- //
- eUSBOTGModeBWaitCon,
-
- //
- // Now in A-side device mode.
- //
- eUSBOTGModeBDevice,
-
- //
- // Now in A-side host mode.
- //
- eUSBOTGModeAHost,
-}
-tUSBOTGState;
-
-volatile tUSBOTGState g_eOTGModeState;
-
-//*****************************************************************************
-//
-// Global variable indicating whether we are currently operating in host or
-// device mode if the user has requested Dual mode operation.
-//
-//*****************************************************************************
-static volatile tUSBMode g_iDualMode = eUSBModeNone;
-
-static void USBOTGRemovePower(uint32_t ui32Index);
-
-//*****************************************************************************
-//
-// Global variable holding a pointer to the callback function which will be
-// called when the USB mode changes between device and host.
-//
-//*****************************************************************************
-static tUSBModeCallback g_pfnUSBModeCallback;
-
-//*****************************************************************************
-//
-// This function is used to handle switching between host, device and
-// unconfigured modes.
-//
-// \param iUSBMode is one of eUSBModeHost, eUSBModeDevice, or eUSBModeNone.
-//
-// Based on the current state held in g_iDualMode variable this function will
-// handle the transition of the mode of operation in OTG mode and calling
-// the callback function if it is present.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBOTGSetMode(tUSBMode iUSBMode)
-{
- if((g_iDualMode != iUSBMode) || (g_iDualMode == eUSBModeNone))
- {
- //
- // If going from host mode to unconfigured mode then remove power.
- //
- if((g_iDualMode == eUSBModeHost) && (iUSBMode == eUSBModeNone))
- {
- //
- // Take the steps to remove power in the of host mode OTG.
- //
- USBOTGRemovePower(0);
- }
-
- //
- // If going from device mode to unconfigured mode then end the current
- // session.
- //
- if((g_iDualMode == eUSBModeDevice) && (iUSBMode == eUSBModeNone))
- {
- //
- // End the current session.
- //
- USBOTGSessionRequest(USB0_BASE, false);
- }
-
- //
- // Reset the delay whenever returning to eUSBModeNone.
- //
- if(iUSBMode == eUSBModeNone)
- {
- g_ui32WaitTicks = g_ui32PollRate;
- }
-
- //
- // Do we have a mode change callback installed?
- //
- if((g_pfnUSBModeCallback) && (g_iDualMode != iUSBMode))
- {
- //
- // Inform the callback of the new operating mode.
- //
- g_pfnUSBModeCallback(0, iUSBMode);
- }
-
- //
- // Save the new mode.
- //
- g_iDualMode = iUSBMode;
- }
-}
-
-//*****************************************************************************
-//
-//! Allows dual mode application to switch between USB device and host modes
-//! and provides a method to force the controller into the desired mode.
-//!
-//! \param ui32Index specifies the USB controller whose mode of operation is to
-//! be set. This parameter must be set to 0.
-//! \param iUSBMode indicates the mode that the application wishes to operate
-//! in. Valid values are \b eUSBModeDevice to operate as a USB device and
-//! \b eUSBModeHost to operate as a USB host.
-//! \param pfnCallback is a pointer to a function which the USB library will
-//! call each time the mode is changed to indicate the new operating mode. In
-//! cases where \e iUSBMode is set to either \b eUSBModeDevice or
-//! \b eUSBModeHost, the callback will be made immediately to allow the
-//! application to perform any host or device specific initialization.
-//!
-//! This function allows a USB application that can operate in host
-//! or device mode to indicate to the USB stack the mode that it wishes to
-//! use. The caller is responsible for cleaning up the interface and removing
-//! itself from the bus prior to making this call and reconfiguring afterwards.
-//! The \e pfnCallback function can be a NULL(0) value to indicate that no
-//! notification is required.
-//!
-//! For successful dual mode mode operation, an application must register
-//! USB0DualModeIntHandler() as the interrupt handler for the USB0 interrupt.
-//! This handler is responsible for steering interrupts to the device or host
-//! stack depending upon the chosen mode. Devices which do not require dual
-//! mode capability should register either \e USB0DeviceIntHandler() or
-//! \e USB0HostIntHandler() instead. Registering \e USB0DualModeIntHandler()
-//! for a single mode application will result in an application binary larger
-//! than required since library functions for both USB operating modes will be
-//! included even though only one mode is required.
-//!
-//! Single mode applications (those offering exclusively USB device or USB
-//! host functionality) are only required to call this function if they need to
-//! force the mode of the controller to Host or Device mode. This is usually
-//! in the event that the application needs to reused the USBVBUS and/or USBID
-//! pins as GPIOs.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBStackModeSet(uint32_t ui32Index, tUSBMode iUSBMode,
- tUSBModeCallback pfnCallback)
-{
- //
- // Check the arguments.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Remember the mode so that we can steer the interrupts appropriately.
- //
- g_iUSBMode = iUSBMode;
-
- //
- // Remember the callback pointer.
- //
- g_pfnUSBModeCallback = pfnCallback;
-
- //
- // If we are being asked to be either a host or device, we will not be
- // trying to auto-detect the mode so make the callback immediately.
- //
- if((iUSBMode == eUSBModeDevice) || (iUSBMode == eUSBModeHost))
- {
- //
- // Make sure that a callback was provided.
- //
- if(g_pfnUSBModeCallback)
- {
- g_pfnUSBModeCallback(0, iUSBMode);
- }
- }
-}
-
-//*****************************************************************************
-//
-// Steers USB interrupts from controller to the correct handler in the USB
-// stack.
-//
-// This interrupt handler is used in applications which require to operate
-// in both host and device mode. It steers the USB hardware interrupt to the
-// correct handler in the USB stack depending upon the current operating mode
-// of the application, USB device or host.
-//
-// For successful dual mode operation, an application must register
-// USB0DualModeIntHandler() in the CPU vector table as the interrupt handler
-// for the USB0 interrupt. This handler is responsible for steering
-// interrupts to the device or host stack depending upon the chosen mode.
-//
-// \note Devices which do not require dual mode capability should register
-// either USB0DeviceIntHandler() or USB0HostIntHandler() instead. Registering
-// USB0DualModeIntHandler() for a single mode application will result in an
-// application binary larger than required since library functions for both
-// USB operating modes will be included even though only one mode is actually
-// required.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-USB0DualModeIntHandler(void)
-{
- uint32_t ui32Status;
-
- //
- // Read the USB interrupt status.
- //
- ui32Status = USBIntStatusControl(USB0_BASE);
-
- //
- // Pass through the subset of interrupts that we always want
- // the host stack to see regardless of whether or not we
- // are actually in host mode at this point.
- //
- if(ui32Status & USB_HOST_INTS)
- {
- //
- // Call the host's interrupt handler.
- //
- USBHostIntHandlerInternal(0, ui32Status & USB_HOST_INTS);
-
- //
- // We have already processed these interrupts so clear them
- // from the status.
- //
- ui32Status &= ~USB_HOST_INTS;
- }
-
- //
- // Steer the interrupt to the appropriate handler within the stack
- // depending upon our current operating mode. Note that we need to pass
- // the ui32Status parameter since the USB interrupt register is
- // clear-on-read.
- //
- switch(g_iUSBMode)
- {
- case eUSBModeNone:
- {
- //
- // No mode is set yet so we have no idea what to do. Just ignore
- // the interrupt.
- //
- break;
- }
-
- //
- // Operating in pure host mode.
- //
- case eUSBModeHost:
- {
- //
- // Call the host interrupt handler if there is anything still to
- // process.
- //
- USBHostIntHandlerInternal(0, ui32Status);
-
- break;
- }
-
- //
- // Operating in pure device mode.
- //
- case eUSBModeDevice:
- {
- //
- // Call the device interrupt handler.
- //
- USBDeviceIntHandlerInternal(0, ui32Status);
-
- break;
- }
-
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group general_usblib_api.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup dualmode_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Initializes the USB controller for dual mode operation.
-//!
-//! \param ui32Index specifies the USB controller that is to be initialized for
-//! dual mode operation. This parameter must be set to 0.
-//!
-//! This function initializes the USB controller hardware into a state
-//! suitable for dual mode operation. Applications may use this function to
-//! ensure that the controller is in a neutral state and able to receive
-//! appropriate interrupts before host or device mode is chosen using a call
-//! to USBStackModeSet().
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDualModeInit(uint32_t ui32Index)
-{
- //
- // We only support a single USB controller.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Configure the End point 0.
- //
- USBHostEndpointConfig(USB0_BASE, USB_EP_0, 64, 0, 0,
- (USB_EP_MODE_CTRL | USB_EP_SPEED_FULL |
- USB_EP_HOST_OUT));
-
- //
- // Enable USB Interrupts.
- //
- MAP_USBIntEnableControl(USB0_BASE, USB_INTCTRL_RESET |
- USB_INTCTRL_DISCONNECT |
- USB_INTCTRL_SESSION |
- USB_INTCTRL_BABBLE |
- USB_INTCTRL_CONNECT |
- USB_INTCTRL_RESUME |
- USB_INTCTRL_SUSPEND |
- USB_INTCTRL_VBUS_ERR);
-
- //
- // Enable all endpoint interrupts.
- //
- MAP_USBIntEnableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Initialize the USB tick module.
- //
- InternalUSBTickInit();
-
- //
- // Enable the USB interrupt.
- //
- OS_INT_ENABLE(g_psDCDInst[0].ui32IntNum);
- //
- // Turn on session request to enable ID pin checking.
- //
- USBOTGSessionRequest(USB0_BASE, true);
-
- //
- // Initialize the power configuration.
- //
- USBHostPwrConfig(USB0_BASE, USBHCDPowerConfigGet(ui32Index));
-
- //
- // If power enable is automatic then then USBHostPwrEnable() has to be
- // called to allow the USB controller to control the power enable pin.
- //
- if(USBHCDPowerAutomatic(ui32Index))
- {
- //
- // This will not turn on power but instead will allow the USB
- // controller to turn on power when needed.
- //
- USBHostPwrEnable(USB0_BASE);
- }
-}
-
-//*****************************************************************************
-//
-//! Returns the USB controller to the default mode when in dual mode operation.
-//!
-//! \param ui32Index specifies the USB controller whose dual mode operation is
-//! to be ended. This parameter must be set to 0.
-//!
-//! Applications using both host and device modes may call this function to
-//! disable interrupts in preparation for shutdown or a change of operating
-//! mode.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBDualModeTerm(uint32_t ui32Index)
-{
- //
- // We only support a single USB controller.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Disable the USB interrupt.
- //
- OS_INT_DISABLE(g_psDCDInst[0].ui32IntNum);
-
- MAP_USBIntDisableControl(USB0_BASE, USB_INTCTRL_ALL);
-
- MAP_USBIntDisableEndpoint(USB0_BASE, USB_INTEP_ALL);
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group dualmode_api.
-//! @}
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_otg
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-//! Returns the USB controller to and inactive state when in OTG mode
-//! operation.
-//!
-//! \param ui32Index specifies the USB controller to end OTG mode operations.
-//!
-//! Applications using OTG mode may call this function to disable interrupts
-//! in preparation for shutdown or a change of operating mode.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBOTGModeTerm(uint32_t ui32Index)
-{
- //
- // We only support a single USB controller.
- //
- ASSERT(ui32Index == 0);
-
- //
- // Disable the USB interrupt.
- //
- OS_INT_DISABLE(g_psDCDInst[0].ui32IntNum);
-
- //
- // Disable all control interrupts.
- //
- MAP_USBIntDisableControl(USB0_BASE, USB_INTCTRL_ALL);
-
- //
- // Disable all endpoint interrupts.
- //
- MAP_USBIntDisableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Set the mode to none if it is not already.
- //
- USBOTGSetMode(eUSBModeNone);
-}
-
-//*****************************************************************************
-//
-//! Initializes the USB controller for OTG mode operation.
-//!
-//! \param ui32Index specifies the USB controller that is to be initialized for
-//! OTG mode operation.
-//! \param ui32PollingRate is the rate in milliseconds to poll the controller
-//! for changes in mode.
-//! \param pvPool is a pointer to the data to use as a memory pool for this
-//! controller.
-//! \param ui32PoolSize is the size in bytes of the buffer passed in as
-//! \e pvPool.
-//!
-//! This function initializes the USB controller hardware into a state
-//! suitable for OTG mode operation. Applications must use this function to
-//! ensure that the controller is in a neutral state and able to receive
-//! appropriate interrupts before host or device mode is chosen by OTG
-//! negotiation. The \e ui32PollingRate parameter is used to set the rate at
-//! which the USB library will poll the controller to determine the mode. This
-//! has the most effect on how quickly the USB library will detect changes when
-//! going to host mode. The parameters \e pvPool and \e ui32PoolSize are
-//! passed on to the USB host library functions to provide memory for the USB
-//! library when it is acting as a host. Any device and host initialization
-//! should have been called before calling this function to prevent the USB
-//! library from attempting to run in device or host mode before the USB
-//! library is fully configured.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBOTGModeInit(uint32_t ui32Index, uint32_t ui32PollingRate,
- void *pvPool, uint32_t ui32PoolSize)
-{
- //
- // We only support a single USB controller.
- //
- ASSERT(ui32Index == 0);
-
- //
- // This should never be called if not in OTG mode.
- //
- ASSERT(g_iUSBMode == eUSBModeOTG);
-
- //
- // Force OTG mode in all cases since anything else is invalid, but a DEBUG
- // build will still ASSERT above if this value is incorrect.
- //
- g_iUSBMode = eUSBModeOTG;
-
- //
- // Remember that we have not yet determined whether we are device or
- // host.
- //
- g_iDualMode = eUSBModeNone;
-
- //
- // Set the default polling rate.
- //
- g_ui32PollRate = ui32PollingRate;
-
- //
- // Enable the USB controller.
- //
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
-
- //
- // Turn on USB Phy clock.
- //
- MAP_SysCtlUSBPLLEnable();
-
- //
- // Initialize the host controller stack.
- //
- USBHCDInit(ui32Index, pvPool, ui32PoolSize);
-
- //
- // Configure the End point 0.
- //
- USBHostEndpointConfig(USB0_BASE, USB_EP_0, 64, 0, 0,
- (USB_EP_MODE_CTRL | USB_EP_SPEED_FULL |
- USB_EP_HOST_OUT));
-
- //
- // Enable control interrupts.
- //
- MAP_USBIntEnableControl(USB0_BASE, USB_INTCTRL_RESET |
- USB_INTCTRL_DISCONNECT |
- USB_INTCTRL_SESSION |
- USB_INTCTRL_BABBLE |
- USB_INTCTRL_CONNECT |
- USB_INTCTRL_RESUME |
- USB_INTCTRL_SUSPEND |
- USB_INTCTRL_VBUS_ERR |
- USB_INTCTRL_MODE_DETECT |
- USB_INTCTRL_SOF);
-
- //
- // Make sure the mode OTG mode and not forced device or host.
- //
- USBOTGMode(USB0_BASE);
-
- //
- // Enable all endpoint interrupts.
- //
- MAP_USBIntEnableEndpoint(USB0_BASE, USB_INTEP_ALL);
-
- //
- // Initialize the power configuration.
- //
- USBHCDPowerConfigSet(ui32Index, USBHCDPowerConfigGet(ui32Index));
-
- //
- // If power enable is automatic then then USBHostPwrEnable() has to be
- // called to allow the USB controller to control the power enable pin.
- //
- if(USBHCDPowerAutomatic(ui32Index))
- {
- //
- // This will not turn on power but instead will allow the USB
- // controller to turn on power when needed.
- //
- USBHostPwrEnable(USB0_BASE);
- }
-
- //
- // Enable the USB interrupt.
- //
- OS_INT_ENABLE(INT_USB0_BLIZZARD);
-}
-
-//*****************************************************************************
-//
-// This function handles the steps required to remove power in OTG mode.
-//
-// \param ui32Index specifies which USB controller should remove power.
-//
-// This function will perform the steps required to remove power from the USB
-// bus as required by the OTG specification. This call will first issue a
-// bus suspend followed by clearing the current session and then removing
-// power.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-USBOTGRemovePower(uint32_t ui32Index)
-{
- tEventInfo sEvent;
-
- //
- // Do suspend signaling.
- //
- USBHostSuspend(USB0_BASE);
-
- //
- // End the session in either device or host mode.
- //
- USBOTGSessionRequest(USB0_BASE, false);
-
- //
- // Check if the controller is automatically applying power or not.
- //
- if(USBHCDPowerAutomatic(ui32Index) == 0)
- {
- //
- // Call the registered event driver to allow it to disable power.
- //
- sEvent.ui32Event = USB_EVENT_POWER_DISABLE;
- sEvent.ui32Instance = 0;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_PWRDIS);
- }
-}
-
-//*****************************************************************************
-//
-//! This call sets the USB OTG controllers poll rate when checking for the mode
-//! of the controller.
-//!
-//! \param ui32Index specifies which USB controller to set the polling rate.
-//! \param ui32PollRate is the rate in milliseconds to poll for changes in the
-//! controller mode.
-//!
-//! This function is called to set the USB OTG libraries polling rate when
-//! checking the status of the cable. The \e ui32PollRate value used sets the
-//! rate in milliseconds that the USB OTG library will poll the cable to see
-//! if the controller should enter host mode. This value has no effect on
-//! device detection rate as the controller will detect being connected to a
-//! host controller automatically. The \e ui32PollRate can be set to 0 to
-//! disable polling. The USB OTG library can still function with the polling
-//! rate set to zero, however it will fail to detect host mode properly when no
-//! device is present at the end of the USB OTG B side of the cable.
-//!
-//! \note This function should only be called on devices that support OTG
-//! functionality.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBOTGPollRate(uint32_t ui32Index, uint32_t ui32PollRate)
-{
- //
- // Save the timeout.
- //
- g_ui32PollRate = ui32PollRate;
-}
-
-//*****************************************************************************
-//
-//! Handles OTG mode changes and also steers other USB interrupts from
-//! the controller to the correct handler in the USB stack.
-//!
-//! This interrupt handler is used in applications which require to operate
-//! in both host and device mode using OTG. When in host or device mode, it
-//! steers the USB hardware interrupt to the correct handler in the USB stack
-//! depending upon the current operating mode. It also handles other OTG
-//! related interrupt events.
-//!
-//! For successful OTG mode operation, an application must register
-//! USB0OTGModeIntHandler() in the CPU vector table as the interrupt handler
-//! for the USB0 interrupt.
-//!
-//! \note This interrupt handler should only be used on controllers that
-//! support OTG functionality.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USB0OTGModeIntHandler(void)
-{
- uint32_t ui32Status;
- tEventInfo sEvent;
-
- //
- // Read the USB interrupt status.
- //
- ui32Status = USBIntStatusControl(USB0_BASE);
-
- //
- // Check if this was an mode detect interrupt and under manual power
- // control.
- //
- if((ui32Status & USB_INTCTRL_MODE_DETECT) &&
- (USBHCDPowerAutomatic(0) == 0))
- {
- uint32_t ui32Mode;
-
- ui32Mode = USBModeGet(USB0_BASE);
-
- switch(ui32Mode)
- {
- //
- // Device is on the A side of the cable and power needs to be
- // applied.
- //
- case USB_OTG_MODE_ASIDE_NPWR:
- case USB_OTG_MODE_ASIDE_SESS:
- case USB_OTG_MODE_ASIDE_AVAL:
- {
- //
- // Since power is not automatically enabled, call the
- // registered event handler to allow the application to turn
- // on power.
- //
- sEvent.ui32Event = USB_EVENT_POWER_ENABLE;
- sEvent.ui32Instance = 0;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_PWREN);
-
- break;
- }
-
- //
- // Device is on the B side of the cable and powered.
- //
- case USB_OTG_MODE_BSIDE_DEV:
- {
- //
- // Now in device mode on the B side of the cable and will wait
- // for a connect before becoming a device.
- //
- g_eOTGModeState = eUSBOTGModeBWaitCon;
-
- break;
- }
-
- //
- // Any other mode detect indicates eUSBModeNone.
- //
- default:
- {
- //
- // Just inform the application that the mode was not device
- // or host.
- //
- USBOTGSetMode(eUSBModeNone);
-
- break;
- }
- }
- }
-
- //
- // If there was a VBUS error then the power should be shut off and the
- // system is reset to waiting for detection again.
- //
- if(ui32Status & USB_INTCTRL_VBUS_ERR)
- {
- //
- // Just inform the application that the mode was not device
- // or host.
- //
- USBOTGSetMode(eUSBModeNone);
-
- //
- // Return to idle mode.
- //
- g_eOTGModeState = eUSBOTGModeWait;
- }
-
- //
- // If there is a disconnect interrupt and the controller was on the B side
- // cable as a device then go back to the IDLE state.
- //
- if((ui32Status & USB_INTCTRL_DISCONNECT) &&
- (g_eOTGModeState == eUSBOTGModeBDevice))
- {
- //
- // No longer a device so switch to unconfigured mode.
- //
- USBOTGSetMode(eUSBModeNone);
-
- //
- // Return to idle mode.
- //
- g_eOTGModeState = eUSBOTGModeWait;
-
- return;
- }
-
- //
- // Handle receiving a reset.
- //
- if((ui32Status & USB_INTCTRL_RESET)&&
- (g_eOTGModeState != eUSBOTGModeBDevice))
- {
- //
- // Getting a reset interrupt when not already a b side device indicates
- // that a host is resetting the device and the controller should
- // move to device mode.
- //
- g_eOTGModeState = eUSBOTGModeBDevice;
-
- //
- // Save the new mode.
- //
- USBOTGSetMode(eUSBModeDevice);
- }
-
- //
- // If there is a connect interrupt while the library is waiting for
- // one then move to full host mode state.
- //
- if(ui32Status & USB_INTCTRL_CONNECT)
- {
- //
- // Move to A side host state.
- //
- g_eOTGModeState = eUSBOTGModeAHost;
-
- //
- // Inform the application that controller is in host mode.
- //
- USBOTGSetMode(eUSBModeHost);
- }
-
- //
- // Call the correct device or host interrupt handler based on the current
- // mode of operation.
- //
- switch(g_eOTGModeState)
- {
- case eUSBOTGModeAHost:
- {
- //
- // Call the host interrupt handler if there is anything still to
- // process.
- //
- USBHostIntHandlerInternal(0, ui32Status);
-
- break;
- }
-
- //
- // Operating in pure device mode.
- //
- case eUSBOTGModeBDevice:
- {
- //
- // Call the device interrupt handler.
- //
- USBDeviceIntHandlerInternal(0, ui32Status);
-
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// This function is called by the USB host stack code to indicated that it
-// has completed handing the device disconnection.
-//
-// \param ui32Index specifies the USB controller that has completed disconnect.
-//
-// This internal library function is used when the hsot controller has
-// completed any deferred handling when it has detected a device has been
-// disconnected. The functions main purpose is to return the OTG controller to
-// a state that allows for resuming normal OTG cable detection and negotiation.
-//
-// \note This function should not be called outside the library.
-//
-//*****************************************************************************
-void
-OTGDeviceDisconnect(uint32_t ui32Index)
-{
- //
- // This function is only valid when called in host mode.
- //
- if(g_eOTGModeState == eUSBOTGModeAHost)
- {
- //
- // No longer a host so switch to unconfigured mode.
- //
- USBOTGSetMode(eUSBModeNone);
-
- g_eOTGModeState = eUSBOTGModeWait;
- }
-}
-
-//*****************************************************************************
-//
-//! This function is the main routine for the OTG Controller Driver.
-//!
-//! \param ui32MsTicks is the number of milliseconds that have passed since the
-//! last time this function was called.
-//!
-//! This function is the main routine for the USB controller when using the
-//! library in OTG mode. This routine must be called periodically by the main
-//! application outside of a callback context. The \e ui32MsTicks value is
-//! used for basic timing needed by the USB library when operating in OTG mode.
-//! This allows for a simple cooperative system to access the the OTG
-//! controller driver interface without the need for an RTOS. All time
-//! critical operations are handled in interrupt context but all longer
-//! operations are run from the this function to allow them to block and wait
-//! for completion without holding off other interrupts.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBOTGMain(uint32_t ui32MsTicks)
-{
- tEventInfo sEvent;
-
- if(ui32MsTicks > g_ui32WaitTicks)
- {
- g_ui32WaitTicks = 0;
- }
- else
- {
- g_ui32WaitTicks -= ui32MsTicks;
- }
-
- switch(g_eOTGModeState)
- {
- case eUSBOTGModeIdle:
- {
- g_eOTGModeState = eUSBOTGModeWaitID;
-
- //
- // Initiate a session request and check the ID pin.
- //
- USBOTGSessionRequest(USB0_BASE, true);
- break;
- }
- case eUSBOTGModeWait:
- case eUSBOTGModeWaitID:
- {
- //
- // If reached the timeout and polling is enabled then look again.
- //
- if((g_ui32WaitTicks == 0) && (g_ui32PollRate != 0))
- {
- //
- // Remove the session request.
- //
- USBOTGSessionRequest(USB0_BASE, false);
-
- //
- // Return to idle mode.
- //
- USBOTGSetMode(eUSBModeNone);
-
- //
- // Check if the controller is automatically applying power or
- // not.
- //
- if(USBHCDPowerAutomatic(0) == 0)
- {
- //
- // Call the registered event driver to allow it to disable
- // power.
- //
- sEvent.ui32Event = USB_EVENT_POWER_DISABLE;
- sEvent.ui32Instance = 0;
- InternalUSBHCDSendEvent(0, &sEvent, USBHCD_EVFLAG_PWRDIS);
- }
-
- //
- // Go back to the idle state.
- //
- g_eOTGModeState = eUSBOTGModeIdle;
- }
- break;
- }
- case eUSBOTGModeAHost:
- {
- //
- // Call the host main routine when acting as a host.
- //
- USBHCDMain();
- break;
- }
- case eUSBOTGModeBWaitCon:
- case eUSBOTGModeBDevice:
- default:
- {
- break;
- }
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmsc.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmsc.h
deleted file mode 100644
index 2caa5bd2c..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbmsc.h
+++ /dev/null
@@ -1,393 +0,0 @@
-//*****************************************************************************
-//
-// usbmsc.h - Generic types and defines use by the mass storage class.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#ifndef __USBMSC_H__
-#define __USBMSC_H__
-
-//*****************************************************************************
-//
-// If building with a C++ compiler, make all of the definitions in this header
-// have a C binding.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-//*****************************************************************************
-//
-// The request for the maximum number of logical units on a mass storage
-// device.
-//
-//*****************************************************************************
-#define USBREQ_GET_MAX_LUN 0xfe
-
-//*****************************************************************************
-//
-// The signatures defined by USB MSC class specification.
-//
-//*****************************************************************************
-#define CBW_SIGNATURE 0x43425355
-#define CSW_SIGNATURE 0x53425355
-
-//*****************************************************************************
-//
-// Flag for the bmCBWFlags member of tMSCCBW
-//
-//*****************************************************************************
-#define CBWFLAGS_DIR_M 0x80
-#define CBWFLAGS_DIR_IN 0x80
-#define CBWFLAGS_DIR_OUT 0x00
-
-//*****************************************************************************
-//
-// All structures defined in this section of the header require byte packing of
-// fields. This is usually accomplished using the PACKED macro but, for IAR
-// Embedded Workbench, this requries a pragma.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack(1)
-#endif
-
-//*****************************************************************************
-//
-// The following packed structure is used to access the Command Block Wrapper
-// (CBW) data structure that is used when communicating with USB Mass Storage
-// Class devices.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Signature that helps identify this data packet as a CBW. The signature
- // field shall contain the value 0x43425355 (little endian), indicating a
- // CBW.
- //
- uint32_t dCBWSignature;
-
- //
- // The Command Block Tag sent by the host controller. The device shall
- // echo the contents of this field back to the host in the dCSWTag field
- // of the associated CSW. The dCSWTag positively associates a CSW with the
- // corresponding CBW.
- //
- uint32_t dCBWTag;
-
- //
- // The number of bytes of data that the host expects to transfer on the
- // Bulk-In or Bulk-Out endpoint (as indicated by the Direction bit) during
- // the execution of this command. If this field is zero, the device and
- // the host will not transfer data between the CBW and the associated CSW,
- // and the device will ignore the value of the Direction bit in
- // bmCBWFlags.
- //
- uint32_t dCBWDataTransferLength;
-
- //
- // The device will ignore these bits if the dCBWDataTransferLength value
- // is set to 0.
- //
- // The bits of this field are defined as follows:
- // Bit 7 Direction
- // 0 = Data-Out from host to the device,
- // 1 = Data-In from the device to the host.
- // Bit 6 Obsolete - The host shall set this bit to zero.
- // Bits 5..0 Reserved - the host shall set these bits to zero.
- //
- uint8_t bmCBWFlags;
-
- //
- // The device Logical Unit Number (LUN) to which the command block is being
- // sent. For devices that support multiple LUNs, the host shall place into
- // this field the LUN to which this command block is addressed. Otherwise,
- // the host shall set this field to zero.
- //
- uint8_t bCBWLUN;
-
- //
- // The valid length of the CBWCB in bytes. This defines the valid length
- // of the command block. The only legal values are 1 through 16. All
- // other values are reserved.
- //
- uint8_t bCBWCBLength;
-
- //
- // This array holds the command block to be executed by the device. The
- // MSC device will interpret the first bCBWCBLength bytes in this field as
- // a command block as defined by the command set identified by
- // bInterfaceSubClass. If the command set supported by the device uses
- // command blocks of fewer than 16 bytes in length, the significant bytes
- // shall be transferred first, beginning with the byte at offset 15. The
- // device will ignore the content of the CBWCB field past the byte at
- // offset (15 + bCBWCBLength - 1).
- //
- uint8_t CBWCB[16];
-}
-PACKED tMSCCBW;
-
-//*****************************************************************************
-//
-// Flags for the bCSWStatus member of tMSCCSW
-//
-//*****************************************************************************
-#define CSWSTATUS_CMD_SUCCESS 0
-#define CSWSTATUS_CMD_FAILED 1
-#define CSWSTATUS_PHASE_ERROR 2
-
-//*****************************************************************************
-//
-// This structure encapsulates the Command Status Word (CSW) structure that is
-// sent in response to all CBW commands.
-//
-//*****************************************************************************
-typedef struct
-{
- //
- // Signature that identifies this data packet as a CSW. The signature
- // field must contain the value 53425355h (little endian) to indicate CSW.
- //
- uint32_t dCSWSignature;
-
- //
- // The device will set this field to the value received in the dCBWTag of
- // the associated CBW.
- //
- uint32_t dCSWTag;
-
- //
- // For OUT transactions the device will fill the dCSWDataResidue field with
- // the difference between the amount of data expected as stated in the
- // dCBWDataTransferLength, and the actual amount of data processed by the
- // device. For IN transactions the device will fill the dCSWDataResidue
- // field with the difference between the amount of data expected as stated
- // in the dCBWDataTransferLength and the actual amount of relevant data
- // sent by the device. The dCSWDataResidue will not exceed the value sent
- // in the dCBWDataTransferLength.
- //
- uint32_t dCSWDataResidue;
-
- //
- // The bCSWStatus field indicates the success or failure of the command.
- // The device shall set this byte to zero if the command completed
- // successfully. A non-zero value shall indicate a failure during command
- // execution.
- //
- uint8_t bCSWStatus;
-}
-PACKED tMSCCSW;
-
-//*****************************************************************************
-//
-// Return to default packing when using the IAR Embedded Workbench compiler.
-//
-//*****************************************************************************
-#ifdef ewarm
-#pragma pack()
-#endif
-
-//*****************************************************************************
-//
-// SCSI Command return codes.
-//
-//*****************************************************************************
-#define SCSI_CMD_STATUS_PASS 0x00
-#define SCSI_CMD_STATUS_FAIL 0x01
-
-//*****************************************************************************
-//
-// SCSI commands.
-//
-//*****************************************************************************
-#define SCSI_TEST_UNIT_READY 0x00
-#define SCSI_REQUEST_SENSE 0x03
-#define SCSI_INQUIRY_CMD 0x12
-#define SCSI_MODE_SENSE_6 0x1a
-#define SCSI_READ_CAPACITIES 0x23
-#define SCSI_READ_CAPACITY 0x25
-#define SCSI_READ_10 0x28
-#define SCSI_WRITE_10 0x2a
-
-//*****************************************************************************
-//
-// SCSI Test Unit Ready definitions.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// SCSI Inquiry command definitions.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Size of the SCSI inquiry response data.
-//
-//*****************************************************************************
-#define SCSI_INQUIRY_DATA_SZ 36
-
-//*****************************************************************************
-//
-// Offset 0 of the Inquiry Data.
-//
-//*****************************************************************************
-#define SCSI_INQ_PQ_M 0xe0 // Peripheral Qualifier Mask.
-#define SCSI_INQ_PQ_CNCT 0x00 // Device connected.
-#define SCSI_INQ_PQ_DISC 0x20 // Device disconnected.
-#define SCSI_INQ_PDT_M 0x1f // Peripheral Device Type Mask.
-#define SCSI_INQ_PDT_SBC 0x00 // Direct Access device.
-
-//*****************************************************************************
-//
-// Offset 1 of the Inquiry Data.
-//
-//*****************************************************************************
-#define SCSI_INQ_RMB 0x80 // Device is removable.
-
-//*****************************************************************************
-//
-// Macro to check if removeable.
-//
-//*****************************************************************************
-#define SCSIIsRemovable(pData) \
- (((uint8_t *)pData)[1] & SCSI_INQ_RMB)
-
-//*****************************************************************************
-//
-// SCSI Read Capacity definitions.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Size of the SCSI Read Capacity response data.
-//
-//*****************************************************************************
-#define SCSI_READ_CAPACITY_SZ 0x08
-
-//*****************************************************************************
-//
-// SCSI Mode Sense definitions, these are passed in via the ui32Flags parameter
-// of the SCSIModeSense() function call.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Disable block descriptors.
-//
-//*****************************************************************************
-#define SCSI_MS_DBD 0x00000800
-
-//*****************************************************************************
-//
-// Page Code values, used in combination with Page Control values.
-//
-//*****************************************************************************
-#define SCSI_MS_PC_VENDOR 0x00000000
-#define SCSI_MS_PC_DISCO 0x00020000
-#define SCSI_MS_PC_CONTROL 0x000a0000
-#define SCSI_MS_PC_LUN 0x00180000
-#define SCSI_MS_PC_PORT 0x00190000
-#define SCSI_MS_PC_POWER 0x001a0000
-#define SCSI_MS_PC_INFORM 0x001c0000
-#define SCSI_MS_PC_ALL 0x003f0000
-
-//*****************************************************************************
-//
-// Page Control values.
-//
-//*****************************************************************************
-#define SCSI_MS_PC_CURRENT 0x00000000
-#define SCSI_MS_PC_CHANGEABLE 0x00400000
-#define SCSI_MS_PC_DEFAULT 0x00800000
-#define SCSI_MS_PC_SAVED 0x00c00000
-
-//*****************************************************************************
-//
-// Request Sense Definitions.
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Size of the data returned by the Request Sense command.
-//
-//*****************************************************************************
-#define SCSI_REQUEST_SENSE_SZ 18
-
-#define SCSI_RS_SKEY 2 // Sense Key offset.
-#define SCSI_RS_SKEY_AD_SKEY 12 // Additional Sense Key offset.
-
-//*****************************************************************************
-//
-// Offset 0 in the Request Sense response.
-//
-//*****************************************************************************
-#define SCSI_RS_VALID 0x80 // Response is valid.
-#define SCSI_RS_CUR_ERRORS 0x70 // Current errors returned.
-#define SCSI_RS_DEFER_ERRORS 0x71 // Deferred errors returned.
-
-//*****************************************************************************
-//
-// Offset 2 in the Request Sense response.
-//
-//*****************************************************************************
-#define SCSI_RS_KEY_M 0x0f // Sense Key.
-#define SCSI_RS_KEY_NO_SENSE 0x00 // No Sense Data.
-#define SCSI_RS_KEY_RECOVRD_ERR 0x01 // Recovered Error.
-#define SCSI_RS_KEY_NOT_READY 0x02 // Not Ready.
-#define SCSI_RS_KEY_MEDIUM_ERR 0x03 // Error in the media.
-#define SCSI_RS_KEY_HW_ERR 0x04 // Hardware Error, non recoverable.
-#define SCSI_RS_KEY_ILGL_RQST 0x05 // Illegal request.
-#define SCSI_RS_KEY_UNIT_ATTN 0x06 // Unit changed or reset.
-#define SCSI_RS_KEY_DATA_PROT 0x07 // Write Protect error.
-#define SCSI_RS_KEY_BLANK_CHK 0x08 // Write once error, block not clear.
-#define SCSI_RS_KEY_ABORT 0x0b // Last command was aborted.
-#define SCSI_RS_ILI 0x20 // Incorrect length indicator.
-#define SCSI_RS_EOM 0x40 // End of medium condition.
-#define SCSI_RS_FILEMARK 0x80 // Command has read a filemark/setmark.
-#define SCSI_RS_MED_NOT_PRSNT 0x003a // Medium not present.
-#define SCSI_RS_MED_NOTRDY2RDY 0x0028 // Not ready to ready transition.
-#define SCSI_RS_PV_INVALID 0x0226 // Parameter Value Invalid.
-
-//*****************************************************************************
-//
-// Additional information for SCSI_RS_KEY_NOT_READY
-//
-//*****************************************************************************
-#define SCSI_RS_KEY_NOTPRSNT 0x3A // Media Not Present.
-
-//*****************************************************************************
-//
-// Mark the end of the C bindings section for C++ compilers.
-//
-//*****************************************************************************
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __USBMSC_H__
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbringbuf.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbringbuf.c
deleted file mode 100644
index bb468ae75..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbringbuf.c
+++ /dev/null
@@ -1,715 +0,0 @@
-//*****************************************************************************
-//
-// usbringbuf.c - USB library ring buffer management utilities.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "driverlib/interrupt.h"
-#include "usblib/usblib.h"
-
-//*****************************************************************************
-//
-//! \addtogroup usblib_buffer_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// Define NULL, if not already defined.
-//
-//*****************************************************************************
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
-//*****************************************************************************
-//
-// Change the value of a variable atomically.
-//
-// \param pui32Val points to the index whose value is to be modified.
-// \param ui32Delta is the number of bytes to increment the index by.
-// \param ui32Size is the size of the buffer the index refers to.
-//
-// This function is used to increment a read or write buffer index that may be
-// written in various different contexts. It ensures that the
-// read/modify/write sequence is not interrupted and, hence, guards against
-// corruption of the variable. The new value is adjusted for buffer wrap.
-//
-// \return None.
-//
-//*****************************************************************************
-static void
-UpdateIndexAtomic(volatile uint32_t *pui32Val, uint32_t ui32Delta,
- uint32_t ui32Size)
-{
- bool bIntsOff;
-
- //
- // Turn interrupts off temporarily.
- //
- bIntsOff = IntMasterDisable();
-
- //
- // Update the variable value.
- //
- *pui32Val += ui32Delta;
-
- //
- // Correct for wrap. We use a loop here since we don't want to use a
- // modulus operation with interrupts off but we don't want to fail in
- // case ui32Delta is greater than ui32Size (which is extremely unlikely
- // but...)
- //
- while(*pui32Val >= ui32Size)
- {
- *pui32Val -= ui32Size;
- }
-
- //
- // Restore the interrupt state
- //
- if(!bIntsOff)
- {
- IntMasterEnable();
- }
-}
-
-//*****************************************************************************
-//
-//! Determines whether a ring buffer is full or not.
-//!
-//! \param psUSBRingBuf is the ring buffer object to empty.
-//!
-//! This function is used to determine whether or not a given ring buffer is
-//! full. The structure is specifically to ensure that we do not see
-//! warnings from the compiler related to the order of volatile accesses
-//! being undefined.
-//!
-//! \return Returns \b true if the buffer is full or \b false otherwise.
-//
-//*****************************************************************************
-bool
-USBRingBufFull(tUSBRingBufObject *psUSBRingBuf)
-{
- uint32_t ui32Write;
- uint32_t ui32Read;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Copy the Read/Write indices for calculation.
- //
- ui32Write = psUSBRingBuf->ui32WriteIndex;
- ui32Read = psUSBRingBuf->ui32ReadIndex;
-
- //
- // Return the full status of the buffer.
- //
- return((((ui32Write + 1) % psUSBRingBuf->ui32Size) == ui32Read) ? true :
- false);
-}
-
-//*****************************************************************************
-//
-//! Determines whether a ring buffer is empty or not.
-//!
-//! \param psUSBRingBuf is the ring buffer object to empty.
-//!
-//! This function is used to determine whether or not a given ring buffer is
-//! empty. The structure is specifically to ensure that we do not see
-//! warnings from the compiler related to the order of volatile accesses
-//! being undefined.
-//!
-//! \return Returns \b true if the buffer is empty or \b false otherwise.
-//
-//*****************************************************************************
-bool
-USBRingBufEmpty(tUSBRingBufObject *psUSBRingBuf)
-{
- uint32_t ui32Write;
- uint32_t ui32Read;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Copy the Read/Write indices for calculation.
- //
- ui32Write = psUSBRingBuf->ui32WriteIndex;
- ui32Read = psUSBRingBuf->ui32ReadIndex;
-
- //
- // Return the empty status of the buffer.
- //
- return((ui32Write == ui32Read) ? true : false);
-}
-
-//*****************************************************************************
-//
-//! Empties the ring buffer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to empty.
-//!
-//! Discards all data from the ring buffer.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufFlush(tUSBRingBufObject *psUSBRingBuf)
-{
- bool bIntsOff;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Set the Read/Write pointers to be the same. Do this with interrupts
- // disabled to prevent the possibility of corruption of the read index.
- //
- bIntsOff = IntMasterDisable();
- psUSBRingBuf->ui32ReadIndex = psUSBRingBuf->ui32WriteIndex;
- if(!bIntsOff)
- {
- IntMasterEnable();
- }
-}
-
-//*****************************************************************************
-//
-//! Returns number of bytes stored in ring buffer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to check.
-//!
-//! This function returns the number of bytes stored in the ring buffer.
-//!
-//! \return Returns the number of bytes stored in the ring buffer.
-//
-//*****************************************************************************
-uint32_t
-USBRingBufUsed(tUSBRingBufObject *psUSBRingBuf)
-{
- uint32_t ui32Write;
- uint32_t ui32Read;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Copy the Read/Write indices for calculation.
- //
- ui32Write = psUSBRingBuf->ui32WriteIndex;
- ui32Read = psUSBRingBuf->ui32ReadIndex;
-
- //
- // Return the number of bytes contained in the ring buffer.
- //
- return((ui32Write >= ui32Read) ? (ui32Write - ui32Read) :
- (psUSBRingBuf->ui32Size - (ui32Read - ui32Write)));
-}
-
-//*****************************************************************************
-//
-//! Returns number of bytes available in a ring buffer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to check.
-//!
-//! This function returns the number of bytes available in the ring buffer.
-//!
-//! \return Returns the number of bytes available in the ring buffer.
-//
-//*****************************************************************************
-uint32_t
-USBRingBufFree(tUSBRingBufObject *psUSBRingBuf)
-{
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Return the number of bytes available in the ring buffer.
- //
- return((psUSBRingBuf->ui32Size - 1) - USBRingBufUsed(psUSBRingBuf));
-}
-
-//*****************************************************************************
-//
-//! Returns number of contiguous bytes of data stored in ring buffer ahead of
-//! the current read pointer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to check.
-//!
-//! This function returns the number of contiguous bytes of data available in
-//! the ring buffer ahead of the current read pointer. This represents the
-//! largest block of data which does not straddle the buffer wrap.
-//!
-//! \return Returns the number of contiguous bytes available.
-//
-//*****************************************************************************
-uint32_t
-USBRingBufContigUsed(tUSBRingBufObject *psUSBRingBuf)
-{
- uint32_t ui32Write;
- uint32_t ui32Read;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Copy the Read/Write indices for calculation.
- //
- ui32Write = psUSBRingBuf->ui32WriteIndex;
- ui32Read = psUSBRingBuf->ui32ReadIndex;
-
- //
- // Return the number of contiguous bytes available.
- //
- return((ui32Write >= ui32Read) ? (ui32Write - ui32Read) :
- (psUSBRingBuf->ui32Size - ui32Read));
-}
-
-//*****************************************************************************
-//
-//! Returns number of contiguous free bytes available in a ring buffer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to check.
-//!
-//! This function returns the number of contiguous free bytes ahead of the
-//! current write pointer in the ring buffer.
-//!
-//! \return Returns the number of contiguous bytes available in the ring
-//! buffer.
-//
-//*****************************************************************************
-uint32_t
-USBRingBufContigFree(tUSBRingBufObject *psUSBRingBuf)
-{
- uint32_t ui32Write;
- uint32_t ui32Read;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Copy the Read/Write indices for calculation.
- //
- ui32Write = psUSBRingBuf->ui32WriteIndex;
- ui32Read = psUSBRingBuf->ui32ReadIndex;
-
- //
- // Return the number of contiguous bytes available.
- //
- if(ui32Read > ui32Write)
- {
- //
- // The read pointer is above the write pointer so the amount of free
- // space is the difference between the two indices minus 1 to account
- // for the buffer full condition (write index one behind read index).
- //
- return((ui32Read - ui32Write) - 1);
- }
- else
- {
- //
- // If the write pointer is above the read pointer, the amount of free
- // space is the size of the buffer minus the write index. We need to
- // add a special-case adjustment if the read index is 0 since we need
- // to leave 1 byte empty to ensure we can tell the difference between
- // the buffer being full and empty.
- //
- return(psUSBRingBuf->ui32Size - ui32Write - ((ui32Read == 0) ? 1 : 0));
- }
-}
-
-//*****************************************************************************
-//
-//! Returns the size in bytes of a ring buffer.
-//!
-//! \param psUSBRingBuf is the ring buffer object to check.
-//!
-//! This function returns the size of the ring buffer.
-//!
-//! \return Returns the size in bytes of the ring buffer.
-//
-//*****************************************************************************
-uint32_t
-USBRingBufSize(tUSBRingBufObject *psUSBRingBuf)
-{
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Return the number of bytes available in the ring buffer.
- //
- return(psUSBRingBuf->ui32Size);
-}
-
-//*****************************************************************************
-//
-//! Reads a single byte of data from a ring buffer.
-//!
-//! \param psUSBRingBuf points to the ring buffer to be written to.
-//!
-//! This function reads a single byte of data from a ring buffer.
-//!
-//! \return The byte read from the ring buffer.
-//
-//*****************************************************************************
-uint8_t
-USBRingBufReadOne(tUSBRingBufObject *psUSBRingBuf)
-{
- uint8_t ui8Temp;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Verify that space is available in the buffer.
- //
- ASSERT(USBRingBufUsed(psUSBRingBuf) != 0);
-
- //
- // Write the data byte.
- //
- ui8Temp = psUSBRingBuf->pui8Buf[psUSBRingBuf->ui32ReadIndex];
-
- //
- // Increment the read index.
- //
- UpdateIndexAtomic(&psUSBRingBuf->ui32ReadIndex, 1, psUSBRingBuf->ui32Size);
-
- //
- // Return the character read.
- //
- return(ui8Temp);
-}
-
-//*****************************************************************************
-//
-//! Reads data from a ring buffer.
-//!
-//! \param psUSBRingBuf points to the ring buffer to be read from.
-//! \param pui8Data points to where the data should be stored.
-//! \param ui32Length is the number of bytes to be read.
-//!
-//! This function reads a sequence of bytes from a ring buffer.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufRead(tUSBRingBufObject *psUSBRingBuf, uint8_t *pui8Data,
- uint32_t ui32Length)
-{
- uint32_t ui32Temp;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
- ASSERT(pui8Data != NULL);
- ASSERT(ui32Length != 0);
-
- //
- // Verify that data is available in the buffer.
- //
- ASSERT(ui32Length <= USBRingBufUsed(psUSBRingBuf));
-
- //
- // Read the data from the ring buffer.
- //
- for(ui32Temp = 0; ui32Temp < ui32Length; ui32Temp++)
- {
- pui8Data[ui32Temp] = USBRingBufReadOne(psUSBRingBuf);
- }
-}
-
-//*****************************************************************************
-//
-//! Removes bytes from the ring buffer by advancing the read index.
-//!
-//! \param psUSBRingBuf points to the ring buffer from which bytes are to be
-//! removed.
-//! \param ui32NumBytes is the number of bytes to be removed from the buffer.
-//!
-//! This function advances the ring buffer read index by a given number of
-//! bytes, removing that number of bytes of data from the buffer. If
-//! \e ui32NumBytes is larger than the number of bytes currently in the buffer,
-//! the buffer is emptied.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufAdvanceRead(tUSBRingBufObject *psUSBRingBuf, uint32_t ui32NumBytes)
-{
- uint32_t ui32Count;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Make sure that we are not being asked to remove more data than is
- // there to be removed.
- //
- ui32Count = USBRingBufUsed(psUSBRingBuf);
- ui32Count = (ui32Count < ui32NumBytes) ? ui32Count : ui32NumBytes;
-
- //
- // Advance the buffer read index by the required number of bytes.
- //
- UpdateIndexAtomic(&psUSBRingBuf->ui32ReadIndex, ui32Count,
- psUSBRingBuf->ui32Size);
-}
-
-//*****************************************************************************
-//
-//! Adds bytes to the ring buffer by advancing the write index.
-//!
-//! \param psUSBRingBuf points to the ring buffer to which bytes have been
-//! added.
-//! \param ui32NumBytes is the number of bytes added to the buffer.
-//!
-//! This function should be used by clients who wish to add data to the buffer
-//! directly rather than via calls to USBRingBufWrite() or
-//! USBRingBufWriteOne(). It advances the write index by a given number of
-//! bytes.
-//!
-//! \note It is considered an error if the \e ui32NumBytes parameter is larger
-//! than the amount of free space in the buffer and a debug build of this
-//! function will fail (ASSERT) if this condition is detected. In a release
-//! build, the buffer read pointer will be advanced if too much data is written
-//! but this will, of course, result in some of the oldest data in the buffer
-//! being discarded and also, depending upon how data is being read from
-//! the buffer, may result in a race condition which could corrupt the read
-//! pointer.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufAdvanceWrite(tUSBRingBufObject *psUSBRingBuf, uint32_t ui32NumBytes)
-{
- uint32_t ui32Count;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Make sure we were not asked to add a silly number of bytes.
- //
- ASSERT(ui32NumBytes <= psUSBRingBuf->ui32Size);
-
- //
- // Determine how much free space we currently think the buffer has.
- //
- ui32Count = USBRingBufFree(psUSBRingBuf);
-
- //
- // Check that the client has not added more data to the buffer than there
- // is space for. In this case, corruption may have occurred since the
- // buffer may have been read under interrupt context while the writer was
- // busy trashing the area around the read pointer.
- //
- ASSERT(ui32Count >= ui32NumBytes);
-
- //
- // Update the write pointer.
- //
- psUSBRingBuf->ui32WriteIndex += ui32NumBytes;
-
- //
- // Check and correct for wrap.
- //
- if(psUSBRingBuf->ui32WriteIndex >= psUSBRingBuf->ui32Size)
- {
- psUSBRingBuf->ui32WriteIndex -= psUSBRingBuf->ui32Size;
- }
-
- //
- // Did the client add more bytes than the buffer had free space for? This
- // should be considered a bug since, unless this function is called in
- // the same context as the code which is reading from the buffer, writing
- // over the earliest data can cause corrupted data to be read. The
- // ASSERT above catches this in debug builds but, in release builds, we
- // go ahead and try to fix up the read pointer appropriately.
- //
- if(ui32Count < ui32NumBytes)
- {
- //
- // Yes - we need to advance the read pointer to ahead of the write
- // pointer to discard some of the oldest data.
- //
- psUSBRingBuf->ui32ReadIndex = psUSBRingBuf->ui32WriteIndex + 1;
-
- //
- // Correct for buffer wrap if necessary.
- //
- if(psUSBRingBuf->ui32ReadIndex >= psUSBRingBuf->ui32Size)
- {
- psUSBRingBuf->ui32ReadIndex -= psUSBRingBuf->ui32Size;
- }
- }
-
-}
-
-//*****************************************************************************
-//
-//! Writes a single byte of data to a ring buffer.
-//!
-//! \param psUSBRingBuf points to the ring buffer to be written to.
-//! \param ui8Data is the byte to be written.
-//!
-//! This function writes a single byte of data into a ring buffer.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufWriteOne(tUSBRingBufObject *psUSBRingBuf, uint8_t ui8Data)
-{
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
-
- //
- // Verify that space is available in the buffer.
- //
- ASSERT(USBRingBufFree(psUSBRingBuf) != 0);
-
- //
- // Write the data byte.
- //
- psUSBRingBuf->pui8Buf[psUSBRingBuf->ui32WriteIndex] = ui8Data;
-
- //
- // Increment the write index.
- //
- UpdateIndexAtomic(&psUSBRingBuf->ui32WriteIndex, 1,
- psUSBRingBuf->ui32Size);
-}
-
-//*****************************************************************************
-//
-//! Writes data to a ring buffer.
-//!
-//! \param psUSBRingBuf points to the ring buffer to be written to.
-//! \param pui8Data points to the data to be written.
-//! \param ui32Length is the number of bytes to be written.
-//!
-//! This function write a sequence of bytes into a ring buffer.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufWrite(tUSBRingBufObject *psUSBRingBuf, const uint8_t *pui8Data,
- uint32_t ui32Length)
-{
- uint32_t ui32Temp;
-
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
- ASSERT(pui8Data != NULL);
- ASSERT(ui32Length != 0);
-
- //
- // Verify that space is available in the buffer.
- //
- ASSERT(ui32Length <= USBRingBufFree(psUSBRingBuf));
-
- //
- // Write the data into the ring buffer.
- //
- for(ui32Temp = 0; ui32Temp < ui32Length; ui32Temp++)
- {
- USBRingBufWriteOne(psUSBRingBuf, pui8Data[ui32Temp]);
- }
-}
-
-//*****************************************************************************
-//
-//! Initializes a ring buffer object.
-//!
-//! \param psUSBRingBuf points to the ring buffer to be initialized.
-//! \param pui8Buf points to the data buffer to be used for the ring buffer.
-//! \param ui32Size is the size of the buffer in bytes.
-//!
-//! This function initializes a ring buffer object, preparing it to store data.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-USBRingBufInit(tUSBRingBufObject *psUSBRingBuf, uint8_t *pui8Buf,
- uint32_t ui32Size)
-{
- //
- // Check the arguments.
- //
- ASSERT(psUSBRingBuf != NULL);
- ASSERT(pui8Buf != NULL);
- ASSERT(ui32Size != 0);
-
- //
- // Initialize the ring buffer object.
- //
- psUSBRingBuf->ui32Size = ui32Size;
- psUSBRingBuf->pui8Buf = pui8Buf;
- psUSBRingBuf->ui32WriteIndex = psUSBRingBuf->ui32ReadIndex = 0;
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbtick.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbtick.c
deleted file mode 100644
index cc3b871fe..000000000
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/lib/usblib/usbtick.c
+++ /dev/null
@@ -1,217 +0,0 @@
-//*****************************************************************************
-//
-// usbtick.c - Functions related to USB stack tick timer handling.
-//
-// Copyright (c) 2008-2013 Texas Instruments Incorporated. All rights reserved.
-// Software License Agreement
-//
-// Texas Instruments (TI) is supplying this software for use solely and
-// exclusively on TI's microcontroller products. The software is owned by
-// TI and/or its suppliers, and is protected under applicable copyright
-// laws. You may not combine this software with "viral" open-source
-// software in order to form a larger program.
-//
-// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
-// 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. TI SHALL NOT, UNDER ANY
-// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
-// DAMAGES, FOR ANY REASON WHATSOEVER.
-//
-// This is part of revision 1.1 of the Tiva USB Library.
-//
-//*****************************************************************************
-
-#include
-#include
-#include "inc/hw_types.h"
-#include "driverlib/debug.h"
-#include "usblib/usblib.h"
-#include "usblib/usblibpriv.h"
-
-//*****************************************************************************
-//
-//! \addtogroup general_usblib_api
-//! @{
-//
-//*****************************************************************************
-
-//*****************************************************************************
-//
-// These are the internal timer tick handlers used by the USB stack. Handlers
-// in g_pfnTickHandlers are called in the context of the USB SOF interrupt
-// every USB_SOF_TICK_DIVIDE milliseconds.
-//
-//*****************************************************************************
-tUSBTickHandler g_pfnTickHandlers[MAX_USB_TICK_HANDLERS];
-void *g_pvTickInstance[MAX_USB_TICK_HANDLERS];
-
-//*****************************************************************************
-//
-// Flag to indicate whether or not we have been initialized.
-//
-//*****************************************************************************
-bool g_bUSBTimerInitialized = false;
-
-//*****************************************************************************
-//
-// This is the current tick value in ms for the system. This is used for all
-// instances of USB controllers and for all timer tick handlers.
-//
-//*****************************************************************************
-uint32_t g_ui32CurrentUSBTick = 0;
-
-//*****************************************************************************
-//
-// This is the total number of SOF interrupts received since the system
-// booted. The value is incremented by the low level device- or host-interrupt
-// handler functions.
-//
-//*****************************************************************************
-uint32_t g_ui32USBSOFCount = 0;
-
-//*****************************************************************************
-//
-// This internal function initializes the variables used in processing timer
-// ticks.
-//
-// This function should only be called from within the USB library. It is set
-// up to ensure that it can be called multiple times if necessary without
-// the previous configuration being erased (to cater for OTG mode switching).
-//
-// \return None.
-//
-//*****************************************************************************
-void
-InternalUSBTickInit(void)
-{
- uint32_t ui32Loop;
-
- if(!g_bUSBTimerInitialized)
- {
- for(ui32Loop = 0; ui32Loop < MAX_USB_TICK_HANDLERS; ui32Loop++)
- {
- g_pfnTickHandlers[ui32Loop] = (tUSBTickHandler)0;
- g_pvTickInstance[ui32Loop] = 0;
- }
-
- g_bUSBTimerInitialized = true;
- }
-}
-
-//*****************************************************************************
-//
-// This internal function resets the USB tick handler.
-//
-// This function should only be called from within the USB library. It will
-// clear out the tick handler state and should be called to allow the tick
-// handlers to be initialized once USBDCDInit() function is called.
-//
-// \return None.
-//
-//*****************************************************************************
-void
-InternalUSBTickReset(void)
-{
- //
- // Reset the initialized flag so that the next time InternalUSBTickInit()
- // is called.
- //
- g_bUSBTimerInitialized = 0;
-}
-
-//*****************************************************************************
-//
-// This internal function handles registering OTG, Host, or Device SOF timer
-// handler functions.
-//
-// \param pfHandler specifies the handler to call for the given type of
-// handler.
-// \param pvInstance is the instance pointer that will be returned to the
-// function provided in the \e pfHandler function.
-//
-// This function should only be called inside the USB library and only as a
-// result to a call to reinitialize the stack in a new mode. Currently the
-// following 3 types of timer tick handlers can be registered:
-// TICK_HANDLER_OTG, TICK_HANDLER_HOST, or TICK_HANDLER_DEVICE. Handlers
-// registered via this function are called in the context of the SOF interrupt.
-//
-// \return A value of zero means that the tick handler was registered and any
-// other value indicates an error.
-//
-//*****************************************************************************
-int32_t
-InternalUSBRegisterTickHandler(tUSBTickHandler pfHandler, void *pvInstance)
-{
- int32_t i32Idx;
-
- for(i32Idx = 0; i32Idx < MAX_USB_TICK_HANDLERS; i32Idx++)
- {
- if(g_pfnTickHandlers[i32Idx] == 0)
- {
- //
- // Save the handler.
- //
- g_pfnTickHandlers[i32Idx] = pfHandler;
-
- //
- // Save the instance data.
- //
- g_pvTickInstance[i32Idx] = pvInstance;
- }
- }
-
- if(i32Idx == MAX_USB_TICK_HANDLERS)
- {
- return(-1);
- }
- return(0);
-}
-
-//*****************************************************************************
-//
-//! \internal
-//!
-//! Calls internal handlers in response to a tick based on the start of frame
-//! interrupt.
-//!
-//! \param ui32TicksmS specifies how many milliseconds have passed since the
-//! last call to this function.
-//!
-//! This function is called every 5mS in the context of the Start of Frame
-//! (SOF) interrupt. It is used to call any registered internal tick
-//! functions.
-//!
-//! This function should only be called from within the USB library.
-//!
-//! \return None.
-//
-//*****************************************************************************
-void
-InternalUSBStartOfFrameTick(uint32_t ui32TicksmS)
-{
- int32_t i32Idx;
-
- //
- // Advance time.
- //
- g_ui32CurrentUSBTick += ui32TicksmS;
-
- //
- // Call any registered SOF tick handlers.
- //
- for(i32Idx = 0; i32Idx < MAX_USB_TICK_HANDLERS; i32Idx++)
- {
- if(g_pfnTickHandlers[i32Idx])
- {
- g_pfnTickHandlers[i32Idx](g_pvTickInstance[i32Idx], ui32TicksmS);
- }
- }
-}
-
-//*****************************************************************************
-//
-// Close the Doxygen group.
-//! @}
-//
-//*****************************************************************************
diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/main.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/main.c
index 6fac4b170..ce7e16b60 100644
--- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/main.c
+++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/main.c
@@ -109,6 +109,11 @@ static void Init(void)
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7);
+ /* reset the USB peripheral */
+ SysCtlPeripheralReset(SYSCTL_PERIPH_USB0);
+ /* enable the USB peripheral and turn on the USB Phy clock */
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
+ SysCtlUSBPLLEnable();
#endif
/* enable the GPIO port to which the SELECT button is connected */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Debug/openblt_xmc4700.srec b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Debug/openblt_xmc4700.srec
index 2ec969b11..40f81f235 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Debug/openblt_xmc4700.srec
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Debug/openblt_xmc4700.srec
@@ -29,18 +29,18 @@ S3150C0001A0A3020008A3020008A3020008A302000889
S3150C0001B0A3020008A3020008A3020008A302000879
S3150C0001C0A3020008A3020008A3020008A302000869
S3150C0001D0A3020008A3020008A30200080000000006
-S3150C0001E0A3020008A302000835430008A302000876
+S3150C0001E0A3020008A3020008C1430008A3020008EA
S3150C0001F0A302000800000000A30200080000000093
S3150C000200DFF878D01E4880471E4C1F4DAC4209DAE9
S3150C00021021686268A368043BA2BFC858D050FAE7AD
S3150C0002200C34F3E7194B1A4CA34208DA19685A68CE
S3150C0002300020043AA4BF8850FBE70833F4E71548BE
-S3150C000240804715488047154880470000A4B8000C25
-S3150C0002504088FE1FC8000000A4B8000C4088FE1F92
-S3150C000260000000000889FE1F6C2000000000002022
+S3150C000240804715488047154880470000D4BA000CF3
+S3150C0002504088FE1FEC000000D4BA000C4088FE1F3C
+S3150C000260000000003089FE1F6C20000000000020FA
S3150C0002700000000000000020A03000004088FE1F97
S3150C000280C50500084C020008640200086402000858
-S3150C0002907C020008A1020008E5AD0008C1AB00080D
+S3150C0002907C020008A1020008D5AE0008B1AC00082B
S3150C0002A07047FEE772B60D4B0D4A9A60BFF34F8F3F
S3150C0002B062B6D3F888200B4842F47002C3F8882043
S3150C0002C05A6941F2140122F008025A61435823F08C
@@ -93,7 +93,7 @@ S3150C0005A00500010003002001002F0501002F0301A7
S3150C0005B0002F0201002F0101002F000160410050A5
S3150C0005C06BCA5F6B10B54FF000530FCB034C84E82E
S3150C0005D00F00FFF767FEFFF7CDFE10BDC4FF03202B
-S3150C0005E009F0FAB82DE9F04184B004AD002405F801
+S3150C0005E009F072B92DE9F04184B004AD002405F888
S3150C0005F00C4DDFF8E480364E4FF480332A464046E5
S3150C0006000921029300F088F92A46304604218DF818
S3150C000610044000F081F92A46304602218DF8044048
@@ -110,20 +110,20 @@ S3150C0006B0092362F38B2364F38F33012262F397537E
S3150C0006C0044A43F08063136004B0BDE8F08100BFB8
S3150C0006D00082024840400050008F0248F8B5234D76
S3150C0006E0284600F00FFF2A68136823F48013136062
-S3150C0006F009F072F800F59C54083405E009F06CF822
-S3150C000700844207D909F05EFA1848002100F0B2FFBE
+S3150C0006F009F0EAF800F59C54083405E009F0E4F832
+S3150C000700844207D909F0D6FA1848002100F0B2FF46
S3150C0007100028F3D0164A1548002100F059FF2B6823
S3150C000720144A186841F2180140F490401860585861
S3150C00073040F400505850186840F00800186058589B
S3150C00074040F00200585019684FF0080E41F00401B1
S3150C0007500027272669255B244520196082F800E0CE
S3150C00076057709670D57014715071F8BD4088FE1F85
-S3150C00077088AE0008F88BFE1F70B469210826002588
+S3150C00077078AF0008208CFE1F70B46921082600256E
S3150C00078027245B224523067045708470C170027164
S3150C000790437170BC704700BF10B5094800F042FEAB
S3150C0007A040F2F353421E9A42044602D900242046D4
S3150C0007B010BD04490248224600F006FE204610BD34
-S3150C0007C04088FE1FF0A2FE1F30B4294C2388013B43
+S3150C0007C04088FE1F18A3FE1F30B4294C2388013B1A
S3150C0007D09BB240F2F35293423CD8264D95F8263004
S3150C0007E06A695B01D118D358002B35DB8A6822491C
S3150C0007F0013A002311F8010F02F8010F208801338A
@@ -134,7 +134,7 @@ S3150C0008300133DBB29A4285F826302A6808BF0023BA
S3150C00084041F2040108BF84F8263000230224145018
S3150C00085053502B6230BC70472B6841F2140041F2A6
S3150C0008600402022400211C50995030BC704700BF72
-S3150C00087018A2FE1F4088FE1FEFA2FE1F024A41F27D
+S3150C00087040A2FE1F4088FE1F17A3FE1F024A41F22C
S3150C0008801003D058704700BF001000580F4B70B4BF
S3150C0008905022F5240E4E0F4D1C6001F580741A6023
S3150C0008A091E80C000831A14232602B60F8D107495F
@@ -316,7 +316,7 @@ S3150C001390FFF7B2FF41F214062B686FF07C424FF058
S3150C0013A0FF376FF0C0204FF402719F51C3F8102124
S3150C0013B0C3F80C21C3F80002D9632C62F8BD00BF38
S3150C0013C0802001020400200238B504460846236931
-S3150C0013D094F8271003EB41131546996809F038FD6C
+S3150C0013D094F8271003EB41131546996809F0B0FDF4
S3150C0013E094F8273022695B014FF00041D15094F8F4
S3150C0013F0273094F824200133DBB29A4284F8273044
S3150C00140004BF002384F8273041F21402236899584C
@@ -437,10 +437,10 @@ S3150C001B2012DB04EB4401E21A66B19C42ECD3D2B24E
S3150C001B30154B002AEDD0154B1B68DB071DD500BED7
S3150C001B40BDE8F0812246F3E7114C2346002543F805
S3150C001B50205BE01C1D60FF216562A5621022E56218
-S3150C001B60258684F8325009F07EF904F11300FF2122
-S3150C001B701022BDE8F04109F076B9BDE8F08100BF4E
-S3150C001B800889FE1F0000000090AE0008F0ED00E092
-S3150C001B901489FE1F1089FE1F034B10B9187801F02B
+S3150C001B60258684F8325009F0F6F904F11300FF21AA
+S3150C001B701022BDE8F04109F0EEB9BDE8F08100BFD6
+S3150C001B803089FE1F0000000080AF0008F0ED00E079
+S3150C001B903C89FE1F3889FE1F034B10B9187801F0DB
S3150C001BA033BC187801F02EBC8088FE1F044830B177
S3150C001BB008B5044B187801F035FC012008BD7047B8
S3150C001BC0253400088088FE1F024B1878FF3818BF92
@@ -456,8 +456,8 @@ S3150C001C50E21A75B19C42EDD3D2B2134B002AEED0E8
S3150C001C60124B186810F00100BDD000BE0020BDE874
S3150C001C70F8832246F1E7404687F8008001F0DEFB48
S3150C001C80404601F0BFFB0120BDE8F8838088FE1FAB
-S3150C001C901489FE1F7088FE1F000000000C89FE1FB1
-S3150C001CA00889FE1F1089FE1F90AE0008F0ED00E0BB
+S3150C001C903C89FE1F7088FE1F000000003489FE1F61
+S3150C001CA03089FE1F3889FE1F80AF0008F0ED00E07A
S3150C001CB02DE9F0434378023B85B081460E46032B53
S3150C001CC000F29280DFE803F0354E1B024F4B1A7878
S3150C001CD0D10711D51A784E4922F004021A700C68F5
@@ -479,13 +479,13 @@ S3150C001DC08DF8041003938DF80520BEB1201D01A9D2
S3150C001DD001F060F8054689E7E31ADBB2002BD9D18E
S3150C001DE00F4BD0E72346F9E7094B1C68002992D024
S3150C001DF0201D494601F04EF8054677E72546304644
-S3150C001E0055F8043B9847284601A98BE71489FE1F11
-S3150C001E100C89FE1FF0ED00E0000000001089FE1F8B
-S3150C001E2090AE00080889FE1F38B58B780D4A03F072
+S3150C001E0055F8043B9847284601A98BE73C89FE1FE9
+S3150C001E103489FE1FF0ED00E0000000003889FE1F3B
+S3150C001E2080AF00083089FE1F38B58B780D4A03F059
S3150C001E307F03072B157806D90B4B1B68DB0700D5E0
S3150C001E4000BE002038BD094B0C460846997801F0B7
S3150C001E50A1F90028F0D028462146BDE8384001F00B
-S3150C001E6057BB00BF8088FE1FF0ED00E01489FE1FF3
+S3150C001E6057BB00BF8088FE1FF0ED00E03C89FE1FCB
S3150C001E702DE9F047DDF82080DDF824901646002A7F
S3150C001E8036D04A78052A0C462AD1CD7805F00305BA
S3150C001E909D4225D107464FF0000A14E0A3781A0696
@@ -500,17 +500,17 @@ S3150C001F10104EED07307806D50F4B1B68DA0700D547
S3150C001F2000BE002070BDE57845F00105E57001F0B6
S3150C001F30B7FB60B9E378084A23F00103E370E37852
S3150C001F4023F00403E3701368DB07EAD500BE70BD0B
-S3150C001F501489FE1F8088FE1FF0ED00E0054B01F092
+S3150C001F503C89FE1F8088FE1FF0ED00E0054B01F06A
S3150C001F607F0203EB420303EBD11191F8230000F03F
-S3150C001F70010070471489FE1F10B50D4B0D4801F07A
+S3150C001F70010070473C89FE1F10B50D4B0D4801F052
S3150C001F807F0403EB440404EBD114007894F823305B
S3150C001F909B0704F1200409D401F0D4FBE37843F049
S3150C001FA00203E370E37843F00103E37010BD00BF56
-S3150C001FB01489FE1F8088FE1F10B50D4B0D4801F0CD
+S3150C001FB03C89FE1F8088FE1F10B50D4B0D4801F0A5
S3150C001FC07F0403EB440404EBD114007894F823301B
S3150C001FD09B0704F1200409D501F0B8FBE37823F044
S3150C001FE00203E370E37823F00103E37010BD00BF36
-S3150C001FF01489FE1F8088FE1F2DE9F04F89B001F071
+S3150C001FF03C89FE1F8088FE1F2DE9F04F89B001F049
S3150C002000C7F8002854D0A94CA94DDFF8B482A246D3
S3150C0020102F683E46002056F8043B9847304605A9E3
S3150C00202000F018FF3B68064601209847002E3FD06B
@@ -532,16 +532,16 @@ S3150C002110012B6FD0022B00F0A580002B7FD0D8F8B6
S3150C0021200030DE0700D500BE9DF81400002101F03A
S3150C00213009FB9DF81400802101F004FB68E7237865
S3150C002140DA077FF565AF5F4B002B3FF461AF07F005
-S3150C002150F1FB5DE72378D9077FF55AAF5A4B002B75
-S3150C0021603FF456AF2078C0F3C00007F0E1FB4FE711
+S3150C00215069FC5DE72378D9077FF55AAF5A4B002BFC
+S3150C0021603FF456AF2078C0F3C00007F059FC4FE798
S3150C0021709DF81400FFF7BEFC00F07AFB534B002BC6
-S3150C0021803FF446AF07F0D0FB42E79DF81400FFF78B
+S3150C0021803FF446AF07F048FC42E79DF81400FFF712
S3150C002190B1FC00F06DFB9DF81830A37038E7D8F849
S3150C0021A00030DB077FF534AF00BE31E79B1ADBB29C
S3150C0021B0002B7FF478AF464B1E699DF814009DF8F2
S3150C0021C01920079BB04723E79DF814009DF81920AA
S3150C0021D0079B00F071FB1BE73E480028A4D000F0DB
-S3150C0021E057FB3046012106AAAFF3008000287FF486
+S3150C0021E057FB3046012106AA01F01EFE00287FF49B
S3150C0021F00FAF99E79DF81C300F2B95D853442D48FB
S3150C002200DB7800286AD02C4A1278934264D22B4A87
S3150C002210176803EB430317EBC30763D184E7202A44
@@ -553,10 +553,10 @@ S3150C00226061230008BDF81C30D9B201F07F000728A5
S3150C0022703FF655AF4700C3F3C0130AEB070E9E4457
S3150C0022800C489EF813E0002853D00B48007886457E
S3150C0022904BD20A4800680EEB4E0E00EBCE09002A14
-S3150C0022A000F05581B9F1000F4CD13DE71489FE1FA2
-S3150C0022B00C89FE1F000000000889FE1F1089FE1FF6
-S3150C0022C0F0ED00E0359900083199000829990008CD
-S3150C0022D090AE0008000000009B1ADBB2002B7FF4C6
+S3150C0022A000F05581B9F1000F4CD13DE73C89FE1F7A
+S3150C0022B03489FE1F000000003089FE1F3889FE1F7E
+S3150C0022C0F0ED00E0259A0008219A0008199A0008FA
+S3150C0022D080AF0008293E00089B1ADBB2002B7FF466
S3150C0022E023AFBE4FF86800F0D3FAFB6806AA304657
S3150C0022F00121984700287FF48BAE9DF8183013F017
S3150C00230060077FF411AF9DF819300A3B012B3FF69D
@@ -582,12 +582,12 @@ S3150C00243013F0080F14BF02220022C3F340133046D8
S3150C00244006A942EA03060DF112020223ADF8126048
S3150C00245000F0D4F9DCE5BDF81A30012B7FF464AE3C
S3150C0024602378304643F0080306A9237000F0AAF936
-S3150C002470CEE55B4B002B3FF457AEAFF30080024624
+S3150C002470CEE55B4B002B3FF457AE01F0D1FC024688
S3150C00248000283FF44CAE304606A9538800F0B6F946
S3150C00249000287FF4BDAD47E6524B002B3FF444AE0B
S3150C0024A0AFF30080024600283FF43EAE304606A944
S3150C0024B0137800F0A3F900287FF4AAAD34E6BDF832
-S3150C0024C01C1001F0ADFC02460028EFD12CE6022BC5
+S3150C0024C01C1001F0CBFC02460028EFD12CE6022BA7
S3150C0024D000F0AD80444B002B3FF426AEAFF30080EA
S3150C0024E00246002A3FF41BAECDE701F091FC06A98B
S3150C0024F002461223304600F081F900287FF488AD9D
@@ -604,9 +604,9 @@ S3150C00259094F82430DF073FF53BADC1E69B1ADBB25E
S3150C0025A0002B7FF4C1AD0D4FC1E7E0190344304653
S3150C0025B093F8236006A9C6F340060DF11202022316
S3150C0025C0ADF8126000F01AF922E508AA304602F8B6
-S3150C0025D00E7D06A9012300F011F919E590AE00084D
-S3150C0025E000000000000000000000000000000000D9
-S3150C0025F00889FE1F1089FE1F581EC0B201F00CFC84
+S3150C0025D00E7D06A9012300F011F919E580AF00085C
+S3150C0025E0213E000800000000000000000000000072
+S3150C0025F03089FE1F3889FE1F581EC0B201F00CFC34
S3150C00260010B14378022B19D0D8F80030DB077FF5D0
S3150C00261086AD00BE83E5FFF7CFFCA8E7304601F098
S3150C00262017F8A7783046FFF765FAA770A3E601F00E
@@ -626,36 +626,36 @@ S3150C0026F0002106E0BA780A44D2B2A018C078FF28A6
S3150C00270082D101312244C9B2994282F80390F1D1A7
S3150C0027104B4639460E485A4600F06EFD084B1B7860
S3150C002720B3425F44FFF670AF019BBB429AD8029E40
-S3150C002730084B002B3FF423AE07F0F2F81FE600BF60
-S3150C0027400889FE1F1089FE1F0000000090AE0008CD
-S3150C0027502789FE1F2199000830B5184CE189A389F9
+S3150C002730084B002B3FF423AE07F06AF91FE600BFE7
+S3150C0027403089FE1F3889FE1F0000000080AF00088C
+S3150C0027504F89FE1F119A000830B5184CE189A389E0
S3150C00276022785B1A9BB222F07F02402B83B005467F
S3150C00277028BF402302F0FF0142B183B980211A46DB
S3150C002780284603B0BDE83040FFF7B8BB7BB9194605
S3150C0027901A46284603B0BDE83040FFF7AFBBA16828
-S3150C0027A0074801931A4608F053FB019B8021044A03
-S3150C0027B0284603B0BDE83040FFF7A0BB4889FE1F92
-S3150C0027C05C89FE1F70B40A460B4C496806461068B5
+S3150C0027A0074801931A4608F0CBFB019B8021044A8B
+S3150C0027B0284603B0BDE83040FFF7A0BB7089FE1F6A
+S3150C0027C08489FE1F70B40A460B4C4968064610688D
S3150C0027D0234603C31378002513F0800F304618BF29
S3150C0027E029462A462B46A560E581A58108BF80218E
-S3150C0027F070BCFFF783BB00BF4889FE1FF8B50E46B9
+S3150C0027F070BCFFF783BB00BF7089FE1FF8B50E4691
S3150C002800194C496807463068A260254603C5002165
S3150C002810E181F588AB4228BF2B46A3818DB103B16C
S3150C0028204AB13846FFF798FFC0B9104B1B68DB0757
S3150C00283005D500BEF8BD0D4B1B68D90710D400207A
S3150C002840F8BD337813F0800F0CBF80210021384679
S3150C0028502A462B46FFF752FB0028E6D00120F8BD8E
-S3150C00286000BE1046F8BD00BF4889FE1FF0ED00E023
+S3150C00286000BE1046F8BD00BF7089FE1FF0ED00E0FB
S3150C00287006490B46002243F8042B04334A6043F8FE
-S3150C002880042B43F8042B1A60704700BF4889FE1FBF
-S3150C002890014B1861704700BF4889FE1F0246054B65
+S3150C002880042B43F8042B1A60704700BF7089FE1F97
+S3150C002890014B1861704700BF7089FE1F0246054B3D
S3150C0028A0516800681A4603C200229A60DA819A813E
-S3150C0028B0704700BF4889FE1F30B5314C2278C909D4
+S3150C0028B0704700BF7089FE1F30B5314C2278C909AC
S3150C0028C0B1EBD21F83B0054617D073B92D4B13B19C
S3150C0028D02146AFF300802369002B34D02846032110
S3150C0028E0274A9847012003B030BD274B1B68D907F0
S3150C0028F000D500BE002003B030BD120608D4A06877
-S3150C0029000028F7D01A462149019308F0A1FA019B39
+S3150C0029000028F7D01A462149019308F019FB019BC0
S3150C002910E289A168E0881A4492B219449042E28195
S3150C002920A16001D03F2B24D823697BB12846022114
S3150C002930134A984750B90146284600F003FF28462B
@@ -663,15 +663,15 @@ S3150C002940802100F0FFFE012003B030BD2378002269
S3150C00295013F0800F0CBF8021114628461346FFF753
S3150C002960CDFA0028EFD1084B1B68DB07C2D500BE99
S3150C002970B9E72846FFF7F0FE0028F4D0E3E700BFDE
-S3150C0029804889FE1F00000000F0ED00E05C89FE1F88
+S3150C0029807089FE1F00000000F0ED00E08489FE1F38
S3150C00299038B58488D51A9A4238BF05EB4405ADB2D2
S3150C0029A0CDB1AC4210D3A34203D31B1B9BB29C42AA
S3150C0029B0FBD9C2880468C2F30E02084602FB034127
-S3150C0029C008F046FA012038BD944294BF131B131924
+S3150C0029C008F0BEFA012038BD944294BF131B1319AC
S3150C0029D09BB24381E7E7284638BD00BF30B5930864
S3150C0029E05C1E83B00546A4B2ABB1013401EB840482
S3150C0029F051F8043B2B60A142FAD112F0030208D025
-S3150C002A0002A8002340F8043D214608F021FA019B58
+S3150C002A0002A8002340F8043D214608F099FA019BE0
S3150C002A102B6003B030BD0C46EFE700BF2DE9F04745
S3150C002A2082B08588BDF828409DF82CE01F1BA34278
S3150C002A3038BF07EB4507BEB2002E63D0B54265D34F
@@ -689,9 +689,9 @@ S3150C002AE0D8F80030002949D0411C1944724413F817
S3150C002AF0010B02F8010F8B42F9D1019B3B60B9F136
S3150C002B00000F35D1304602B0BDE8F0879D4294BF28
S3150C002B105C1B5C19A4B244812E4691E7B54209D3DD
-S3150C002B203846214606FB0CF208F092F9304602B004
-S3150C002B30BDE8F08721465246384608F089F907EB7E
-S3150C002B400A00D8F800104A4608F082F9304602B05E
+S3150C002B203846214606FB0CF208F00AFA304602B08B
+S3150C002B30BDE8F08721465246384608F001FA07EB05
+S3150C002B400A00D8F800104A4608F0FAF9304602B0E6
S3150C002B50BDE8F08716FB03F2384692B22146FFF722
S3150C002B603DFF3046CFE7D8F80010B9F1000FC9D0B9
S3150C002B7038464A46FFF732FF3046C4E71946BCE7EB
@@ -701,7 +701,7 @@ S3150C002BA09A424FEA410201D8934201DB9B1A9BB22F
S3150C002BB0638103B030BD00BF10B593085C1E82B0B4
S3150C002BC0A4B2A3B1013400EB84040B6840F8043BB7
S3150C002BD0A042FAD112F0030207D002AB096843F8FF
-S3150C002BE0041D2046194608F033F902B010BD044600
+S3150C002BE0041D2046194608F0ABF902B010BD044688
S3150C002BF0F0E700BF2DE9F04F8946C17905890646F5
S3150C002C004089C909174683B082B2ADB2B0880ED1DD
S3150C002C10954236BFC2EB4002AA1A521992B29042A2
@@ -729,8 +729,8 @@ S3150C002D6074AF8518ED1BADB2AA4202D8AC423FF740
S3150C002D706CAF2D1BADB268E7821A92B2974228BF90
S3150C002D801746BFB261E7154607465EE7A91A89B230
S3150C002D904400E2E787424946204606D807FB02F282
-S3150C002DA008F056F8B6F804E0C1E7424608F050F8C9
-S3150C002DB009EB08015246306808F04AF8B6F804E008
+S3150C002DA008F0CEF8B6F804E0C1E7424608F0C8F8D9
+S3150C002DB009EB08015246306808F0C2F8B6F804E090
S3150C002DC0B5E717FB0CF292B220464946FFF7F4FE24
S3150C002DD0B6F804E0ABE73068A0E700BF30B4B2F554
S3150C002DE0004F9DF808500FD8C488016063F30E0499
@@ -748,7 +748,7 @@ S3150C002E9077BE00BF38B504890589438982889BB201
S3150C002EA0ADB29D4236BFC3EB4203EB1A5B199BB224
S3150C002EB09A42A4B202D8C379DB0920D094422346A5
S3150C002EC003D39B1A9BB29A42FBD9C288054600686B
-S3150C002ED0C2F30E0202FB030007F0BAFF631C9BB29F
+S3150C002ED0C2F30E0202FB030008F032F8631C9BB22D
S3150C002EE0AA889C424FEA420204D99B1A9BB22B81B8
S3150C002EF0012038BD9342F8DA2B81012038BD1846E3
S3150C002F0038BD00BF0AB9104670470023FFF772BEE2
@@ -762,20 +762,20 @@ S3150C002F70394605F110004022FFF784FF044600286D
S3150C002F80F2D0304669783A462346FEF7B7FF28B9A1
S3150C002F90034B1B68DB07E7D500BEF8BD2046F8BD22
S3150C002FA0F0ED00E008B5044A4FF48E7303FB0020E5
-S3150C002FB00430FFF72DFF08BD9C89FE1F38B5074C62
+S3150C002FB00430FFF72DFF08BDC489FE1F38B5074C3A
S3150C002FC04FF48E7303FB004492B2201DFFF75AFF99
-S3150C002FD005462046FFF7A8FF284638BD9C89FE1FEC
+S3150C002FD005462046FFF7A8FF284638BDC489FE1FC4
S3150C002FE0F8B54FF48E7505FB00F5094E05F1100486
S3150C002FF0344492B22046FFF785FF07462046FFF77A
S3150C00300007FF3F2802D97019FFF7A6FF3846F8BD0F
-S3150C0030109C89FE1F08B5044B4FF48E7202FB0030E0
-S3150C003020FFF79AFF08BD00BF9C89FE1F30B50E4CFA
-S3150C00303083B000210D4620464FF48E7207F013FF25
+S3150C003010C489FE1F08B5044B4FF48E7202FB0030B8
+S3150C003020FFF79AFF08BD00BFC489FE1F30B50E4CD2
+S3150C00303083B000210D4620464FF48E7207F08BFFAD
S3150C00304004F11C01201D009540220123FFF7C6FE4A
S3150C003050009504F1100004F15C0140220123FFF7F6
-S3150C003060BDFE03B030BD00BF9C89FE1F10B5064CDB
+S3150C003060BDFE03B030BD00BFC489FE1F10B5064CB3
S3150C0030702046002340F8043BFFF750FF04F11000F4
-S3150C003080BDE81040FFF74ABF9C89FE1F4B79FF2B0A
+S3150C003080BDE81040FFF74ABFC489FE1F4B79FF2BE2
S3150C00309001D0002070472DE9F041254F0C787B7844
S3150C0030A082B01BB1002002B0BDE8F081BB78002BCA
S3150C0030B0F8D115460A798B783B7080460E460C443F
@@ -786,12 +786,12 @@ S3150C0030F03379A978C3EBC3031C4431B97B7893B9F4
S3150C003100A01B80B202B0BDE8F081404605F19C02DE
S3150C0031104023FEF7F3FE0028F0D1064B1B68DB07B5
S3150C003120C0D500BEBFE70248FFF716FFE8E700BFB1
-S3150C0031309C89FE1FF0ED00E010B5124CA078884279
+S3150C003130C489FE1FF0ED00E010B5124CA078884251
S3150C00314004D06078884211D0002010BD9AB2201DA0
S3150C00315004F19C01FFF7D6FE0B4B13B10020AFF325
S3150C00316000800848FFF7E0FE012010BD074A1AB19F
S3150C00317099B20020AFF300800248FFF7EDFE012064
-S3150C00318010BD00BF9C89FE1F00000000000000005F
+S3150C00318010BD00BFC489FE1F000000000000000037
S3150C003190FEF71ABDC378828803F003000228C2F337
S3150C0031A00A0215D0032819D0012801D00020704737
S3150C0031B0022940F2FF3308BF4FF4806393420CD2CE
@@ -816,8 +816,8 @@ S3150C0032D003F44023B3F5802F09D0002CD6D0D7F8B1
S3150C0032E0342801238B401343C7F83438F0BD0B4BFD
S3150C0032F003EB41131B7F012BEFD1D7F808588358EA
S3150C00330015F4807F14BF4FF080554FF000552B43BA
-S3150C0033108350002CBAD0E2E7A8AE0008C48AFE1F80
-S3150C003320A48BFE1F0001354BF0B40E061B5801F0A2
+S3150C0033108350002CBAD0E2E798AF0008EC8AFE1F67
+S3150C003320CC8BFE1F0001354BF0B40E061B5801F07A
S3150C0033307F0013D403F5306470B140012518215871
S3150C003340002927DB002A2B6814BF4FF40012002239
S3150C00335013432B60F0BC70472546F3E703F5106466
@@ -830,11 +830,11 @@ S3150C0033B04FF080420A432250AA689207FCD502229B
S3150C0033C0AA60D3F8042842F48062C3F80428C1E743
S3150C0033D0A55945F00065A5518D686D06FCD5084FBD
S3150C0033E0A559002A14BF3A464FF080422A43A251EF
-S3150C0033F08A689407FCD502228A60C0E7A8AE00084A
+S3150C0033F08A689407FCD502228A60C0E798AF000859
S3150C00340000002040704700BF704700BF044B00010E
S3150C0034101A58D2F8043823F00203C2F8043870475D
-S3150C003420A8AE0008044B00011A58D2F8043843F031
-S3150C0034300203C2F804387047A8AE000838B52F4905
+S3150C00342098AF0008044B00011A58D2F8043843F040
+S3150C0034300203C2F80438704798AF000838B52F4914
S3150C0034402F4A0301CC58236C1B0C1B0493420CD043
S3150C0034502C4A934209D002F58032934205D02A4B6E
S3150C0034601B68DA0748D500BE38BD0546FFF7DAFFFC
@@ -846,7 +846,7 @@ S3150C0034B0003EE36843F00703E360E36823F0C04390
S3150C0034C043F08043E360236823F0D00343F0C0034A
S3150C0034D02360D4F8003843F00403C4F80038636959
S3150C0034E061690B436361636861680B4363602846DB
-S3150C0034F0A261FFF78BFF38BD38BD00BFA8AE000830
+S3150C0034F0A261FFF78BFF38BD38BD00BF98AF00083F
S3150C0035000000544F00003155F0ED00E016380080F5
S3150C0035102DE9F0414A4A8C780001131804F07F0516
S3150C0035201B7A1658AB4233D9E009464A8C8800EB15
@@ -867,12 +867,12 @@ S3150C00360002F00303D1F800799B0402F0030243F4A1
S3150C003610004343EA8553012A44EA070444EA0304B7
S3150C00362014BF4FF0805300231C43C1F80049D6F851
S3150C0036301C280123AB401343C6F81C38BDE8F081A7
-S3150C003640A8AE0008C48AFE1FA88BFE1FF0ED00E092
+S3150C00364098AF0008EC8AFE1FD08BFE1FF0ED00E051
S3150C003650104B00011A1870B4167A1D58012E4FF033
S3150C0036600113C5F81C3810D90B490122002305EBB0
S3150C00367042100132D4B2A642C0F8003B01F120013F
S3150C0036804B81C0F800394B83F1D8044B10221A80B9
-S3150C00369070BC7047A8AE0008C48AFE1FA88BFE1F1C
+S3150C00369070BC704798AF0008EC8AFE1FD08BFE1FDB
S3150C0036A0F0B501F07F07CC09DFF868E004EB4701C1
S3150C0036B009010EEB01051E4600232E816B6083B0BB
S3150C0036C04EF801200835B7B16A88B6FBF2F302FB57
@@ -880,15 +880,15 @@ S3150C0036D0136292B201469BB252B101339BB20846B9
S3150C0036E0009639462246FFF7A1FD012003B0F0BD36
S3150C0036F0002EF4D1F1E7064D0096394622460123F9
S3150C00370025F81460FFF792FD012003B0F0BD00BF51
-S3150C003710A48BFE1FC48AFE1F10B40301084CE45888
+S3150C003710CC8BFE1FEC8AFE1F10B40301084CE45838
S3150C003720D4F8003823F4FE6343EA01110022C4F8EE
S3150C0037300018134680215DF8044BFFF7B1BF00BF9C
-S3150C003740A8AE00080122FFF7EDBD00BF0001114B2A
+S3150C00374098AF00080122FFF7EDBD00BF0001114B39
S3150C0037501B5801F07F0203EB42130A060CD4D3F874
S3150C003760002B22F40012C3F8002BD3F8002B42F0E6
S3150C0037708052C3F8002B7047D3F8002922F40012AC
S3150C003780C3F80029D3F8002942F08052C3F8002967
-S3150C003790704700BFA8AE00082DE9F04F0701DFF80F
+S3150C003790704700BF98AF00082DE9F04F0701DFF81E
S3150C0037A0F08258F807406369A6698DB01E40F20492
S3150C0037B0039008EB070300F15E82B3041FD54FF4A8
S3150C0037C000536361D4F80838C3F34103002B00F0AF
@@ -934,9 +934,9 @@ S3150C003A3084800122D9F83438A2401A4206927CD0EE
S3150C003A402B69C3F3C9439FB2002B00F0B1812969DE
S3150C003A50708BAB698AB2824228BF02469BB2B2EB2C
S3150C003A60830F00F2A5810134013F2303BFB20493F7
-S3150C003A704FF0000B22E000BFB98AFE1FF0ED00E00C
-S3150C003A80BC8AFE1F0930544FA48BFE1FC48AFE1F2E
-S3150C003A90A8AE0008B88AFE1F5146FFF7F7F9BB45DA
+S3150C003A704FF0000B22E000BFE18AFE1FF0ED00E0E4
+S3150C003A80E48AFE1F0930544FCC8BFE1FEC8AFE1FB6
+S3150C003A9098AF0008E08AFE1F5146FFF7F7F9BB45C1
S3150C003AA03FD02969708BAB698AB2824228BF024625
S3150C003AB09BB2B2EB830F0BF1010B32D87069002865
S3150C003AC0EAD19108079B481E80B2D3F800C0059036
@@ -967,7 +967,7 @@ S3150C003C4001218DF82520FEF733F8002EBFF6DDADE9
S3150C003C504FF0004363610023099305220A930B93EB
S3150C003C6009A89DF80C308DF8243001218DF82520FB
S3150C003C70FEF71EF8C9E54FF4805262610021E0227E
-S3150C003C805D481D7A07F0EFF8D4F800285B485C49CC
+S3150C003C805D481D7A07F067F9D4F800285B485C4953
S3150C003C90002322F4FE62C4F8002803700B706DB189
S3150C003CA0681EC0B2013004EB43110133D1F8002B6E
S3150C003CB0834242F00062C1F8002BF4D16D00092357
@@ -990,1981 +990,2018 @@ S3150C003DB00134B6E62B46FBE50A46E0E7134B5B8877
S3150C003DC0002B3FF41EAE0093039821461346FFF7D3
S3150C003DD02DFA2AE60D4B1B88002B3FF4FAAE009306
S3150C003DE028460B4622462146FFF720FA02E700BF7B
-S3150C003DF00930544FBC8AFE1FC48AFE1FB88AFE1FA8
-S3150C003E00B98AFE1FF0011000A88BFE1FA48BFE1FA3
-S3150C003E100048704710AF000800487047F0AE000825
-S3150C003E2038B510B303282AD8184B53F8204020462F
-S3150C003E3007F021F8C0B21F2828BF1F2008B3431E65
-S3150C003E40134DDBB20133621E05EB43042B4612F80D
-S3150C003E50011F23F8021FA342F9D1431C5B0043F454
-S3150C003E6040739BB22B800A4838BD084B084D1B6823
-S3150C003E7007481B886B804FF441732B8038BD00209C
-S3150C003E8038BD034D40F20233ECE700BF8488FE1FB9
-S3150C003E90AC8BFE1F704700BF38B5437B4BB94368EC
-S3150C003EA0044603B19847257B2DB10123637300208B
-S3150C003EB038BD002038BD204601F08EFB0028F4D01A
-S3150C003EC06573012038BD00BF08B5037B0BB100201C
-S3150C003ED008BD01F0B3F8003018BF012008BD00BFC3
-S3150C003EE010B4047B1CB100205DF8044B70475DF8E0
-S3150C003EF0044B01F08FBB00BF10B4047B1CB1002037
-S3150C003F005DF8044B70475DF8044B01F0F7BB00BF3E
-S3150C003F10037B0BB10020704700F088BFF0B5047A24
-S3150C003F208BB00023E4070546019302930393049395
-S3150C003F300593069307930893ADF824302ED4037B90
-S3150C003F4016460C46002B59D0252954D8DFE811F01B
-S3150C003F5048004800480048004800530053004800F9
-S3150C003F6053005300480048004800480048005300DE
-S3150C003F705300530053005300530053005300530097
-S3150C003F805300530053005300530053005300F100E9
-S3150C003F900B0129004B0020014800480003200BB000
-S3150C003FA0F0BD96F820400123102C8DF8043022D851
-S3150C003FB096F82170102F1ED83B19314622460DF16A
-S3150C003FC006008DF8053006F043FF01AB18193A468A
-S3150C003FD006F11001023006F03BFF2A7B002A72D054
-S3150C003FE000200BB0F0BD96F820300222102B8DF875
-S3150C003FF0042040F2C08004200BB0F0BD00F016FF88
-S3150C004000030706D514F0FB0F54D0A4F10D03012BB6
-S3150C00401050D9252CEFD801A353F824F0E13F000822
-S3150C004020214100080F410008FD4000080B42000822
-S3150C004030F73F0008F73F0008FB410008F73F000870
-S3150C004040F73F0008E9410008D74100083142000853
-S3150C0040501F42000843420008F73F0008F73F0008DC
-S3150C004060F73F0008F73F0008F73F0008F73F000846
-S3150C004070F73F0008F73F0008F73F0008F73F000836
-S3150C004080F73F0008F73F0008F73F0008F73F000826
-S3150C004090F73F0008F73F0008334100086741000866
-S3150C0040A0A33F0008E73F000891410008EB400008D9
-S3150C0040B0BB40000805200BB0F0BD2A7B08238DF809
-S3150C0040C00430002A8CD1284601A900F051FE0028A4
-S3150C0040D03FF465AF0F2800F0BD800A288BD033283B
-S3150C0040E00CBF042001200BB0F0BD2B7B002B7FF402
-S3150C0040F077AF2846314600F015FEE8E72B7B002B00
-S3150C0041007FF46EAF2846314600F03EFFDFE72B7B8F
-S3150C004110002B7FF465AF2846314600F02FFFD6E71B
-S3150C0041202B7B002B7FF45CAF2846314600F0CCFE8F
-S3150C004130CDE796F820300422102B8DF804203FF69C
-S3150C0041405AAF1A4631460DF106008DF8053006F0C9
-S3150C0041507FFE2B7B002B7FF443AF284601A901225F
-S3150C00416000F006FEB3E796F820300022102B8DF8EF
-S3150C00417004203FF640AF1A4631460DF106008DF885
-S3150C004180053006F065FE2A7B002A7FF429AF9AE7F4
-S3150C00419096F820400523102C8DF804303FF62BAFF3
-S3150C0041A096F82170102F3FF626AF3B193146224662
-S3150C0041B00DF106008DF8053006F04AFE01AB181914
-S3150C0041C006F110013A46023006F042FE2B7B002B1C
-S3150C0041D07FF406AFC1E72B7B002B7FF401AF28469B
-S3150C0041E0314600F05DFE72E72B7B002B7FF4F8AEB8
-S3150C0041F02846314600F01EFE69E72B7B002B7FF428
-S3150C004200EFAE284601F0C4F961E72B7B002B7FF457
-S3150C004210E7AE284696E8060001F04AF957E72B7BED
-S3150C004220002B7FF4DDAE2846314600F033FE4EE718
-S3150C0042302B7B002B7FF4D4AE2846314600F0FEFDD6
-S3150C00424045E72B7B002B7FF4CBAE2846314600F09E
-S3150C004250C5FE3CE702200BB0F0BD00BF2A492B4A35
-S3150C004260D1F89C3043F0010370B5C1F89C30D1F8FD
-S3150C0042709C30274E274C284D23F0F00343F0800347
-S3150C004280C1F89C3030460521FCF746FB304605212B
-S3150C0042900122FDF711FA30460621204AFCF73CFBB9
-S3150C0042A0304606210122FDF707FA204600211C4A5A
-S3150C0042B0FCF732FB204600210122FDF7FDF92846CA
-S3150C0042C00621184AFCF728FB284606210122FDF791
-S3150C0042D0F3F928460721144AFCF71EFB284607214A
-S3150C0042E00122FDF7E9F920460121104AFCF714FBDF
-S3150C0042F001210A462046FDF7DFF90D4A136843F4FF
-S3150C0043008813136070BD00BF0040005074AF0008E6
-S3150C00431000830248008402480081024854AF00081A
-S3150C00432044AF000824AF000864AF000834AF00089F
-S3150C004330B440005010B51048104C036810491A6868
-S3150C004340138E9BB22380538E9BB20B8023881BB299
-S3150C004350002B0CDB2388094AC3F30E0303B910BDEB
-S3150C0043601188054889B2BDE8104000F0F7BB0988F2
-S3150C00437089B200F037FCEDE7F088FE1F14A2FE1F91
-S3150C00438016A2FE1F10B5044600680021302220300C
-S3150C00439006F069FD23680022627283F850202168BA
-S3150C0043A001234B7621680B7621680B7721688B7677
-S3150C0043B0236822721A68938D23F004031B041B0CCA
-S3150C0043C0938510BD70B503681A6892F82F300B43AD
-S3150C0043D0DBB282F82F3005460C4605F0FDF900F2EB
-S3150C0043E0F51607E005F0EEFB2B681B6893F82F001B
-S3150C0043F0204005D005F0F0F98642F3D22E2070BD90
-S3150C00440070BD00BF027A520601D52C20704730B51C
-S3150C004410012183B00446FFF7D5FF002848D1236855
-S3150C004420244A19688B8D23F001031B041B0C8B8506
-S3150C004430236819688B8DDBB243F480738B852368F4
-S3150C00444019688B8D9BB243F001038B8523681B681F
-S3150C004450F3219986236819684EF2FF03CB862168EF
-S3150C004460096833250D87216809684B872368196805
-S3150C00447091F82E3003F0F00343F00E0381F82E3042
-S3150C0044802368196891F8293003F0F10343F00E0301
-S3150C00449081F82930237A43F0430323720190019B60
-S3150C0044A0934205D8019B01330193019B9342F9D9A1
-S3150C0044B003B030BD9F86010038B50368012283F82E
-S3150C0044C05820044605F088F900F2E93504E005F0B9
-S3150C0044D079FB23681A7A7AB9FFF72CFF05F07CF979
-S3150C0044E08542F4D223682E2000221A7223689A7E03
-S3150C0044F01F2A18BF187E38BD0020F5E7036859003F
-S3150C00450054BFD80F012013F0005F18BF012013F021
-S3150C004510806F18BF012013F0805F18BF012013F0C5
-S3150C004520006F18BF012013F4004F18BF012013F4BD
-S3150C004530001F18BF012013F4801F18BF012013F4AD
-S3150C004540002F18BF012013F0807F18BF0120DA035B
-S3150C00455001D50120704713F0080F18BF01207047D2
-S3150C00456070B50368414904461868FDF7D7F8236807
-S3150C0045709A88100703D11968496AC9072FD52046AE
-S3150C0045800221FFF71FFF23689A88054612F0700F69
-S3150C0045901DD11868436A9B0719D43549FDF7CAF82B
-S3150C0045A0236893F851601868012E1AD0438E9BB27B
-S3150C0045B033B9436AC3F303530F2B0CBF24252525AC
-S3150C0045C02C49FDF795F8236828461D7770BD2046C3
-S3150C0045D00421FFF7F7FE236805461868DDE7252555
-S3150C0045E0D4E725490022FDF7BDF8236883F8586007
-S3150C0045F005F0F2F800F2E9350EE005F0E3FA23686F
-S3150C0046009A79012A4FF4004116D0DA79012A13D08F
-S3150C0046101868FDF795F870B1FFF78CFE05F0DCF81D
-S3150C0046208542EAD22268002393712268D3712368EB
-S3150C0046302E251868BAE72368002199712368D97169
-S3150C00464023681868458EADB2002DAFD0FDF772F811
-S3150C004650236807491868FDF76DF820460621FFF711
-S3150C004660B1FE236825251868A0E700BF0000FF10DF
-S3150C0046700080FF000080FF10BEAF00082DE9F0415E
-S3150C00468004460068002580F851502568012068769C
-S3150C004690256882B0287616460D461F4605F09CF80E
-S3150C0046A000F2E93805F098F8804546D305F08AFA09
-S3150C0046B023681868426A9207F4D4426AD107F1D487
-S3150C0046C0426AD20759D42A7891063ED4697801F009
-S3150C0046D03F010D2940D002F00302032A35D0227A7D
-S3150C0046E042F010022272186832462946FDF73AF853
-S3150C0046F005F072F800F2E93604E005F063FA236877
-S3150C0047009A7932B9FFF716FE05F066F88642F4D2AE
-S3150C004710236800229A712368587E1C2831D00228FF
-S3150C00472025D02A78910644BF012283F851202046D1
-S3150C004730FFF716FF02B0BDE8F08123681868426ADD
-S3150C004740D207D1D42A789106C0D5426A92070AD5E7
-S3150C0047501B2002B0BDE8F081416A8907F8D402F04B
-S3150C0047600302032ABBD1227A42F02002B8E76A7808
-S3150C00477002F03F02082AD4D1DCE71A2002B0BDE8C9
-S3150C004780F08169780092019211F03F0230D00F2A25
-S3150C0047902ED01B681D690095A80101F03F01237AF4
-S3150C0047A047D5032945D043F008032372062F44D876
-S3150C0047B0DFE807F01E392E0420242000204B089930
-S3150C0047C01A6912020A601A695969120E42EA012222
-S3150C0047D008994A605A699969120E42EA01220899A7
-S3150C0047E08A609A69D969130E089A43EA0123936081
-S3150C0047F000209FE7089B00201D609BE702A8ABB238
-S3150C00480040F8043DFFF77AFE089B2D0C1D6091E7DE
-S3150C004810089B68461D60FFF771FE0028E8D020460D
-S3150C004820FFF74AFE86E7089B68461D60FFF766FEA3
-S3150C00483080E723F008032372B8E701207AE700BF6C
-S3150C00484000C0014870B584B003680F49B3F84C40FA
-S3150C00485004AD002345F8043D2404224600950123AB
-S3150C0048600646FFF70BFF60B9039B03F4E8535B0A9C
-S3150C004870042B06D000953046224604490223FFF746
-S3150C004880FDFE04B070BD00BFC0AF0008B6AF000897
-S3150C0048902DE9F0410446407A84B0000758BF49021E
-S3150C0048A04FF0000503AF039590461D4658BF4FEADF
-S3150C0048B0422800970A4620461C490123FFF7DEFED4
-S3150C0048C0064618B1304604B0BDE8F0810097424662
-S3150C0048D0204617490123FFF7D1FE06460028F1D1E1
-S3150C0048E002460223134900972046FFF7C7FE0646E9
-S3150C0048F004F072FF4FF47A7303FB0500451C04F0B9
-S3150C0049006BFF85420DD305F05DF923681B685A6A67
-S3150C0049109207F4D45B6ADB07D4D504F05DFF8542BD
-S3150C004920F1D22E26304604B0BDE8F081D6AF000891
-S3150C004930D8AF0008DAAF00082DE9F04104460D4661
-S3150C00494016461F4604F048FF00F2E93804E005F06D
-S3150C00495039F92368DA7932B9FFF7ECFC04F03CFF3D
-S3150C0049608045F4D223680022DA712368197E1E2949
-S3150C00497007D0012283F851202046BDE8F041FFF70D
-S3150C004980EFBDBFB113460AE0022E03D12268296897
-S3150C004990126811620133BB4205F104050AD0012EDF
-S3150C0049A0F2D1226812680133126A2A60BB4205F101
-S3150C0049B00405F4D10020BDE8F08100BF2DE9F047D5
-S3150C0049C00746006801248476787A86B04FF0000E8C
-S3150C0049D00E4601070E9D9DF83C80CDF808E0144666
-S3150C0049E09A4602D433685B0233603B6804941868B9
-S3150C0049F04FF40072222303A94FF0010903928DF89C
-S3150C004A0014308DF81590FCF7B3FE3B684FF08071AF
-S3150C004A101868FCF76DFE02A8326800904B465146AA
-S3150C004A203846FFF72BFE064670B914B910E0013C68
-S3150C004A300ED02946384642468023FFF77DFF05F502
-S3150C004A40007506460028F2D0304606B0BDE8F08761
-S3150C004A503846FFF731FD06460028F5D13B68DA7E6D
-S3150C004A60092AF1D11A680396928FD20718D51B7FA3
-S3150C004A70242BE9D103AB0093384611493246012366
-S3150C004A80FFF7FCFD0028DFD02528DDD038460421B1
-S3150C004A90FFF798FC0028D7D13B681B689B8FD3E7A0
-S3150C004AA038460221FFF78EFC0028CDD103AB0093CC
-S3150C004AB03846034932460123FFF7E0FDE4E700BF21
-S3150C004AC0BEAF00082DE9F0418846016886B0044661
-S3150C004AD01E4608689DF834700396002303A91546F4
-S3150C004AE002938DF814308DF81530FCF741FE02ABAD
-S3150C004AF02A460093414620460123FFF7BFFD054693
-S3150C004B0018B1284606B0BDE8F081F31C9B083A465E
-S3150C004B1020460C99FFF710FF05460028F1D104F04A
-S3150C004B205BFE00F2E93604E005F04CF823681A7ACD
-S3150C004B3032B9FFF7FFFB04F04FFE8642F4D223682E
-S3150C004B4000221A7223689A7E1F2ADAD00122204686
-S3150C004B5083F85120FFF704FD0546D2E738B5044625
-S3150C004B6088060D4632D4E90624D4AA0712D4EB07DC
-S3150C004B700ED523681C225A76236801211868FCF787
-S3150C004B80D9FD237A226823F0100301212372917137
-S3150C004B90002038BD23681F229A76236802211868E4
-S3150C004BA0FCF7C8FD237A226823F020030121237227
-S3150C004BB01172DCE723681E221A7623681021186806
-S3150C004BC0FCF7B8FD23680122DA71CEE723681E22B2
-S3150C004BD01A76236820211868FCF7ACFD236801229D
-S3150C004BE0DA71C0E738B503680446C8070D469980E4
-S3150C004BF000F18680A90772D46A075FD42B074CD4C0
-S3150C004C00E80639D4A90626D46A0613D4EB050FD5C3
-S3150C004C1023680922DA76237A226823F0300323727A
-S3150C004C2010684FF08071FCF785FD236801229A719C
-S3150C004C30012038BD236808221A76237A226823F0CD
-S3150C004C402003237210684FF48001FCF773FD236870
-S3150C004C500122DA71DAE7236807221A76237A2268A8
-S3150C004C6023F02003237210684FF40011FCF762FD49
-S3150C004C7023680122DA71C7E7236806221A76237A9B
-S3150C004C80226823F02003237210684FF48011FCF77E
-S3150C004C9051FD23680122DA71B4E7236805225A769E
-S3150C004CA0237A226823F01003237210684FF4002134
-S3150C004CB0FCF740FD236801229A71A1E723680422C0
-S3150C004CC05A76237A226823F01003237210684FF465
-S3150C004CD08021FCF72FFD236801229A718EE7236849
-S3150C004CE003225A76237A226823F010032372106863
-S3150C004CF04FF40031FCF71EFD236801229A717BE705
-S3150C004D00236802225A76237A226823F01003237230
-S3150C004D1010684FF48031FCF70DFD236801229A715F
-S3150C004D2068E700BF30B585B004AB0268002543F8D0
-S3150C004D30045DB2F84C2000930D4612040B49012376
-S3150C004D400446FFF79BFC38B9039B9B0106D42870DD
-S3150C004D50237A23F00803237205B030BD01232B7090
-S3150C004D60237A43F00803237205B030BDC0AF0008A8
-S3150C004D70F0B585B00F4616460546FFF763FD08B13C
-S3150C004D8005B0F0BD2B6827491A68938923F01003E8
-S3150C004D901B041B0C93817C78013424F0010403ABB7
-S3150C004DA002340093224628460123FFF767FC0028AD
-S3150C004DB0E6D102210246A3B20191009728461A4970
-S3150C004DC0FFF780FE2B681A68536A9907FCD403AB6D
-S3150C004DD000931449012328464FF40072FFF74EFC4A
-S3150C004DE02B6819684B6A9A07FCD44B6ADB07F9D413
-S3150C004DF00028C5D128460DF10B01FFF793FF0028BB
-S3150C004E00BED19DF80B30012B07D00BB11020B7E7A4
-S3150C004E10002E0CBF00201020B2E7012E0CBF002084
-S3150C004E201020ADE7C4AF0008DCAF0008007A00F034
-S3150C004E300F007047437A0B600020704703685B6A6B
-S3150C004E40C3F30B030B800268D38C926A43EA0243CA
-S3150C004E504B6003685B8D0B72036893F82F304B72B3
-S3150C004E600368DB8D8B720368DB6A1B0ACB720368E3
-S3150C004E70DB6A0B73036893F82B304B7303681B6B5D
-S3150C004E801B0A8B7303681B6BCB7303685B8E0B74EB
-S3150C004E900020704703681B6A0B600020704700BF38
-S3150C004EA030B4036853F8345F5C689868C1F809003D
-S3150C004EB0C1F80150C1F805404A1C99899B7B937334
-S3150C004EC09181002030BC704710B4437A03F0040380
-S3150C004ED085B003F0FF0203BB0368009253F8342F2E
-S3150C004EE0CDF801205A689B68CDF80520CDF809301D
-S3150C004EF0BDF808309DF807200198C3F309049309FF
-S3150C004F0043EA8403C0F3C2300230013383400020ED
-S3150C004F100B6005B05DF8044B7047006850F8344FD1
-S3150C004F204368CDF805309DF80830BDF8062080683A
-S3150C004F30CDF8090003F03F0342EA03430133002294
-S3150C004F409B02002000920B60CDF8014005B05DF885
-S3150C004F50044B704730B583B002AB002443F8044DC4
-S3150C004F600D4619461446FFF7AFFF20B9019B2C449A
-S3150C004F709C4288BF332003B030BD00BF4FF4007392
-S3150C004F800B800020704700BF10B4437A026803F010
-S3150C004F90040385B003F0FF04ABB952F8343F009418
-S3150C004FA0CDF801305368CDF80530BDF80430926861
-S3150C004FB0CDF80920C3F3C613013300200B6005B0EE
-S3150C004FC05DF8044B704752F8343F00245068009447
-S3150C004FD0CDF80500CDF80130E7E700BFF0B585B098
-S3150C004FE000230D4603930446FFF72CFC08B105B0CD
-S3150C004FF0F0BD23680F49B3F84C2003AB00931204A1
-S3150C00500020460123FFF73AFB0028F0D123680A4912
-S3150C0050101E68B3899BB223F0100343F010030127DB
-S3150C005020B3810246402320468DE8A000FFF74AFDD7
-S3150C00503005B0F0BDDEAF0008E4AF00082DE9F04383
-S3150C00504097B0044604F0C8FB00F2E93506E004F01C
-S3150C005050B9FD23681B689A8D900708D404F0BCFB35
-S3150C0050608542F4D22E25284617B0BDE8F0839A8DDA
-S3150C00507092B242F004029A8523681A6892F8293093
-S3150C00508043F0010382F82930236893F85A7027B14C
-S3150C0050900125284617B0BDE8F083B8460022134612
-S3150C0050A0B049CDF800802046FFF7E8FA054616AE63
-S3150C0050B0AD4920464FF4D5720623A946002D3FD1A3
-S3150C0050C046F8405D0096FFF7D9FA054650B9069B9F
-S3150C0050D0DAB2AA2A00F0E5805FB11925284617B086
-S3150C0050E0BDE8F08323685A7E022A04D047BB1928F0
-S3150C0050F026D10127D2E783F8509023689B49B3F851
-S3150C0051004C7016AB002243F8482D20463A460093C5
-S3150C0051100123FFF7B3FA236893F8502005460AB922
-S3150C005120122D00D065B9203300933A46204690499B
-S3150C0051300423FFF7A3FA1228054644D0002842D0D0
-S3150C0051402B2D90D1277A23688A49B3F84C803433B7
-S3150C0051504FEA0848002507F0080700934246204608
-S3150C0051600323FFB2039504950595FFF787FA10B94B
-S3150C005170002F00F0C6802046FFF764FB23681A68F0
-S3150C00518093899BB223F0100343F0100305469381D9
-S3150C005190002D7FF468AF04AB0093204676494FF49C
-S3150C0051A000720123FFF76AFA054600287FF45BAF0D
-S3150C0051B0002F7FD0236800250122284683F85A2029
-S3150C0051C017B0BDE8F08300222368069293F85020AE
-S3150C0051D06A4B002A0CBF4FF480189846332700966A
-S3150C0051E02046624900220123FFF748FA05460028AB
-S3150C0051F0A6D123685E4920330093204642460423F9
-S3150C005200FFF73CFA054608B1122899D104F0E4FAE6
-S3150C00521000F1150501E004F0D5FC04F0DDFA854239
-S3150C005220F9D8013F236802D01A6A002AD7DA93F814
-S3150C0052305020002A00F0C0801A6A12F0804F627A61
-S3150C00524014BF42F00C0242F0010262722433009346
-S3150C00525020464B4900220323FFF710FA0546002887
-S3150C0052607FF46EAF236847494C332A460093204699
-S3150C0052700523FFF703FA054600287FF461AF314694
-S3150C0052802046FFF74FFD054600287FF459AF9DF8E1
-S3150C0052901830012B00F0FC80277A07F0FC072772E8
-S3150C0052A051E7C3F30323012B7FF416AF226882F870
-S3150C0052B0503022E706AE002320460693FFF7C2FACB
-S3150C0052C0002861D023681B6893F8282002F0DD02C1
-S3150C0052D083F8282093F82820D2B283F8282040227D
-S3150C0052E03046002105F0BFFD236893F844201207D1
-S3150C0052F030D11A6892F8283003F0FB0382F8283074
-S3150C00530058E706AE39464022304605F0ACFD20463D
-S3150C0053103146FFF763FE054600287FF4A4AE069BD4
-S3150C005320C3F307421B0E53EA022303D0237A43F03E
-S3150C00533004032372637ADB0643D504AB0093204641
-S3150C0053400D494FF400720123FFF798F90546002822
-S3150C005350B1D088E62046FFF775FA002867D0236897
-S3150C005360C7E700BFACAF0008B8AF0008DEAF000857
-S3150C005370EAAF0008BAAF0008C4AF0008000010403E
-S3150C005380AEAF0008B0AF0008236840211868FCF7E0
-S3150C005390C5F9236893F84520510761D41B6893F827
-S3150C0053A0282002F0DD0283F8282093F8282042F00A
-S3150C0053B0020283F8282092E7627A42F002026272B5
-S3150C0053C044E72046FFF73EFA054600287FF44BAE2D
-S3150C0053D023683249B3F84C2003AB009348EA0242E7
-S3150C0053E020460123FFF74AF9054600287FF43BAE19
-S3150C0053F023682B49186883899BB223F0100343F06A
-S3150C005400100304AE4FF0010E83812A460823204672
-S3150C0054108DE84040FFF756FB2368054696E80300E7
-S3150C005420443383E80300002D7FF41DAEB3E601235D
-S3150C0054300193009620461B491B4A4023FFF742FB6B
-S3150C00544000288CD10A9B03F00F03012B87D123680C
-S3150C0054501A6892F8283043F0040382F82830A9E63B
-S3150C005460B3F84C200D490096120420460123FFF791
-S3150C00547005F900287FF426AF009620460B49022238
-S3150C0054800123FFF7FBF800287FF41CAF236885E7A0
-S3150C005490237A23F00303237254E600BFDEAF000821
-S3150C0054A0EEAF0008B4AF000801000080E2AF0008C0
-S3150C0054B02DE9F047354D06460F4690460FCD9AB06E
-S3150C0054C06C460FC40FCD0FC495E80300402284E848
-S3150C0054D003000AA8002105F0C6FC326801235376A6
-S3150C0054E03268137632689376337A58070BD50F20C9
-S3150C0054F033681A68536A9907FCD4536ADB07F9D4E4
-S3150C0055001AB0BDE8F08708F10104E41B22463046C8
-S3150C0055103946FFF71FFD0028EAD10AA93046FFF7E6
-S3150C0055205DFD0028E4D10C9A0D9BC2F303551AA914
-S3150C00553001EB8505110E55F8685CDAB242EA0122D8
-S3150C00554005FB02F5C3F3012AAC42C3F38523B3FB77
-S3150C005550F2F39A440DD2B946002CC9D049464246BC
-S3150C00556053463046FFF794F9C2E7641BA5424F46F3
-S3150C005570F2D807EB05094A46304639465346FFF73B
-S3150C00558087F90028F1D0B946E6E700BF84AF0008DA
-S3150C00559030B5027A02F0020283B002F0FF031AB1B0
-S3150C0055A00125284603B030BD02680A49B2F84C20E2
-S3150C0055B0009312040446FFF761F805460028F0D163
-S3150C0055C02046FEF7DFFE2368284683F85A5003B0C0
-S3150C0055D030BD00BFC2AF000810B50368044618689A
-S3150C0055E0FCF77AF80220FBF74DFA237A5A0604D414
-S3150C0055F02046BDE81040FEF705BF2046FEF7C2FE6A
-S3150C00560020460121FEF7DEFE237A5B06F0D52C2020
-S3150C00561010BD00BF2DE9F0410F46017ACE0784B0CC
-S3150C00562004460BD5036803201A68536A9907FCD401
-S3150C005630536ADB07F9D404B0BDE8F0810D0702D537
-S3150C00564003680520F0E71E46012E1546036810D0A8
-S3150C0056504FF0010883F819800368039283F81880C9
-S3150C005660036883F81A80036893F85A2042BB01201A
-S3150C005670DAE793F85A20002AF9D032462946FFF782
-S3150C00568069FC10BB637A1B49180723681868838961
-S3150C0056909BB223F0100343F0100358BF6D02012692
-S3150C0056A083812A462046009701964FF40073FFF734
-S3150C0056B009FA23680028B7D03328D8D10420B3E7D9
-S3150C0056C029463246FFF746FC08B12368F4E7226800
-S3150C0056D0094B1068818989B221F0100141F0100143
-S3150C0056E08181324620468DE8800103A9FFF766F9D1
-S3150C0056F0DFE700BFC6AF0008C8AF0008F0B50F461D
-S3150C005700017ACD0785B004460AD5036803201A68CA
-S3150C005710536A9907FCD4536ADB07F9D405B0F0BD7C
-S3150C0057200E0702D503680520F1E74D0712D4012BAD
-S3150C00573015461E4611D0026803950123537602685E
-S3150C005740137602689376036893F85A20002A2FD1B1
-S3150C0057500120DCE703680220D9E7036893F85A2096
-S3150C005760002AF5D032462946FFF7F4FB28BB637AAC
-S3150C0057701D49180723681868838923F010034FEA1C
-S3150C00578003434FEA134358BF6D02022683812A4610
-S3150C0057902046009701964FF40073FFF793F92368A0
-S3150C0057A00028B4D01E280AD03328D1D10420AEE765
-S3150C0057B029463246FFF7CEFB18B12368F2E70020E4
-S3150C0057C0A5E72268094B1068818921F010010904AC
-S3150C0057D0090C02258181324620460097019503A9C2
-S3150C0057E0FFF7ECF8DBE700BFCAAF0008CCAF000848
-S3150C0057F010B504460548FEF74FFB0CB1032010BD4F
-S3150C0058000248FEF761FB024B185C10BDF088FE1FC8
-S3150C00581004B0000808B10320704708B50248FEF72B
-S3150C00582077FB024B185C08BDF088FE1F04B000081D
-S3150C00583008B104207047002BFBD008B50348DBB237
-S3150C005840FEF74EFB024B185C08BD00BFF088FE1F2E
-S3150C005850FCAF000808B104207047002BFBD008B53C
-S3150C0058600348DBB2FEF748FB024B185C08BD00BFD1
-S3150C005870F088FE1FFCAF000808B10420704708B57D
-S3150C0058800248FEF74BFB024B185C08BDF088FE1F66
-S3150C005890FCAF0008013A0A44914230B416D20C46C9
-S3150C0058A02578637803EB05239BB2184480B28342B8
-S3150C0058B088BF013004F1020488BF80B2A242EFD83F
-S3150C0058C0CB43134423F0010302331944914201D014
-S3150C0058D030BC70470B781B02184480B2834284BFDD
-S3150C0058E0013080B230BC704738B50E4D6B7C2C7CC9
-S3150C0058F003EB0424A4B2A4F10E0005F11A0108224C
-S3150C00590080B2FFF7C7FFA4F1140292B205F122018F
-S3150C005910FFF7C0FF10B94FF6FF7038BD40BA80B222
-S3150C00592038BD00BFF0A2FE1F70B4C278134C0A44F7
-S3150C005930D2B2E27083780E0A3344DBB2A370457898
-S3150C0059406570007820709E4203D90135EDB2657002
-S3150C0059508DB1C9B28A420CDA0133DBB2A370074AA5
-S3150C0059603BB953780133DBB2537013B91378013357
-S3150C005970137070BC704701302070EAE720A2FE1F3E
-S3150C00598010B5094C2368014603F10800FFF7CCFF5C
-S3150C005990064A2368507814789178D2781C7258721B
-S3150C0059A09972DA7210BD00BF30A2FE1F20A2FE1F34
-S3150C0059B008B5002005491422FFF76CFF10B94FF605
-S3150C0059C0FF7008BD40BA80B208BD00BFFEA2FE1F24
-S3150C0059D0F0B4084A084F094E094D0A480121002324
-S3150C0059E04FF4806411703B807376AB800480F0BCFE
-S3150C0059F0704700BF008CFE1FE0A2FE1F34A2FE1FE4
-S3150C005A0034A9FE1FF48BFE1FF0B5164F164E3B88BD
-S3150C005A10B588864601339BB2B3F5FA4F5CBA0CD304
-S3150C005A204FF480531024A542F4D0104A3B8000203A
-S3150C005A30107025B101231370F0BDA4B2F3E7B48046
-S3150C005A40F180094BBEF1000F09D0BEF800201A8078
-S3150C005A50BEF802205A80402333720348F0BDC3F8C7
-S3150C005A6000E0F8E7F48BFE1F34A9FE1F008CFE1F26
-S3150C005A70074B084A198810B40024147021B101236D
-S3150C005A8013705DF8044B704718805DF8044B704733
-S3150C005A90E0A2FE1F008CFE1F2DE9F04F954E042848
-S3150C005AA085B031681BD0944B944A954C1C600328E6
-S3150C005AB0146062D0022800F0D180052800F0928193
-S3150C005AC0363CA17B452900F02D81DFF850928D4D97
-S3150C005AD000232B8089F8003005B0BDE8F08FDFF885
-S3150C005AE03C92884DDFF838A2BAF80030002BEFD084
-S3150C005AF085488649864C0968B0F800E047887E4E92
-S3150C005B0003F11C0292B2100A20746274087AA07512
-S3150C005B1008335BBA00204FF0110CE38484F817C0ED
-S3150C005B2084F8280084F829008B886384CB88A384A6
-S3150C005B30A4F81AE0A7830B88E38349882A8004F12A
-S3150C005B4036032184336073490B8801339BB20022E0
-S3150C005B501D0A4520E374A574A073E2736275227561
-S3150C005B60227662760B80FFF723FFC0432083002347
-S3150C005B7089F8003005B0BDE8F08F487E00F00F00C4
-S3150C005B800328A2D1088A00289FD18DE80E00DFF8E1
-S3150C005B908C915C4DDFF888A1082089F8000004F090
-S3150C005BA005FD9DE80E0099F8004004F0200000F079
-S3150C005BB0FF06002800F08B81554C534F002314220E
-S3150C005BC04B76AAF8003084F82F2028232B805023FC
-S3150C005BD084F82E300B7A84F82A304B7A84F82B30E2
-S3150C005BE08B7A84F82C30CB7A84F82D300B7B84F8A6
-S3150C005BF026304B7B84F827308B7B84F82830CB7B84
-S3150C005C0084F829300622E2758B886384CE887B88DB
-S3150C005C103888A6846083A3830B88E3834B8823840C
-S3150C005C20497E3B4BC90640F14C81002283F831205A
-S3150C005C3083F830202B8863741A0A402100232274BF
-S3150C005C40A17584F8353084F8343084F8323084F811
-S3150C005C503330FFF749FEC043608674E72E4CE0787C
-S3150C005C600130C0B2E07060B9A0780130C0B2A0704B
-S3150C005C7038B960780130C0B2607010B92078013044
-S3150C005C8020704C7E1F4DDFF898A004F0FD06002016
-S3150C005C90052E2880AAF8000000F0BD80002C00F02C
-S3150C005CA09E80088A002800F00381887E461E8E7628
-S3150C005CB0002840F09480C87E082800F04781661EB4
-S3150C005CC0012E40F2408104289CBF0326864004F036
-S3150C005CD00F0E94BFF6B2302601300EF1FF37C876A0
-S3150C005CE08E76072F7BD8DFE807F0BAA0C7BF7ABF3E
-S3150C005CF07ABF00BF30A2FE1F2CA2FE1F1CA2FE1FE5
-S3150C005D0026A3FE1F18A2FE1FECA2FE1F28A2FE1F32
-S3150C005D10F0A2FE1FEE8BFE1FF08BFE1F24A2FE1FB1
-S3150C005D2032A9FE1FBA4D94F810A0617C288801EBAD
-S3150C005D300A2A824553DC217D1FFA8AFA8F06A5F8BA
-S3150C005D4000A04CD194F81590B9F1000F47D1B14F82
-S3150C005D50B7F80080B8F1000F40F0CB8079880029A5
-S3150C005D6040F0C7808DE80C00FFF722FE01464FF687
-S3150C005D70FF7081429DE80C0031D1E07DDFF89CB2CA
-S3150C005D80062800F05781112800F0F780012826D14B
-S3150C005D909BF82230082B22D1BBF82430DFF89092E6
-S3150C005DA04FF6F67293424FF000018CBF093308335D
-S3150C005DB0A28B8BF82210ABF824307988638BA183E5
-S3150C005DC02284E383A4F81A80D1E6009B002B00F012
-S3150C005DD0C482072B00F0BE8201238BF80030DFF85B
-S3150C005DE0509275E68C490968898800293FF46DAE96
-S3150C005DF0DFF82CA2864DDFF8389200210C3C0820E7
-S3150C005E001C601460AAF800103160298089F8000023
-S3150C005E1000F0DCFF68E68B7E0133DBB2782B8B76E9
-S3150C005E20DDD14876DFF8089252E67C4C794F84F83F
-S3150C005E302FE04FF002084FF0040C06260A202C2205
-S3150C005E40602384F8368084F837C084F8386084F888
-S3150C005E5039002A8084F82E30DFF8D491BAE66F4CDC
-S3150C005E606C4F4FF0120EE2E7DFF8C4916B4C694FA2
-S3150C005E70112384F82F30A8E6DFF8B49104208DE8BE
-S3150C005E800E0089F8000004F091FB9DE80E00BAF8AC
-S3150C005E90000012681A60002848D00B8A002B45D0E7
-S3150C005EA05E4C5C4F283318222B8084F82F208EE60C
-S3150C005EB004F00F04032C92D18DE80E00DFF87091DC
-S3150C005EC06AE60A2183F8302083F83110B2E604F032
-S3150C005ED0100000F0FF07B8B1504CCE76012004221A
-S3150C005EE0112308824A76AAF800604A4F84F82F30AC
-S3150C005EF06BE6E18B494841457FF471AF008C79889C
-S3150C005F0088427FF46CAF2DE7BAF80000444E50B1CE
-S3150C005F10E4072CD50F824C8AA04288BFAAF8004011
-S3150C005F20BAF8000008820024CC76B2E799F8003063
-S3150C005F309C077FF5CDAD394C364F1022282384F8BB
-S3150C005F402F202B8043E605287FF4BDAE0023DFF817
-S3150C005F50E0904B76314C0091802389F8003004F0A8
-S3150C005F6025FB142384F82F302A4F00992DE60C8A32
-S3150C005F70002CD0D034802046D5E72A482649B0F8E4
-S3150C005F8004E00860AAF11C0AA5F800A0BEF1000FF7
-S3150C005F9003D0BBF82470774504D0234B0B60DFF895
-S3150C005FA0909095E5C78837B1BBF822E0BE4502D084
-S3150C005FB0B7F58A4FF1D10788DFF868E0F7B9BEF874
-S3150C005FC002E0BEF1000F08D0B4F81AE0134CBE453F
-S3150C005FD0E3D1A48B40888442DFD11449DFF850907A
-S3150C005FE0DFF83CA019600220002389F80000AAF80B
-S3150C005FF000303360116000F0E9FE75E54FF6FF7C6A
-S3150C0060006745E1D1BEF802E0BE45DDD1E5E700BF4C
-S3150C00601018A2FE1FECA2FE1F28A2FE1FF0A2FE1F56
-S3150C00602032A9FE1F34A9FE1F74A9FE1F1AA3FE1F58
-S3150C00603024A2FE1F8DE80E00FFF756FC0099019A6C
-S3150C006040029B88427FF4CBAEDFF8F48298F81910E5
-S3150C006050009129B1BBF824E0B8F80400864578D045
-S3150C00606094F82F30B44803F03F03022B5AD0DFF8D4
-S3150C006070D49294F82F20B04B50073FF529AD93F8E6
-S3150C0060802900DFF8C88293F82DA093F8266093F8C0
-S3150C0060902AC093F8281093F82CE093F8272083F85D
-S3150C0060A029A00130C0B24FF0140B4FF0280A88F823
-S3150C0060B0006083F826C04FF0500893F82BC083F885
-S3150C0060C02D0083F82A6083F82FB0A5F800A083F87A
-S3150C0060D02E8083F82C1083F828E083F82B2083F885
-S3150C0060E027C060B90131C9B283F82C1039B9013215
-S3150C0060F0D2B283F82B2012B9721C83F82A20DFF84F
-S3150C00610050C2638CB4F824E0668BA08B39887A88ED
-S3150C006110ACF80030A384A4F822E0E68320846183E3
-S3150C006120A28387E5854A838C1088DFF824A2DFF8E2
-S3150C0061301CB2AAF800304FF0000E83421A468BF8B8
-S3150C00614000E03FF442AE0123DFF8F8918BF8003003
-S3150C0061508FE7BBF822E0B8F80600864580D1BBF87D
-S3150C0061601AE0B8F8000086457FF47AAFBBF81CE05D
-S3150C006170B8F8020086457FF473AF9BF82F00DFF862
-S3150C006180C491C6F8008000F0040C4FF0000E0CF021
-S3150C006190FF01019189F800E0BCF1000F50D19BF88A
-S3150C0061A02EE00099DFF8A4B14FEA1E1E4FEA8E0EC0
-S3150C0061B0AAF1140CCEEB0C0C01F00F011FFA8CFC9F
-S3150C0061C00229A5F800C08BF800E012D0BCF1000F34
-S3150C0061D001D1810711D0B4F826A0B8F808C0DFF8B1
-S3150C0061E058E15749E24541D01023554984F82F30E0
-S3150C0061F0EBE400F03F011229E8D1C10604D5B8F84A
-S3150C0062001010DFF83CA1B9BB98F819E00EF00F019D
-S3150C006210013907293FF65CAC01A050F821F000BF0C
-S3150C006220876600080F6600080B650008CB6400083B
-S3150C0062306364000849640008E961000851620008BB
-S3150C006240202388F819E089F8003004F0AFF93FE410
-S3150C00625099F800203B4BD0077FF53AAC0021102271
-S3150C00626088F819101A7004F0A1F931E4BEF828E088
-S3150C00627049898E45B8D1C0E70AF10C000393029206
-S3150C006280FFF752FB304994F82AE00B7800937345DC
-S3150C006290029A039BB8D1284891F801C090F82BE0DC
-S3150C0062A0F445B1D190F82C0091F802E08645ABD1BB
-S3150C0062B02148C97890F82D008142A5D19AF81B0087
-S3150C0062C002908AF80F1002999DF800008AF80C00CB
-S3150C0062D08AF80DC08AF80EE011BB9AF818109AF8D5
-S3150C0062E01AE09AF81600CEEB0101A1EBD001C9B267
-S3150C0062F05FFA81FE1EF0800F08441CBF49425FFA0C
-S3150C00630081FE98F81710A1EB91017144C0B2C9B285
-S3150C0063108AF8160001EBD00088F8180088F81710D8
-S3150C006320012198F8180089F80010002188F81A0045
-S3150C006330A8F8101068E700BFF0A2FE1FE0A2FE1F2F
-S3150C00634034A2FE1F24A2FE1F20A2FE1F008CFE1FDD
-S3150C006350EC8BFE1F01238BF8003094F8223094F856
-S3150C00636023E0E17E009194F81DC0217FA07EC6F843
-S3150C006370008043EA0E2E009ED34BA8F8042041EA77
-S3150C0063800C21012293F801C0A8F806E040EA062089
-S3150C00639093F802E01E78A8F80210DB78A8F8000043
-S3150C0063A00321104688F80C6088F80DC000264FF0C3
-S3150C0063B0040C88F80EE088F80F3094F829E094F86D
-S3150C0063C0283088F81920A8F8102088F81A1094F8A4
-S3150C0063D0272088F8181094F8261088F817C088F823
-S3150C0063E00BE088F8166088F81B6088F80A3088F885
-S3150C0063F0092088F80810FFF7C3FA94F82E3003F03A
-S3150C006400F002502A40F2C481B0498BF800601A0998
-S3150C006410053A0B78920004EB09009145064680F28A
-S3150C006420B18190F83630002B00F0AC81012B00F0D6
-S3150C006430B281022B2ED096F83700002800F0A281EC
-S3150C00644081445FFA89F9E6E799F80030D8077FF5B9
-S3150C0064503FAB0722002388F8192088F81A30FFF77B
-S3150C00646037BB28889A4E002840F09A8194F82F3032
-S3150C006470DB077FF52DAB0722002388F81A300120A5
-S3150C00648088F81920FFF77CFA102389F8003004F0FD
-S3150C0064908DF8A9E690F837E0BEF1040FCBD190F851
-S3150C0064A0386090F839200B7042EA062240F20A63F3
-S3150C0064B0934228BF13468BF80090AAF80020A8F840
-S3150C0064C01230A8F814308349CBE4288808B1FFF7BA
-S3150C0064D057FA94F82F3013F0010300F08D8099F8D9
-S3150C0064E00030D90740F184800023072288F8192050
-S3150C0064F088F81A30A8F810300120FFF741FA10235B
-S3150C00650089F8003004F052F86EE694F82F10C8079C
-S3150C00651025D51EF0100F22D1B8F81030002B7FF4C1
-S3150C006520D7AA2888013080B2FFF72AFA99F80030EA
-S3150C0065302988694A43F0100089F8000011B143F02C
-S3150C0065401203137004F032F801200822002361496B
-S3150C006550A8F8100088F8192088F81B3088E48F06F4
-S3150C0065600BD594F8347094F8351018682E8841EAD7
-S3150C00657007210844711A18602980288870B11EF00A
-S3150C006580100F0BD199F8001041F002018DE80C00A8
-S3150C00659089F80010FFF7F4F99DE80C0094F83060C8
-S3150C0065A094F83110B8F81400DFF834A101EB062189
-S3150C0065B089B28142AAF8001000D809B9AAF80000DD
-S3150C0065C099F80010BAF80000A8F812008E073FF4EC
-S3150C0065D07FAADFF810A13F49029300200192009197
-S3150C0065E0AAF8000003F0E2FF9DE80E00FFF7DBBA05
-S3150C0065F0062388F819307FE799F80020D2075CD576
-S3150C0066000522A8F8103088F81920FFF761BA99F816
-S3150C0066100010C90706D594F82F10304801F03F0139
-S3150C006620122908D0202389F8003003F0BFFF336805
-S3150C00663000225A761DE590F82E1001F0F000502835
-S3150C0066406CD90E092149DDF804E00878053E0027CF
-S3150C006650B6008BF8007004EB0E07B645BC4680F20C
-S3150C006660888097F83600002800F08380012800F017
-S3150C0066708480022838D09CF83770002F79D0BE441D
-S3150C0066805FFA8EFEE7E799F800001349C0077FF51D
-S3150C0066901FAA288803274026002488F819700E7034
-S3150C0066A0A8F81040002894D042248DE80C000C70F9
-S3150C0066B0FFF766F99DE80C008BE72B88002B7FF41F
-S3150C0066C093ADFFF705BA00BFF08BFE1F018CFE1FC2
-S3150C0066D018A2FE1F34A2FE1F24A2FE1FF0A2FE1F4C
-S3150C0066E0EC8BFE1F32A9FE1F97F837A0BAF1040FE8
-S3150C0066F0C1D1F44697F838E097F83970087040F233
-S3150C0067000A6147EA0E202D4E8BF800C0814228BF45
-S3150C00671001463080A8F81210A8F8141094F826E058
-S3150C00672094F8291094F8277094F8286088F808E0F3
-S3150C006730032088F8190088F80B100120DFF884A0D4
-S3150C00674088F8097088F80A6002930192FFF718F925
-S3150C00675000214220AAF80010A8F810102980184928
-S3150C006760009189F8000003F021FF9DE80E00FFF769
-S3150C0067701ABA08708BF800E0D0E70EF1010E5FFA3A
-S3150C0067808EFE68E70B708BF800900D49FFF769BB1E
-S3150C0067900B49FFF766BB09F101095FFA89F93AE67D
-S3150C0067A0FFF7EEF894F82F30DB073FF564AE33882D
-S3150C0067B0002B7FF419ADFFF78BB900BFEC8BFE1FD6
-S3150C0067C034A2FE1F32A9FE1F40BA80B2704700BF2A
-S3150C0067D00A1E034609DD0548054900680A808342FE
-S3150C0067E003D0194692B204F033BB70471CA2FE1FAD
-S3150C0067F032A9FE1F3A4B00222DE9F0439F8BB3F8CA
-S3150C0068001EE0384E384B154605E008290A4603F1BA
-S3150C0068100C03CDB21BD033F8020C511C0028F4D05B
-S3150C0068201C88002CF1D0B842EFD17445EDD12F4B1A
-S3150C0068302F49304F08688C883978357002EB420244
-S3150C00684003EB8202506014819172BDE8F083274DF0
-S3150C00685000222F462B461988501C1C4609B959880C
-S3150C006860C1B3C2B2082A03F10C03F4D1214BDFF8F1
-S3150C0068708C9093F800C0DFF888804FF0000E7046BD
-S3150C00688072467146AB7AC3EB0C038B42D4B202F15F
-S3150C0068900102C4BFD8B2A646082A05F10C0501466A
-S3150C0068A0F0D10EEB4E0489F8000088F800E086F86B
-S3150C0068B000E007EB8404104923460A46086843F8AF
-S3150C0068C0040B52F8060D606092889A8084F80AC010
-S3150C0068D0BDE8F083074B327093F800C0EBE700BFBE
-S3150C0068E0F0A2FE1F028CFE1F068CFE1F048CFE1FE0
-S3150C0068F006A3FE1F658CFE1F0CA3FE1F038CFE1F3A
-S3150C006900648CFE1F70B4154A154C15781549013563
-S3150C006910EDB2002315701E4604E0082B237001F11E
-S3150C0069200C0119D048880A880243013392B2DBB2B3
-S3150C006930002AF2D08A7AAA1A772AEEDD0A46082BA2
-S3150C00694002F8016B02F101024E7002F8016B237022
-S3150C006950167001F10C01E5D170BC7047658CFE1FF9
-S3150C006960028CFE1F048CFE1F2DE9F047304C238849
-S3150C006970292B12D92F4DAB8A0026B3F5807F2680A2
-S3150C00698004D0B3F5007F0CD0BDE8F0872A4FEA8C13
-S3150C0069903B889A4212D0BDE8F08700232380BDE8DD
-S3150C0069A0F087254BE98C1A889142F4D12A8D5B88A5
-S3150C0069B09A42F0D1BDE8F047FFF71CBF2A8D7B88C1
-S3150C0069C09A42E8D1FFF716FF2B4602226A7553F856
-S3150C0069D016CF1A4AB3F804E010689188C5F820C09F
-S3150C0069E0A5F824E0C5F81600B5F824909980D5F8DA
-S3150C0069F020A0B5F81C80B5F81EC0B7F800E02E75BF
-S3150C006A007F88C5F80600082606222A236981A5F880
-S3150C006A100490C5F800A0A5F82680A5F828C0A5F80E
-S3150C006A201CE0EF832E736A732380BDE8F08700BFEA
-S3150C006A3018A2FE1FF0A2FE1FECA2FE1FF88BFE1F73
-S3150C006A402DE9F84F4D4EF18B4FF6FF738DB29D42EB
-S3150C006A5000F08980DFF84881494AB8F80030108880
-S3150C006A606B40034274D0474B474F1D885B887B8035
-S3150C006A703D80DFF830E17888444B002404E0CCB24A
-S3150C006A80082C03F10C031FD01A88AA4204F1010149
-S3150C006A90F5D15A888242F2D153F8040F8EF8004091
-S3150C006AA09B883060B3803A4A3A4913883A4C086856
-S3150C006AB08D88C6F806000E33A580002008211380A9
-S3150C006AC070733173BDE8F88FFF2106222B488EF8C0
-S3150C006AD0004004F0C8F92F4B2F4A798898881F6814
-S3150C006AE034730023DFF8C0A0DFF8A490F584347467
-S3150C006AF006250424B8F800C0B8F802E0318502F186
-S3150C006B00300B01214FF02A08C6F80670C6F816702D
-S3150C006B109080908286F8203086F8213086F82230D4
-S3150C006B2086F8233086F8243086F82530B574F4744C
-S3150C006B30CAF800B0A9F800803375B3737374A6F85D
-S3150C006B401CC0A6F81EE07175F1737573BDE8F88F5D
-S3150C006B50308CB8F8023052884340134283D10A4F26
-S3150C006B603980788085E7338CAB427FF473AF0B4B5F
-S3150C006B7018689B883060B38095E700BFF0A2FE1FB3
-S3150C006B80E8A2FE1FE4A2FE1F688CFE1F048CFE1FEB
-S3150C006B9018A2FE1FF88BFE1FF6A2FE1F08B00008F7
-S3150C006BA0ECA2FE1F028CFE1F2CA2FE1F10B541602C
-S3150C006BB00446F9F715FD206010BD00BF10B504465C
-S3150C006BC0F9F70EFD23686268C01A9042B4BF002024
-S3150C006BD0012010BDF8B501221D4B0270044642700F
-S3150C006BE098691C491C4AA0700025E5700868126853
-S3150C006BF06060E26025746574A574E5742575657529
-S3150C006C00A575E57525766576A576E5769E69596949
-S3150C006C10258180273246678104F11C0004F018F99F
-S3150C006C20A019C6F1100229461C3004F01CF929469D
-S3150C006C30402204F12C0004F016F929463A4604F1D8
-S3150C006C406C0004F010F9054B1868C4F8EC00F8BD9C
-S3150C006C506C8CFE1F10B00008ECA2FE1F14B00008CE
-S3150C006C60F8B5174D2C682046FFF7B4FF154B2A686C
-S3150C006C70D869C4F8F500586AC4F8FB0004234FF031
-S3150C006C80010E032736263225FF204FF0350C04F56E
-S3150C006C90807184F8FF0084F8F0C084F8F1E084F881
-S3150C006CA0F27084F8F36084F8F95084F8F43084F8C0
-S3150C006CB0FA30891A1046BDE8F840FFF789BD00BFC7
-S3150C006CC02CA2FE1F6C8CFE1FF8B52D4B1D682B7865
-S3150C006CD0022B01D00020F8BD281D2A49042204F0FD
-S3150C006CE0A7F804460028F5D1274E05F11C00B26919
-S3150C006CF0716904F09DF8024608B12046F8BD234B95
-S3150C006D0028691C88706205F1F0031C44A34223D247
-S3150C006D1006F1200C06F11C0E06F1300706F12C05C7
-S3150C006D2028360DE0032927D0062921D0012902D1C6
-S3150C006D30D3F802003060597802310B449C420BD9CF
-S3150C006D40197833290FD0EDD9362907D0FF2903D06E
-S3150C006D503529F0D19A78EEE71046F8BDD3F8020043
-S3150C006D60CEF80000E7E7D3F80200CCF80000E2E723
-S3150C006D70D3F802002860DEE7D3F802003860DAE7C1
-S3150C006D802CA2FE1F10B000086C8CFE1F18A2FE1F52
-S3150C006D9010B50D4C82B04FF6FF7300226061A161F5
-S3150C006DA001A84FF48641A270ADF80430ADF8063058
-S3150C006DB0FEF72AFE606010B14FF4884383800023EF
-S3150C006DC0238002B010BD00BF6C8CFE1FF8B5934C2F
-S3150C006DD02388B3F5937F41D030D9B3F5AB7F00F060
-S3150C006DE0B18040F2A880B3F5B57F00F09D8040F2EB
-S3150C006DF06B12934240F09C80894D2B789A0740F198
-S3150C006E00F880FFF761FF052800F0B5802369834AF7
-S3150C006E1042F210718B4200F38B80917803F57A73F2
-S3150C006E200329136100F0A980FFF71AFF7D48216939
-S3150C006E30FFF7BCFE4FF4B5732380F8BD40F20F127A
-S3150C006E4093422BD0B3F5887FC0F08D8029D040F2C9
-S3150C006E50251293426CD14FF493732380704D2B788B
-S3150C006E60980740F1D080FFF72FFF052800F08380AC
-S3150C006E7023696A4A42F210718B4259DC917803F508
-S3150C006E807A730329136178D0FFF7EAFE6548216906
-S3150C006E90FFF78CFE40F225132380F8BD4FF4887360
-S3150C006EA023805F4D2B789E0740F19980FFF70CFFEE
-S3150C006EB0022800F08F802369584A4EF65F218B42D8
-S3150C006EC0DCBF5B001361A378022B00F08480564E66
-S3150C006ED035682846FFF77EFE3068012303224FF003
-S3150C006EE0350C4FF0370E0627FF2605F1F90185F80C
-S3150C006EF0F13085F8F23085F8F530091A85F8F0C0CE
-S3150C006F0085F8F3E085F8F42085F8F62085F8F77017
-S3150C006F1085F8F860FFF75CFC42482169FFF746FEEE
-S3150C006F2040F20F132380F8BD40F26B13238063E706
-S3150C006F3000232380F8BD40F255129342F8D14FF44A
-S3150C006F40AB732380354D05F10800FFF737FE48B1CA
-S3150C006F50364B002202204FF47A711A805A80A870A0
-S3150C006F60296161E7F8BD002BE2D101224FF47A7357
-S3150C006F70A2702361ABE70323A3702D4B2B492D4A3B
-S3150C006F80608EB4F824C0B4F826E05880668D258E41
-S3150C006F90278D208CA1F800C0A1F802E056801D8038
-S3150C006FA01780FFF711FC0504608C1C4EFFF70CFCD8
-S3150C006FB028434FF47A73410803FB01F10029B8BF4B
-S3150C006FC06FF0004117483161FFF7F0FD40F25513A1
-S3150C006FD02380F8BDA0704FF47A73236154E71148EF
-S3150C006FE0FFF7ECFD0028BDD02B789D077FF563AF2E
-S3150C006FF05CE70C48FFF7E2FD0028B3D02B789B0723
-S3150C0070007FF504AFFDE60748FFF7D8FD0028A9D0A9
-S3150C0070102B7899073FF527AF2AE700BF6C8CFE1F2C
-S3150C00702024A2FE1F748CFE1F2CA2FE1FECA2FE1FB8
-S3150C007030E4A2FE1FE8A2FE1F024B00221A805A8011
-S3150C007040704700BFECA2FE1F7F2811D989B910B476
-S3150C0070500D4B01E0802915D033F8022F82428CB2F9
-S3150C00706001F10101F6D104F1800080B25DF8044B08
-S3150C0070707047FF2804D8054B803833F8100070474A
-S3150C007080002070470020F1E716B0000818B0000881
-S3150C00709070B4234B234AB0F5805F28BF13460433E4
-S3150C0070A00BE088420ED333F8022CD4B20D19A84249
-S3150C0070B04FEA122208DB04337AB133F8041C1E465D
-S3150C0070C00029EED170BC7047082AFBD8DFE802F025
-S3150C0070D00C1016191C1F2225080006EB4403DEE7CC
-S3150C0070E0A0F5E35080B2EDE7411A33F81100E9E759
-S3150C0070F0411A01F00103C01A80B2E3E7103880B2DE
-S3150C007100E0E7203880B2DDE7303880B2DAE71A38AB
-S3150C00711080B2D7E7083080B2D4E7503880B2D1E7D6
-S3150C007120D4B1000818B100080168C9B110B40C78C4
-S3150C0071301F2C09D93A2C0ED00A4601E03A2B07D05F
-S3150C00714012F8013F1F2BF9D800205DF8044B70474D
-S3150C0071504B1C9A4207D04FF0FF305DF8044B70473A
-S3150C0071604FF0FF307047302CF5D102310160002012
-S3150C007170EBE700BF10B5044682B018B103680BB13B
-S3150C0071801A7822B900230B60092002B010BDD888EA
-S3150C007190A2889042F6D158780191FEF73BFB10F08D
-S3150C0071A001000199EED123680B60EEE70A44013821
-S3150C0071B011F8013B00F8013F9142F9D1704700BF2D
-S3150C0071C0F8B5C46A00F130070546224640783946C0
-S3150C0071D00123FEF73FFBB0B92A6AAB69E870A21A25
-S3150C0071E09A420ED2AE78012E01D80AE0AB696878C5
-S3150C0071F01C44013E224639460123FEF72BFB012E89
-S3150C007200F4D10020F8BD0120F8BD00BF38B5C36A23
-S3150C0072108B4204460D4616D0C3787BB92A46607855
-S3150C00722004F130010123FEF703FB002818BF4FF0D1
-S3150C007230FF35E5620CBF0020012038BDFFF7C0FF0B
-S3150C0072400028EBD038BD002038BD00BF2DE9F84F23
-S3150C007250C378054663B92B78032B0FD000216878C9
-S3150C0072600A46FEF709FB003018BF0120BDE8F88F6F
-S3150C007270FFF7A6FF0028EED0BDE8F88F2B79012B7F
-S3150C007280ECD105F130010B4605F50C70002203F824
-S3150C007290012B83424FF00004F9D12B69E868EA69A7
-S3150C0072A085F818321F0A1E0C1B0E4FF0520E4FEAB1
-S3150C0072B0102A4FEA10494FEA106801324FF0550C6C
-S3150C0072C085F8197285F81A626127412685F81B32F2
-S3150C0072D04FF0AA0B722385F81C0285F8143285F838
-S3150C0072E0153285F81DA285F81E9285F81F82EA6272
-S3150C0072F085F82EC285F82FB285F830E085F831E096
-S3150C00730085F8327085F8177285F8336085F8166241
-S3150C00731068780123FEF79EFA2C719FE700224FF046
-S3150C007320FF3370B5C270C3620446FFF76FFF08B136
-S3150C007330042070BD94F82F1294F82E324AF655227A
-S3150C00734043EA0123934201D0032070BD94F869608F
-S3150C00735094F8683094F8671094F866200F4D43EA59
-S3150C007360062341EA032342EA032323F07F43AB427D
-S3150C007370EBD094F8850094F8843094F8831094F844
-S3150C007380822043EA002341EA032342EA032323F043
-S3150C0073907F43AB4214BF0220002070BD464154000F
-S3150C0073A0F0B5002385B00B600F461446FFF7BCFE04
-S3150C0073B0061E18DBC44B53F82650BDB13D602B7826
-S3150C0073C004F0FE0423B16878FEF724FAC70710D53B
-S3150C0073D0F0B2002368702B70FEF70AFAC60713D5B5
-S3150C0073E0032005B0F0BD0B2005B0F0BD0C2005B098
-S3150C0073F0F0BD002C00F0F18000F0040303F0FF0058
-S3150C007400002BEED00A20ECE70CB14107FAD4284643
-S3150C0074100021FFF783FF022807D004284FF000064F
-S3150C00742027D001282DD90D20DBE76C4668462B4664
-S3150C00743005F1400793F8F2216AB193F8F9E193F854
-S3150C007440F82193F8F76193F8F61142EA0E2246EA10
-S3150C007450022241EA02221033BB4240F8042BE9D146
-S3150C00746004AF54F8046B36B90320BC42F9D1042896
-S3150C007470D9D10120B5E728463146FFF74FFF012841
-S3150C007480F3D895F83C2095F83B3043EA0223B3F544
-S3150C007490007FC8D195F8471095F8463053EA01237A
-S3150C0074A040F09D8095F8570095F8562095F8553084
-S3150C0074B095F8541042EA002243EA022341EA0321DA
-S3150C0074C095F84040A961631E012BAC70ABD895F8BA
-S3150C0074D03D309AB26A81002AA5D05A1E1A42A2D110
-S3150C0074E095F8412095F8420042EA002002072881CF
-S3150C0074F099D195F8447095F8432052EA07220DD19C
-S3150C00750095F853C095F852E095F8517095F85020BF
-S3150C0075104EEA0C2E47EA0E2742EA072295F83FE080
-S3150C00752095F83E7057EA0E2E3FF47DAF04FB01F43E
-S3150C0075300EEB10172744BA42FFF475AFD21BB2FB01
-S3150C007540F3F3002B3FF46FAF40F6F572934240F223
-S3150C007550C1804FF6F572934240F29A8095F85BC063
-S3150C00756095F85A40EE6106EB0E02023337442A6256
-S3150C00757054EA0C226B61AF627FF455AF00287FF49E
-S3150C00758052AF95F85F7095F85E4095F85D0095F8EA
-S3150C0075905C2044EA07249B0040EA042003F2FF1314
-S3150C0075A042EA0022B1EB532F6A62FFF43CAF95F826
-S3150C0075B0611095F8603043EA01234FF0FF328021C9
-S3150C0075C0012B2A61EA6029710BD003233F4A2B70E9
-S3150C0075D0138801339BB21380EB80002001E7194618
-S3150C0075E06EE7711C2846FFF711FE0028EDD195F8C1
-S3150C0075F02F2295F82E3243EA02234AF65522002111
-S3150C00760093422971E1D195F8334095F8321095F8EB
-S3150C007610312095F830302E4841EA042142EA012205
-S3150C00762043EA02238342D0D195F8174295F81612F5
-S3150C00763095F8152295F8143200F1FF5041EA042111
-S3150C00764000F5005042EA0122203043EA022383422D
-S3150C007650BBD195F81BE295F81A6295F81F7295F84E
-S3150C0076601E4295F8190295F81D1295F8182295F8F0
-S3150C0076701C3246EA0E2644EA072440EA062041EA72
-S3150C007680042142EA002243EA01232A61EB609CE7CB
-S3150C007690023306EB0E0237446B612A62AF62EE616F
-S3150C0076A000283FF4C0AE5B0003F2FF132244B1EB9B
-S3150C0076B0532F6A62FFF4B7AE4FF0FF3380222B6173
-S3150C0076C0EB602A71022381E7A48EFE1FA08EFE1F9B
-S3150C0076D052526141023306EB0E0237446B612A6249
-S3150C0076E0AF62EE6100283FF49EAE03F0010000F29B
-S3150C0076F0FF1003EB430300EB53032244B1EB532F70
-S3150C0077006A62FFF490AE4FF0FF3380222B61EB6080
-S3150C0077102A7101235AE700BF012919D942699142FE
-S3150C007720F8B508D20278022A07460C462ED0032A50
-S3150C00773010D0012A01D00120F8BD016A04EB5405D2
-S3150C00774001EB5521FFF762FD90B34FF0FF30F8BD0A
-S3150C00775001207047016A01EBD411FFF757FD002891
-S3150C007760F3D1A10001F4FE7101F130033B4439441D
-S3150C007770DC7898785A7891F8303040EA042042EA5E
-S3150C007780002043EA002020F07040F8BD016A01EBAE
-S3150C0077901421FFF73BFD0028D7D1610001F4FF71DE
-S3150C0077A07B1893F8302093F8310042EA0020F8BD9C
-S3150C0077B0C5F30803396A6E1C3B4401EB5621384667
-S3150C0077C093F83050FFF722FD0028BED1C6F3080609
-S3150C0077D0BB1993F83000E30745EA00204CBF0009BB
-S3150C0077E0C0F30B00F8BD00BFB1F5001F2DE9F04149
-S3150C0077F005460C46066802D30220BDE8F08111F05E
-S3150C0078001F08F9D18168046129B93378022B1AD97A
-S3150C007810736AC3B1194677897F02BC422AD3E41B2B
-S3150C007820304608E00128E7D973699842E4D2A742AA
-S3150C00783021D82868E41BFFF76FFF431C0146F1D1E2
-S3150C0078400120BDE8F0813389B3EB541FD4D9D6F8A7
-S3150C0078502480C5F818806961B8F1000FCCD0C4F348
-S3150C0078600803303308EB54241E44EE61AC6100204F
-S3150C007870BDE8F0817369023B8A1E9A4204D2B6F8BF
-S3150C0078800A80B36A08FB0238C5F81880E3E700BF24
-S3150C0078902DE9F04790F80090B9F1020F05460C4619
-S3150C0078A0174658D0B9F1030F30D0B9F1010F03D0F8
-S3150C0078B002263046BDE8F087016A04EB540801EB5A
-S3150C0078C05821FFF7A3FC06460028F2D108F1010A5D
-S3150C0078D0E307C8F30808A84454D598F83020296A59
-S3150C0078E0FBB202F00F0242EA031388F8303001EBC8
-S3150C0078F05A2185F803902846FFF788FC00284CD1BE
-S3150C007900CAF3080AAA44C7F3071752E0016A01EB47
-S3150C007910D411FFF77BFC06460028CAD1A40004F458
-S3150C007920FE7404F130032B4427F07047DA78120604
-S3150C00793002F0704217432C44380C4FEA172E390EBE
-S3150C007940012284F83070987083F801E0D970EA70DF
-S3150C0079503046BDE8F087016A01EB1421FFF756FCAF
-S3150C00796006460028A5D1640004F4FF742919C7F350
-S3150C0079700722012381F8307081F83120EB703046F4
-S3150C007980BDE8F087296A88F8307001EB5A2185F832
-S3150C00799003902846FFF73AFC08B1064689E7CAF376
-S3150C0079A0080AAA44C7F303279AF8303023F00F03CA
-S3150C0079B01F4301238AF83070EB707AE72DE9F0410A
-S3150C0079C007468846066839BBF5687369EDB9012523
-S3150C0079D02C4606E0012816D0431C14D0AC4218D015
-S3150C0079E0736901349C4202D3012D12D902243868E2
-S3150C0079F02146FFF791FE0028ECD1012C02D97369C0
-S3150C007A00A3421BD80120BDE8F0819D4228BF012569
-S3150C007A10DEE70020BDE8F0813046FFF77DFE012849
-S3150C007A20F0D9421C06D073699842ECD34546CFE791
-S3150C007A300128E7D14FF0FF30BDE8F08130462146F2
-S3150C007A404FF0FF32FFF724FF0028F1D1B8F1000FF9
-S3150C007A500CD0B8F1010FD5D973699845D2D24146ED
-S3150C007A6030462246FFF714FF0028E1D172693369CC
-S3150C007A70F460023A934201D2013B3361337943F00D
-S3150C007A80010333712046BDE8F08100BF2DE9F04FAC
-S3150C007A9083690768026983B01BB9042003B0BDE88B
-S3150C007AA0F08F02F12005B5F5001FF6D2C5F30802DA
-S3150C007AB00E4604461ABB41690133836129B37B899F
-S3150C007AC0013B13EA55281AD138460192FFF724FEDA
-S3150C007AD001288146019A20D9B0F1FF3F31D07B694C
-S3150C007AE098421CD2861E023B9E42C4F8149004D2C5
-S3150C007AF0B7F80A80BB6A08FB0638C4F8188030321F
-S3150C007B001744E76125610020C8E73B89B3EB551F95
-S3150C007B10F5D80023A3610420C0E70220BEE7002E9F
-S3150C007B20F7D0204661690192FFF748FF019A81461A
-S3150C007B3048B90720B2E738460192FFF741FB019A94
-S3150C007B4048B10120AAE70128E7D0B0F1FF3FF8D0F1
-S3150C007B50FB78002BEFD107F1300307F50C700021F1
-S3150C007B6003F8011B8342FBD17B697989023BA9F19E
-S3150C007B7002069E4236BFBB6A002301FB0633FB623C
-S3150C007B804FF0000A4FF0010B0DE087F803B001929D
-S3150C007B90FFF716FB0028D4D1FB6A7989019A0133C9
-S3150C007BA00AF1010AFB628A453846EED3F96A7B690B
-S3150C007BB0CAEB0101F96296E7416A4B1C2DE9F041CB
-S3150C007BC004460568066906D0FFF70EFE034610B19B
-S3150C007BD01846BDE8F0814FF0E50801270BE0E26995
-S3150C007BE082F80080EF70226996422046F0D9FFF7A2
-S3150C007BF04DFF034638B9A1692846FFF707FB034634
-S3150C007C0001460028EBD0042B08BF02231846BDE81A
-S3150C007C10F08100BF2DE9F04F002187B00746D0F860
-S3150C007C200080FFF7E1FD002851D14FF0FF334FF0F4
-S3150C007C30FF0ADFF890B17B62994656460AE00F2B95
-S3150C007C4048D0C7F82490FF2638460021FFF71EFFC0
-S3150C007C5000283CD14046B969FFF7D8FA002836D13E
-S3150C007C60FC692578002D00F08D80E27AE52D02F076
-S3150C007C703F03BB71E5D01007E1D40F2B2AD076B9A0
-S3150C007C8004F10B00214611F8012BF30143EA5606C9
-S3150C007C9052FA86F68142F6B2F5D1B24576D0396AF9
-S3150C007CA0CB7ADB07CDD40846237810F80B2B0131A1
-S3150C007CB09B1A0134002BC4D111F8012B14F8013B8B
-S3150C007CC08142A3EB0203F5D1002BBAD1184607B0BB
-S3150C007CD0BDE8F08FBB6A002BB6D069064ED53A6963
-S3150C007CE094F80DA07A6205F0BF0594F80DC0D44542
-S3150C007CF046D1E17EA27E52EA01223CD12178304A5D
-S3150C007D00CDF8088001F03F01013901EB410A01EB86
-S3150C007D108A0A4FF0010E0193049705952746CDF874
-S3150C007D200CC0D0467346144610E0B8F1FE0F1DD8B1
-S3150C007D30FFF7AEF9019B054633F81800FFF7A8F9D3
-S3150C007D40854213D13346D0465C4521D014F8010B3D
-S3150C007D503E18385C767840EA062608F1010A304669
-S3150C007D60002BE2D14FF6FF729642EDD0DDF808807B
-S3150C007D70DDF80CC0049FE246FF2665E7AE42B4D0A0
-S3150C007D80FF2661E7042007B0BDE8F08F00209EE7D0
-S3150C007D903C46C2462278059DDDF80CC0DDF808800D
-S3150C007DA0049F52069E46019B06D5BEF1000F03D0DA
-S3150C007DB033F81A30002BDED1013DEEB2E24643E732
-S3150C007DC05CB4000869B400082DE9F04FD0F8209097
-S3150C007DD0076899F80B30866A13F0A00389B003D0B4
-S3150C007DE0062009B0BDE8F08F358835B11D463346FF
-S3150C007DF033F8022F0135002AFAD10C2204464946E3
-S3150C007E0005A8FFF7D3F99DF81F30DA0776D50023BE
-S3150C007E1089F80B304846A36205A90B224FF00108DE
-S3150C007E20FFF7C4F943460DF1140E072203F00F00B9
-S3150C007E3000F13001392988BF00F137011B0902F125
-S3150C007E40FF320EF8011DF1D108A911447E2001F86C
-S3150C007E50140C002A00F0A58099F80010202908D0EF
-S3150C007E60494603E011F8010F202802D00133934252
-S3150C007E70F8D109EB030108A81044072A03F1010302
-S3150C007E8096BF10F8140C20200132072B01F8010BB9
-S3150C007E90F1D92046FFF7BEFE30BB08F10108B8F158
-S3150C007EA0640F00F0EB80484605A90B22FFF77EF91C
-S3150C007EB0B8F1050F16D9A6F1020E43463EF8022F6D
-S3150C007EC0002AB0D0102102F0010000EB4303D803C6
-S3150C007ED044BF83F4883383F0210301394FEA5202FD
-S3150C007EE0F1D1EBE743469EE704287FF47AAF9DF881
-S3150C007EF01F3089F80B309DF81F30A6629B0742D4C1
-S3150C007F00012620460021D4F80080FFF76DFC0246BE
-S3150C007F1000283FD1054605E01546FFF7B7FD02469A
-S3150C007F20002837D1A1694046FFF770F901210246B6
-S3150C007F300D4478BBE3691B78E52B204601D0002B5A
-S3150C007F40EAD1AE42E9D1731E01932CD13846A16910
-S3150C007F50FFF75CF900287FF444AFE36903F12002D4
-S3150C007F6003F8010B9342FBD1E069216A0B22FFF760
-S3150C007F701DF9236AE169DB7A012203F018030B73FE
-S3150C007F800020FA702DE7404E0C35A6FB0536B608D8
-S3150C007F900136B6E7042A08BF0722104609B0BDE829
-S3150C007FA0F08F134665E72169019B2046A1EB43112F
-S3150C007FB0FFF71AFC02460028EFD1216A134601F19D
-S3150C007FC00B0011F8015BDA0142EA530355FA83F30D
-S3150C007FD08142DBB2F5D1DFF8B8801E463846A1697E
-S3150C007FE0FFF714F90346002B4AD19DF804A0E56966
-S3150C007FF0D4F82890254A6E730AF1FF3101EB410043
-S3150C00800001EB80010F20E8722B73AB76EB764FF603
-S3150C008010FF7C4FF0FF0B0EE039F811302B5428443F
-S3150C0080204FEA132E013180F801E00BB94FF6FF73BE
-S3150C008030013242450BD063451078EDD105EB000EAD
-S3150C0080400132424505F800B08EF801B0F3D14FF677
-S3150C008050FF72934202D039F811300BB94AF0400A3C
-S3150C008060012385F800A02046FB700021FFF70EFDCA
-S3150C00807030B9019B013B0193B0D167E70720B0E60D
-S3150C008080024610468AE700BF4FECC44E5CB40008AB
-S3150C00809069B400080129F8B507460E46046802D9EA
-S3150C0080A06369994201D30220F8BD62B1012AFAD95B
-S3150C0080B09342F8D9114620464FF0FF32FFF7E8FB02
-S3150C0080C050BB386815E0204613E0314620460022A6
-S3150C0080D0FFF7DEFB08BB23695A1C05D02279013356
-S3150C0080E042F001022361227163699D4211D2386804
-S3150C0080F02E463146FFF710FB054650B10128D2D06B
-S3150C008100411C08D0012ECED963699E42DDD30220D4
-S3150C008110F8BD0020F8BD0120F8BDF8BD2DE9F04FE3
-S3150C008120D0F800B085B080460C4611F8013B2F2BD9
-S3150C008130FAD05C2BF8D00021C8F8081020781F283C
-S3150C00814040F24581009180B21F28D8F8285030D9CA
-S3150C0081502F282ED05C282CD00121A5F10209274608
-S3150C0081600126FEF771FF00B37F2809D822281CD000
-S3150C008170A64A01E0984218D012F8013F002BF9D11B
-S3150C00818029F8020F17F8010F1F2806F1010312D95F
-S3150C0081902F2810D05C280ED0B3F5807F05D0012196
-S3150C0081A01E46FEF751FF0028DED1062005B0BDE8BD
-S3150C0081B0F08F0026012323441A782F2A1F4603F139
-S3150C0081C00103F9D05C2AF7D0202834BF4FF0040AFB
-S3150C0081D04FF0000A3C464EB105EB460232F8023D22
-S3150C0081E0202B01D02E2B04D1013EF7D100232B805E
-S3150C0081F0DBE7D8F82030BDF8002025F8162003F16F
-S3150C0082000B0005EB4602202103F8011B8342FBD130
-S3150C008210AB1E4FF0000901E009F1010933F8020F1A
-S3150C0082202028F9D02E28F7D0B9F1000F01D04AF04A
-S3150C008230030A134633F8022D2E2A01D0013EF9D13A
-S3150C008240002213464FF0080C3A4627462C461D468C
-S3150C00825009F1010978B320281FD02E281BD06545BB
-S3150C00826020D24E4572D07F287AD82B2800F08D80EC
-S3150C008270DFF8A0E102E0884200F087801EF8011FBB
-S3150C0082800029F8D1A0F14101192900F2AA8043F086
-S3150C0082900203C0B27CE04E4558D04AF0030A34F8CB
-S3150C0082A01900D5E7BCF10B0F7AD04E4551D0B1452C
-S3150C0082B04AF0030A4DD93C461746D8F820201178C7
-S3150C0082C0E52978D0BCF1080F04BF9B00DBB203F0A4
-S3150C0082D00C010C2961D003F0030003285DD01AF0C1
-S3150C0082E0020F09D103F00303012B08BF4AF0100A51
-S3150C0082F0042908BF4AF0080A82F80BA04046FFF78B
-S3150C00830089FCD8F82030DB7A002874D15A073FF55F
-S3150C0083104DAF98F80630DB0655D5D8F810309BF8DB
-S3150C0083200010C3F3080330335B440329D87E9A7ECE
-S3150C00833042EA002203D0C8F80820387803E7597DB2
-S3150C0083401B7D43EA012342EA0342F4E7BCF10B0F1F
-S3150C00835026D09B00DBB2B1464FF00B0C08259EE7EE
-S3150C0083600021CDF80CC002920193FEF76DFE019B25
-S3150C008370029ADDF80CC018B3254908444AF0020AE3
-S3150C00838010F8800C00287FF470AF4AF0030A5F20C7
-S3150C008390D8F820104855013581E74AF0020A9EE7C5
-S3150C0083A03C461746D8F820201178E5294AF0030AEE
-S3150C0083B08DD14FF00B0C05211170D8F8202081E7D8
-S3150C0083C04AF0020AE1E7052005B0BDE8F08FD8F8BF
-S3150C0083D0203080224046DA7205B0BDE8F04FFFF738
-S3150C0083E003BAA0F16101192997BF2038C0B2C0B2F7
-S3150C0083F043F00103CCE704287FF4D8AE13F0040F46
-S3150C00840008BF052005B0BDE8F08F00BFC8B3000853
-S3150C008410DCB30008D4B300082DE9F843436A0133F2
-S3150C00842006460C461AD0836A18889D1C90B103F533
-S3150C008430007901F11508002707E04D450AD008F828
-S3150C008440010F35F8020B013728B10021FEF7FCFDB0
-S3150C0084500028F2D1002727440023BB750021A57DF7
-S3150C0084600B464FF02E0EF269D25C202A03F1010363
-S3150C0084701AD0052A08BFE522092B3DD06018427296
-S3150C0084808DB9A2F14107192F0CD8F769082B3F7B40
-S3150C0084908CBF4FF0100C4FF0080C1CEA070F1CBFDA
-S3150C0084A02032D2B2827501310B2BDCD135B963186F
-S3150C0084B09D75F3691B7B002B08BF0021214400230B
-S3150C0084C04B72F369DB7A2372F369DD7F9A7F587FEF
-S3150C0084D0197F42EA052240EA022241EA0222226080
-S3150C0084E0597E1A7E42EA0122A280DA7D9B7D43EAFE
-S3150C0084F00223E380BDE8F88360180DB980F816E016
-S3150C00850080F809E00131B9E72DE9F047FF27044669
-S3150C0085100668DFF818813D46042006E0FF25204654
-S3150C0085200021FFF7B3FA002855D1A169002956D0CE
-S3150C0085303046FEF76BFE00284DD1E1690A78002A19
-S3150C00854048D0CB7AE52A03F03F03A371E6D02E2A56
-S3150C008550E4D023F0200EBEF1080FDFD00F2B42D152
-S3150C008560500634D523694F7B636202F0BF0591F840
-S3150C0085700DE0BE45D2D1CA7E8B7ED4F828C053EA14
-S3150C008580022321D10B78284A03F03F03013B03EB6E
-S3150C008590430003EB800001274FF6FF7907E0FE2826
-S3150C0085A012D82CF810301F460130424530D012F844
-S3150C0085B0013B01EB030ACB5C9AF801A043EA0A23C0
-S3150C0085C0002FECD14B45F0D07746FF25A7E7AA4202
-S3150C0085D0A4D1CCE704200023A361BDE8F0870028D2
-S3150C0085E0F9D1BDE8F08775B901F10B06034611F810
-S3150C0085F0015BDA0142EA530355FA83F3B142DBB26B
-S3150C008600F5D19F42EDD04FF0FF336362BDE8F087A2
-S3150C0086100B785B0604D5FE28D6D800232CF8103030
-S3150C008620013DEDB277467AE75CB4000869B4000800
-S3150C00863010B584B004AB019043F8041D18460091A4
-S3150C0086401446FEF771FD002810DB0F4951F8203057
-S3150C0086500BB100221A70019B5BB10022012C1A701F
-S3150C00866041F8203009D0104604B010BD0B2004B0E0
-S3150C00867010BD41F820301846F6E7684601A9FEF70A
-S3150C0086808FFE04B010BD00BFA48EFE1FF0B593B0D4
-S3150C008690019168B1002302F01F06044615460360DB
-S3150C0086A0324601A803A9FEF77BFE20B113B0F0BD3C
-S3150C0086B0092013B0F0BD039A564B079207A804AADB
-S3150C0086C001990F921193FFF729FDB0B90F9B93F9FE
-S3150C0086D00B30002B7EDB15F01C0F69D19DF8223078
-S3150C0086E0D90679D4AA0701D5DB076AD405F00803A5
-S3150C0086F0DBB2039D002B39D13AE015F01C0FD5D017
-S3150C0087000428D3D107A8FFF75FFB46F0080600281C
-S3150C008710CCD1300762D50E9B039D002248216120E7
-S3150C0087209A73DA73597418740E9B9A75DA755976AE
-S3150C00873018760E9B2022DA720E9B2A78DF7E997EA3
-S3150C008740032A41EA07275DD000229A76DA76297841
-S3150C008750032904BF1A755A750E9B002201211A773C
-S3150C0087605A779A77DA77E970002F39D146F02006D6
-S3150C008770EA6A0E9B226263622978D87E9A7E032966
-S3150C00878042EA00221FD0A260987FDF7F597F1A7FB2
-S3150C008790267440EA0723002041EA0323607442EA68
-S3150C0087A00323EA88A280E36025606061E0617DE7CF
-S3150C0087B09DF8223013F0110F03D16D07A9D50820AF
-S3150C0087C074E7072072E7587D197D41EA002142EAD9
-S3150C0087D00142D8E7062069E7042067E7039DC7E74F
-S3150C0087E007A83946ED6AFFF755FC00287FF45EAF03
-S3150C0087F029460398FEF70AFD039D013FEF6000280A
-S3150C008800B4D053E7597D1A7D42EA012247EA024762
-S3150C0088109AE700BFA08CFE1F2DE9F04F1E4683B0D1
-S3150C00882000230F46336001A914460546FEF7A2FC49
-S3150C00883028B9687C18B92B7CD80703D4072003B059
-S3150C008840BDE8F08F6B69EA68C3EB0209A14528BF46
-S3150C008850A14605F12808B9F1000F3DD0C3F3080174
-S3150C008860002957D10199B1F80AA00AF1FF3A1AEA80
-S3150C008870532A5BD0A8694B690238023B98426ED2E8
-S3150C0088804B898C6A03FB0040002868D05FEA592BA1
-S3150C00889000EB0A0422D00AEB0B029A4288BFCAEB01
-S3150C0088A0030B4878224639465B46FCF7C1FF002885
-S3150C0088B045D12B7C5A0603D5E869001B834546D85F
-S3150C0088C04FEA4B246B69326823442244B9EB040902
-S3150C0088D06B6127443260C1D10020B0E7EA69A2423D
-S3150C0088E014D02B7C5B060AD5487801234146FCF74D
-S3150C0088F0B1FF20BB2B7C019923F040032B744878E5
-S3150C008900224641460123FCF793FFC0B96969EC6125
-S3150C008910C1F30801C1F500744C4528BF4C462831FB
-S3150C008920294422463846FEF741FCCBE753B9A868E2
-S3150C008930012814D9411C02D00199A8619BE701209A
-S3150C00894068747CE72868A969FEF7E6FEF0E707EB92
-S3150C008950402041464FF40072FEF728FCB0E7022097
-S3150C00896068746CE72DE9F04F1F4683B000238846E8
-S3150C0089703B6001A916460446FEF7FCFB28B9607C51
-S3150C00898018B9227C910703D4072003B0BDE8F08FF9
-S3150C0089906369DE4228BFDE43002E00F0878004F1B7
-S3150C0089A028094DE0019AB2F80AA00AF1FF3A1AEA30
-S3150C0089B0532A0ED1002B72D1A06800287BD0012837
-S3150C0089C000F09780421C67D0A368A061019A03B996
-S3150C0089D0A060237C5B0652D4A3695169023B023921
-S3150C0089E08B4280F086805089956A03FB0053002BDE
-S3150C0089F07FD05FEA562B0AEB030535D00AEB0B0347
-S3150C008A00834288BFCAEB000B414650785B462A4628
-S3150C008A10FCF720FF00283FD1E169491B8B455CD848
-S3150C008A204FEA4B256369E1683A682B44994238BF93
-S3150C008A3019462A44761B6361E160A8443A6034D037
-S3150C008A40C3F308000028ADD0C0F50075B54228BFA9
-S3150C008A503546283020442A464146FEF7A7FB237CA0
-S3150C008A6043F040032374DDE7E3696069AB4202D04F
-S3150C008A70E368984227D3E561C0F30800E4E7507831
-S3150C008A80E26949460123FCF7E5FE28B9237C019AE5
-S3150C008A9023F0400323749FE70120607475E720469A
-S3150C008AA0A169FEF78BFF002889D1227C42F02002B7
-S3150C008AB02274002069E720465146FEF77FFF002806
-S3150C008AC07FF47DAFF1E7507849462A460123FCF73F
-S3150C008AD0AFFE0028E0D16069CDE708EB412148469E
-S3150C008AE04FF40072FEF762FB237C23F040032374E1
-S3150C008AF096E70220607448E770B50A2982B00E46E4
-S3150C008B0005461AD06A68002A08DBAB18541C3C2CA4
-S3150C008B101E7305DCAB686C600133AB6002B070BDD4
-S3150C008B202946224601AB51F80C0BFFF71BFF019BA4
-S3150C008B30E41A18BF4FF0FF34ECE70D21FFF7DCFF0A
-S3150C008B40E0E700BFF0B583B001A90446FEF712FBBF
-S3150C008B50002848D1227C02F0200303F0FF00002BF2
-S3150C008B6041D053060DD5019BE269587804F12801D2
-S3150C008B700123FCF76FFE002837D1237C23F040033A
-S3150C008B8023740198216AFEF741FB60BB636ADA7AAB
-S3150C008B9042F02002DA72A26821689A76C2F30720A4
-S3150C008BA0D8760978032922D0E268019D1A7700212C
-S3150C008BB04FEA122C4FEA124E4820120E612701265C
-S3150C008BC0587683F81DC083F81EE0DA779975D97547
-S3150C008BD09974D9741F762846EE70FEF737FB237C02
-S3150C008BE023F02003237403B0F0BD0120FBE7120C25
-S3150C008BF0110A1A755975D7E710B582B00446FFF7F6
-S3150C008C00A1FF08B102B010BD204601A9FEF7B2FAC9
-S3150C008C100028F7D1206002B010BD00BF70B582B03D
-S3150C008C200D4601A90446FEF7A5FA002842D1607C40
-S3150C008C3000283FD1E368AB4204D2227C12F0020F2B
-S3150C008C4008BF1D46002263696261002D34D0019A6B
-S3150C008C50568976023BB1013B6A1EB3FBF6F1B2FBB9
-S3150C008C60F6F28A425DD2A268002A65D0A26132BBB6
-S3150C008C7061691546C1F30803002B68D0E269AA4264
-S3150C008C8065D0237C5B063DD404F12806019B314656
-S3150C008C9058782A460123FCF7CBFD00283BD16169A5
-S3150C008CA0E368E56199426CD9237CE16043F02003CB
-S3150C008CB02374002002B070BD284602B070BDB542C8
-S3150C008CC013D847E0FEF77AFE0246002841D0511C25
-S3150C008CD021D0012A22D9019B5B699A421ED2636973
-S3150C008CE0A2613344AE42636135D2237C9B07204696
-S3150C008CF01146A5EB0605E5D411462068FEF70CFDDA
-S3150C008D000246E4E7019B04F1280658783146012314
-S3150C008D10FCF7A0FD58B101206074CBE7022060740B
-S3150C008D20C8E7724213406361ED1AA2699FE7237C80
-S3150C008D3023F040032374A9E711462046FEF73EFEB6
-S3150C008D4001280246EAD0411CE5D0A0608EE7E36814
-S3150C008D50A8E7354663695919C5F30803616173B110
-S3150C008D60019E7069931E02388342D7D27089B26A0B
-S3150C008D7000FB0323002BD1D003EB55257AE71D46C8
-S3150C008D8078E7002096E700BF30B591B010AB0D46E2
-S3150C008D9043F83C0D05A918460022FEF701FB0446D4
-S3150C008DA010B1204611B030BD02AA0F4B01990D929D
-S3150C008DB005A80F93FFF7B2F904460028F1D10D9BD5
-S3150C008DC093F90B30002B0ADB002DEAD00B9BA87510
-S3150C008DD0002BE6D005A82946FFF71EFBE1E7062483
-S3150C008DE0204611B030BD00BFA08CFE1F30B59DB023
-S3150C008DF01CAB022243F86C0D02A91846FEF7D0FAFA
-S3150C008E00029B0693024610B110461DB030BD03AA54
-S3150C008E10264B01990E9206A81093FFF77FF902468E
-S3150C008E200028F1D10E9B93F90B30002B05DB9DF836
-S3150C008E301E30DA0703D50722E6E70622E4E7029D91
-S3150C008E400D9A2978D47E907E032940EA042405D114
-S3150C008E50517D127D42EA012244EA0244DB060BD420
-S3150C008E6006A8FEF7A9FE02460028CDD1B4B9029891
-S3150C008E70FEF7ECF90246C7E711A8002111951394E9
-S3150C008E80FEF7B2FC02460028BED111A8FFF73CFB48
-S3150C008E9002460028CFD00428E2D0B5E706A8214622
-S3150C008EA0FFF7F8F802460028AED1E0E7A08CFE1FCB
-S3150C008EB02DE9F041804682B017464E1E0546002429
-S3150C008EC0B442384669464FF0010201AB0EDAFFF7A1
-S3150C008ED0A3FC019B012B09D19DF800300D2BEFD083
-S3150C008EE00A2B05F8013B04F10104E9D1002C4FF0E3
-S3150C008EF0000314BF404618462B7002B0BDE8F08143
-S3150C008F0010B594B0027801910023044602930393A2
-S3150C008F1052B1114601A8FFF7EFFD14F8012F002AF4
-S3150C008F20F7D1029A002A0CDB019804A96B46FFF7CD
-S3150C008F3019FD30B9029A009B9A4202D1039814B0DB
-S3150C008F4010BD4FF0FF3014B010BD00BF72B67047A5
-S3150C008F5062B67047F0B55448544D85B0F8F76CF8C6
-S3150C008F60F7F760FDA842044600F29380640000F017
-S3150C008F7029FEAC42FAD94E4D4B484E4E22460121A3
-S3150C008F80F8F788F828464FF4FA52012301A9019400
-S3150C008F900296ADF80C20ADF80E30F7F7B9FF2B683A
-S3150C008FA0454A464CD079916843F040032B60022623
-S3150C008FB02B6866F38710D071506843F001032B6061
-S3150C008FC040F2E173E568146063F31C0063F31C0163
-S3150C008FD0060E0B0E43F0200345F000556FF34516B5
-S3150C008FE00827E56050609160D671D372177302F151
-S3150C008FF00F0302F11700002103F8011F8342FBD176
-S3150C00900001242D481476F8F787F8214626480022C5
-S3150C009010F8F704F82A4A2B4BD1799468136002208E
-S3150C00902060F38711D1715568D96840F2676060F3B7
-S3150C0090301C0560F31C04200E2E0E40F020006FF36E
-S3150C0090404516082741F0005194605560D072D671D0
-S3150C009050177302F11704D960002002F10F0303F80D
-S3150C009060010FA3424FF00001F9D115481176F8F71C
-S3150C00907053F801210A460C48F7F7D0FF0C4B1A6837
-S3150C00908022F040021A601A6822F001021A6005B03A
-S3150C009090F0BD0D4DA8427FF66EAF640800F092FD50
-S3150C0090A0AC42FAD867E700BF00400148FF1AB70088
-S3150C0090B00043014820A10700A88EFE1F005001485E
-S3150C0090C0C88EFE1F20500148000E270738B5144CD9
-S3150C0090D0217359B1013950FA81F104F10F030138AA
-S3150C0090E010F8012F03F8012F8842F9D10C48F8F734
-S3150C0090F05BF823680A480222DA61F8F75DF800F09B
-S3150C0091006BFB00F1320505E000F05CFD00F064FB42
-S3150C009110854203D32368DB699B07F5D438BD00BFB2
-S3150C009120A88EFE1F70B5124C2368DB6913F0010381
-S3150C00913001D1184670BD054620460E46F8F74CF888
-S3150C00914088B9237B3370237B6BB10346E218591C19
-S3150C009150127CEA54227BCBB29A42F7D823680122BE
-S3150C009160DA61012070BD23680122DA61002070BD2E
-S3150C009170C88EFE1FFFF7EABE10B500F013FAA0B1B9
-S3150C00918001F046FC88B100F0BBFC00F00FFB00F0D0
-S3150C0091900BFA084B20F0604020F07F00186000F0BE
-S3150C0091A003FA4468FFF7D4FEA047BDE8104000F070
-S3150C0091B0FBBC00BF08ED00E070B5561EB6B252B14E
-S3150C0091C00D460644441E15F8013B04F8013F00F019
-S3150C0091D0F9FCB442F7D170BD2DE9F0410E4F0646AD
-S3150C0091E03C4607F19C08002500F0ECFC2368B342D2
-S3150C0091F003D8626813449E4207D30C34444505F1E8
-S3150C0092000105F1D1FF20BDE8F08105EB450507EB23
-S3150C0092108505287ABDE8F0816CB400082DE9F84381
-S3150C00922005460068FFF7D8FFFF2830D06FF003061D
-S3150C009230761B05F1040805F2044700F0C3FC2B6805
-S3150C00924006EB0800C41800F0C7FA414600F10D09F8
-S3150C0092502046F7F71BFB05E000F0BEFA814516D356
-S3150C00926000F0B0FCF7F70AFBC307F5D4F7F706FBDB
-S3150C00927030F010030BD14346E01A08F5807801E074
-S3150C009280434507D0C15C13F8012B9142F8D000205E
-S3150C009290BDE8F8839F4202D10120BDE8F8839846C9
-S3150C0092A0CBE700BF38B5104B984204460D4618D094
-S3150C0092B00E4A914207D0FFF7B1FF10B1C5F309036F
-S3150C0092C013B1002038BD1C4623689D4207D02046AA
-S3150C0092D0294640F8045B4FF48062FFF76DFF204689
-S3150C0092E038BD034CEAE700BFE88EFE1F00C0000C39
-S3150C0092F0EC92FE1F2DE9F8430C46016824F47F79A5
-S3150C0093001D464B1C0746164629F0030932D08945E3
-S3150C00931006D038464946FFF7C5FF074638B30168FD
-S3150C009320641A3C44043409F5806907F1040805E025
-S3150C00933016F8013B04F8013B013D15D000F042FC48
-S3150C009340C8EB0403B3F5806FF2D338464946FFF7F2
-S3150C009350A9FF074658B100F10408444616F8013B2C
-S3150C00936004F8013B013DE9D10120BDE8F88300205A
-S3150C009370BDE8F8838046494648F8049B4FF4806262
-S3150C0093804046FFF719FF3968C1E700BF0349044A95
-S3150C0093904FF0FF330B601360704700BFEC92FE1F5B
-S3150C0093A0E88EFE1F030E2DE9F041082B0E461549DB
-S3150C0093B0044608BF00F18064751E091B8D421746D2
-S3150C0093C002D90020BDE8F0812046FFF705FFFF28F3
-S3150C0093D0F7D06019FFF700FFFF28F2D00A4A24F4F1
-S3150C0093E07F7323F00303934221463A46334604D057
-S3150C0093F00648BDE8F041FFF77DBF0548BDE8F041E2
-S3150C009400FFF778BFFFFF1F0C00C0000CEC92FE1F8D
-S3150C009410E88EFE1F030E082B294B2DE9F04105465D
-S3150C00942008BF00F180654C1E5B1B9C4202D90020D4
-S3150C009430BDE8F0812846FFF7CFFE06462819FFF750
-S3150C009440CBFE86420746F2D8F31EDBB2FB2BEED8D8
-S3150C0094500F28ECD8DFF86C801A4D00F0B3FB002413
-S3150C00946002E001340D2CE2D000F0ACFB2B7AB342B7
-S3150C00947005F10C05F5D104EB440458F824506A1C8C
-S3150C009480D5D000F0A9F900F5CE5428460834F7F7E4
-S3150C00949027FA05E000F0A0F98442C8D300F092FB4D
-S3150C0094A0F7F7ECF9C307F5D4F7F7E8F930F0200332
-S3150C0094B0BDD10136F6B2B742CED20120BDE8F0815D
-S3150C0094C0FFFF1F0C6CB40008104B1A6801321AD03F
-S3150C0094D0F0B5D3F808E05F68DE681D695C699969C8
-S3150C0094E0DA690B480EEB070333442B44234483B051
-S3150C0094F00B44134402AADB4342F8043D0421FFF754
-S3150C00950051FF03B0F0BD0120704700BFE88EFE1F6F
-S3150C00951000C2000C0D490E4B0E4A1B689068F0B445
-S3150C0095200F6815688C680C4E3B4410312B44103276
-S3150C00953023440968126803440B4430681344DB4324
-S3150C009540181AF0BCB0FA80F04009704704C0000C41
-S3150C00955000C0000C08C0000C00C2000C0A4808B57C
-S3150C0095600368013302D0FFF759FE58B10748036868
-S3150C009570013305D0FFF752FE003018BF012008BD9D
-S3150C009580012008BD08BD00BFE88EFE1FEC92FE1F31
-S3150C0095900048704700C0000CFFF7F8BEFFF702BF8B
-S3150C0095A0FFF738BFFFF7B6BFFFF7F2BF08B5FFF7F7
-S3150C0095B08BFF00B908BDBDE80840FFF7CFBF00BF61
-S3150C0095C070B5144DD5F81431DB0401D5002070BDEF
-S3150C0095D001462846F8F726F900F0FEF800F10A06CF
-S3150C0095E005E000F0EFFA00F0F7F886420BD3D5F859
-S3150C0095F0143113F48074F4D0064B4FF480720120AE
-S3150C009600C3F8182170BD034B4FF480722046C3F883
-S3150C009610182170BD00000340F0B5164C85B001252D
-S3150C0096204FF4614E082320462A461027002601A92E
-S3150C009630CDF804E08DF809308DF80A308DF80B5012
-S3150C0096408DF80C70ADF80E60F8F7AEF8204639467A
-S3150C0096502B460422F8F7ACF92B4620463146042259
-S3150C009660F8F7BCF9236C23F00F0343F002032364D1
-S3150C00967005B0F0BD00000340812938B50D460446FF
-S3150C0096801ED82846FFF79CFF012803D00F487E21E1
-S3150C00969000F052F9ADB295B1013D14FA85F5013CD5
-S3150C0096A000F090FA14F8010FFFF78AFF01284FF02B
-S3150C0096B08701064801D000F03FF9AC42F0D138BD25
-S3150C0096C002487A2100F038F9DBE700BF08B500083C
-S3150C0096D02DE9F843254D2C7844B92548D0F814319A
-S3150C0096E01B0730D500242046BDE8F8838046204869
-S3150C0096F0204ED0F8143196F8009013F008040BD0D5
-S3150C00970000F06AF81C4B1B6864339842EAD90024B3
-S3150C0097102C702046BDE8F8830F46F8F795F81749E4
-S3150C00972033788944013389F801000A78DBB29A420E
-S3150C0097303370D7D140460131FFF73EFD33782C709C
-S3150C0097403B700124CFE7F8F77FF8C0B2431E0B4AF3
-S3150C009750DBB2802B1070C5D800F03EF8064B054ADC
-S3150C0097601860012314702B70BDE700BFF096FE1F26
-S3150C009770000003407897FE1F7C97FE1FF496FE1F91
-S3150C009780074B084910B40022074C1A6005205A6092
-S3150C0097909A605C609A605DF8044B18600A607047CA
-S3150C0097A010E000E08097FE1F7F320200024B002281
-S3150C0097B01A605A609A60704710E000E0044B1B6810
-S3150C0097C0DB0303D5034A136801331360704700BFEC
-S3150C0097D010E000E08097FE1F044B1B6813F4803FDB
-S3150C0097E0034B18681CBF01301860704710E000E08E
-S3150C0097F08097FE1F10B504460020F9F7D3FB48B13D
-S3150C009800214600200122F9F7D9FBA0F10100B0FA9C
-S3150C00981080F0400910BD00BF08B50020F8F7DCF950
-S3150C00982000F0CCF8B0F5FA6F00D308BD4FF4FA602F
-S3150C009830BDE8084000F0BCB8F8F7B8B910B582B06E
-S3150C0098403F298DF8071004461ED800200DF107019C
-S3150C0098500122F9F7C5FB012803D00E48792100F047
-S3150C0098606BF8214600209DF80720F9F7B9FB9DF807
-S3150C0098700730984203D007487C2100F05DF80020A1
-S3150C009880F9F7C8FB02B010BD0248752100F054F878
-S3150C009890DBE700BF44B500082DE9F84380461D4DB3
-S3150C0098A000200F46F9F778FF4FF0FF300021F8F74C
-S3150C0098B0A3FB2C784CB9184E3046FFF79BFF0128BA
-S3150C0098C020D000242046BDE8F883144EDFF84890DB
-S3150C0098D0307801304844FFF78DFF01280446F0D15B
-S3150C0098E0337899F800200133DBB29A423370E8D111
-S3150C0098F0404609F10101FFF75FFC33783B7000230A
-S3150C0099002B70DFE73378013B3E2BDAD8034B2870FC
-S3150C0099101C70D7E7C597FE1F8497FE1FC497FE1FC2
-S3150C009920012001F087B800BF002001F083B800BF0A
-S3150C00993001F082B801F082B808B500F043F9FCE7F3
-S3150C00994010B500F029F9012806D000F0B5F918B1C8
-S3150C0099500C4C2378012B00D010BDFFF73DFF0A4AB3
-S3150C0099600A4B12681B68134403F5FA739842F3D337
-S3150C0099700023237000F0A8F90028EDD1BDE81040B3
-S3150C009980FFF7FABBCC97FE1FC897FE1FD097FE1F9A
-S3150C00999008B5054B01221A70FFF71EFF034B186022
-S3150C0099A0BDE80840FFF7CCBFCC97FE1FD097FE1F33
-S3150C0099B0014B1860704700BFC897FE1F014B186813
-S3150C0099C0704700BFC897FE1F08B5054B1B78012BC7
-S3150C0099D000D008BDFFF700FF024B186008BD00BFA2
-S3150C0099E0CC97FE1FD097FE1F08B5FFF7C3FB00F000
-S3150C0099F0E7F8FFF7C5FEFFF7CFFD00F043F900F0DF
-S3150C009A0013F8BDE80840FFF7C3BF00BF08B500F068
-S3150C009A10D9F8FFF7D3FE00F061FA00F019F8BDE8AB
-S3150C009A200840FFF78DBF00BF10B5084C00F014FEC0
-S3150C009A30FFF790FA01232370FFF7EEFD0023237046
-S3150C009A40FFF7EAFE0223237010BD00BF0089FE1F3C
-S3150C009A5000B583B00DF107012748FFF763FB01281A
-S3150C009A60034622D024480DF10701FFF731FE0128E9
-S3150C009A7029D021480DF10701FFF70EFF012831D03F
-S3150C009A800DF107011C4800F005FD012802D003B0BA
-S3150C009A905DF804FB194B18489DF8071003221A7041
-S3150C009AA000F0FEFD03B05DF804FB144A12489DF865
-S3150C009AB00710137000F0F4FD0F480DF10701FFF7C6
-S3150C009AC007FE0128D5D10D4B0B489DF80710002237
-S3150C009AD01A7000F0E5FD08480DF10701FFF7DCFEF2
-S3150C009AE00128CDD1054B04489DF8071002221A70A7
-S3150C009AF000F0D6FDC4E700BFD497FE1F0089FE1FF9
-S3150C009B00FFF79ABE70B5154C2378012B0D46064609
-S3150C009B101ED03BB1022B0CD0032B11D0BDE87040EC
-S3150C009B2000F0B6BD3046E9B2FFF7A6FD2378022B4E
-S3150C009B30F2D13046E9B2FFF781FE2378032BEDD143
-S3150C009B403046E9B200F07CFCBDE8704000F0A0BDE8
-S3150C009B50C9B2FFF7BBFA2378DBE700BF0089FE1F0B
-S3150C009B60054B1B78012B04D0022B0CBF3F20812008
-S3150C009B7070470820704700BF0089FE1F054B1B78F5
-S3150C009B80012B04D0022B0CBF3F20812070470820EC
-S3150C009B90704700BF0089FE1F08B500F06FFD00304E
-S3150C009BA018BF012008BD00BF08B500F03BFC034BF5
-S3150C009BB003221A70BDE80840FFF706BF0089FE1F96
-S3150C009BC000F032BF00F034BF0209092A034615D94A
-S3150C009BD003F00F033732092B0A701FD8124A12688A
-S3150C009BE030331A440846527802F00302022A08BFA0
-S3150C009BF0203BDBB200224B708A7070470A48006823
-S3150C009C003032104403F00F03407800F003000228B2
-S3150C009C1008BF203AD2B2092B0A70DFD9373300229B
-S3150C009C204B708A70084670470489FE1F144B70B43B
-S3150C009C301E68411E451C002011F8014F321923469F
-S3150C009C40527802F00302022A08BFA4F12003DBB209
-S3150C009C50A3F13002D2B2162AA3F13A040DD8062C7F
-S3150C009C600BD9092A84BF373BDAB202EB0010A942A2
-S3150C009C7000F0FF00E0D170BC7047002070BC70474C
-S3150C009C800489FE1F10B50023074C084808492370A9
-S3150C009C901A46FEF7CDFC00B910BD06487721BDE883
-S3150C009CA01040FFF749BE00BF9898FE1FA498FE1FF0
-S3150C009CB080B5000884B50008024B1878B0FA80F01D
-S3150C009CC0400970479898FE1F10B5FFF765FF0128ED
-S3150C009CD002D0054C23780BB1002010BD00F0B0FE6D
-S3150C009CE00128F9D1207010BD9898FE1F0F4A0378F1
-S3150C009CF01168CA18527802F00302022A08BF203BE8
-S3150C009D00532B01D003207047437819444A785207E5
-S3150C009D10F8D5312B06D0322B06D0332B0CBF0220B4
-S3150C009D200320704700207047012070470489FE1FEE
-S3150C009D3070B506460230FFF779FF0436054684B245
-S3150C009D403046FFF773FF013CA4B22844012CC5B280
-S3150C009D5006F10206F4D83046FFF768FFED43EDB284
-S3150C009D60281AB0FA80F0400970BD00BF2DE9F04109
-S3150C009D70044616460D4600294ED000284CD02046E7
-S3150C009D80FFF7B4FF0328074642D02046FFF7D0FF63
-S3150C009D90002800F09D80012F6BD043D3022F37D1C2
-S3150C009DA0A01CFFF743FF0746201DFFF73FFF4FEAB6
-S3150C009DB00068C5F80080A01DFFF738FF08EB0048C7
-S3150C009DC0C5F8008004F10800FFF730FF08EB002807
-S3150C009DD0C5F8008004F10A00FFF728FF053F404450
-S3150C009DE02860BFB20C347EB10FFA87F8B8F1000FB9
-S3150C009DF00ADD00252046FFF719FF6B1C70559DB236
-S3150C009E00454504F10204F5DB384600B2BDE8F081A5
-S3150C009E10002000B2BDE8F0812F4840F26321FFF725
-S3150C009E208BFDACE7A01CFFF701FF0746201DFFF7D3
-S3150C009E30FDFE4FEA0028C5F80080A01DFFF7F6FED0
-S3150C009E40033F40442860BFB20834002EDCD00FFA22
-S3150C009E5087F8B8F1000FD7DD00252046FFF7E6FEA0
-S3150C009E606B1C70559DB2454504F10204F5DB384672
-S3150C009E70CBE7A01CFFF7DAFE0746201DFFF7D6FE40
-S3150C009E804FEA0048C5F80080A01DFFF7CFFE08EB8F
-S3150C009E900028C5F8008004F10800FFF7C7FE043F50
-S3150C009EA040442860BFB20A34002EADD00FFA87F8B2
-S3150C009EB0B8F1000FA8DD00252046FFF7B7FE6B1C96
-S3150C009EC070559DB2454504F10204F5DB38469CE716
-S3150C009ED04FF6FF709DE700BF84B500082DE9F047EB
-S3150C009EE0BE4F3C783CB1012C00F01581022C00F0E1
-S3150C009EF08E80032C01D0BDE8F087B94EB94D06F51E
-S3150C009F000C7228464FF48071FEF7D2FF96F84192F8
-S3150C009F10B9F1000F40F04381002855D0284605F5CD
-S3150C009F20C07105F58072FFF721FFB0F1FF3F804647
-S3150C009F3000F01E81002847DDAB4800F0D7FDAB4A88
-S3150C009F40AB494346A1FB0303DB0802F10102F9D13D
-S3150C009F50A74813704446A0FB0413DB0803EB8301EC
-S3150C009F60A4EB4104303402F8014D1C46002BF2D10F
-S3150C009F709E4800F0BBFD9F4800F0B8FD9B4995F844
-S3150C009F808301FFF721FE9C4995F88201FFF71CFE21
-S3150C009F909A4995F88101FFF717FE994995F88001C2
-S3150C009FA0FFF712FE914800F0A1FD964800F09EFDC9
-S3150C009FB0D5F88001944A4146FFF7F0FA002800F0E4
-S3150C009FC00081924800F092FDD6F84422D6F83C3235
-S3150C009FD09A4290D18E4800F089FDFFF7E7FA0346C6
-S3150C009FE0002800F09281894800F080FD894800F035
-S3150C009FF07DFD8948FEF700FE884800F077FD0023BA
-S3150C00A0003B7000F053FDBDE8F047FFF7B5B8744E52
-S3150C00A010744D06F50C7228464FF48071FEF748FF16
-S3150C00A02096F84192B9F1000F40F0C780A8B12846C6
-S3150C00A03005F5C0714A46FFF799FEB0F1FF3F804621
-S3150C00A04000F06F81002808DD754C6368002B40F02A
-S3150C00A0509D80D5F8803184E80801D6F84422D6F8DC
-S3150C00A0603C329A427FF447AF6B480021FEF7D6FD8F
-S3150C00A070002840F064816A4C6368002B44D0634826
-S3150C00A08000F034FD674800F031FD636857495848C5
-S3150C00A0901A46A0FB0252D20801F10101F9D1544D26
-S3150C00A0A00A70A5FB0302D20802EB8200A3EB400365
-S3150C00A0B0303301F8013D1346002AF2D14B4800F02B
-S3150C00A0C015FD594800F012FD25684849280EFFF782
-S3150C00A0D07BFD4949C5F30740FFF776FD4749C5F3B4
-S3150C00A0E00720FFF771FD4649E8B2FFF76DFD3F48C3
-S3150C00A0F000F0FCFC434800F0F9FC94E80300FFF781
-S3150C00A1004FFA002800F0F480404800F0EFFC0323DF
-S3150C00A1103B70BDE8F087FFF73FFA00F0B3FC43480D
-S3150C00A12000F0E4FC424800F0E1FC00F0A7FC2246FB
-S3150C00A13001463948FEF7AAFA054648B100233D48C0
-S3150C00A1403B7000F0D3FC2046BDE8F04700F0C4BCE1
-S3150C00A1502E4800F0CBFC384800F0C8FC374800F01D
-S3150C00A160C5FC2F4B02221D605D603A70BDE8F0877E
-S3150C00A170334887F8009000F0B9FC204600F0ACFCA0
-S3150C00A18006F50C70BDE8F047FEF736BD2268D5F82B
-S3150C00A19080111A44914257D1034463605DE7002352
-S3150C00A1A028483B7000F0A2FC022000F095FC06F556
-S3150C00A1B00C70BDE8F047FEF71FBD00231D483B7031
-S3150C00A1C0D9E71C483C7000F091FC062000F084FC9A
-S3150C00A1D01148BDE8F047FEF70FBD00BF9898FE1F6B
-S3150C00A1E0A498FE1FFC9CFE1FD4B600085898FE1FB0
-S3150C00A1F0CDCCCCCCE4B600085A98FE1F5C98FE1F5A
-S3150C00A2005E98FE1F14B70008FC9DFE1F08B60008DA
-S3150C00A210FCB6000818B70008D49AFE1F30B7000821
-S3150C00A2209C98FE1F64B6000870B60008B4B500080A
-S3150C00A230D8B5000800B6000810B6000834B60008F9
-S3150C00A240B0B600088CB60008434800F04FFC4348F3
-S3150C00A25000F04CFC6368424942481A46A0FB02E2F5
-S3150C00A260D20801F10101F9D1DFF8F8E00A70AEFB72
-S3150C00A2700302D20802EB8200A3EB4003303301F851
-S3150C00A280013D1346002AF2D13548DFF8FCA000F058
-S3150C00A2902DFC354800F02AFCD4F8009030494FEAE2
-S3150C00A2A01960FFF791FC3149C9F30740FFF78CFCA5
-S3150C00A2B02F49C9F30720FFF787FC2E495FFA89F06F
-S3150C00A2C0FFF782FC264800F011FC2B4800F00EFC30
-S3150C00A2D094E80300FFF764F950B11F4800F006FC40
-S3150C00A2E0264800F003FCD5F880318AE80801B4E66C
-S3150C00A2F0002323483B7000F0F9FB052000F0ECFB33
-S3150C00A3002048BDE8F047FEF777BC1D483B7000F0CF
-S3150C00A310EDFB072000F0E0FB1A48BDE8F047FEF71E
-S3150C00A3206BBC174887F8009000F0E0FB032000F0A8
-S3150C00A330D3FB06F50C70BDE8F047FEF75DBC0023B9
-S3150C00A3400F483B7000F0D2FB042000F0C5FB0D4813
-S3150C00A350BDE8F047FEF750BC08B6000864B6000826
-S3150C00A3605898FE1FCDCCCCCC70B600085A98FE1F60
-S3150C00A3705C98FE1F5E98FE1F14B7000834B60008E2
-S3150C00A38000B60008D49AFE1F9C98FE1F10B5F6F76F
-S3150C00A39029F9FFF721FA1C4B1C4C00F5FA701860D2
-S3150C00A3A0FFF71AFA1A4B00F51C5010301860FBF721
-S3150C00A3B00FFB184A184900234EF603000B804B80FE
-S3150C00A3C02380638013805380FBF752FBF6F786F9E4
-S3150C00A3D01248F6F7D1F911480621FCF7D9FCFCF71F
-S3150C00A3E02BFEFFF7EBFA42F20F73984203D90C4B94
-S3150C00A3F001221A7010BD42F21070FFF7D9FA084B01
-S3150C00A40001221A7010BD00BF909EFE1FECA2FE1F0B
-S3150C00A410849EFE1FE4A2FE1FE8A2FE1F889EFE1F5E
-S3150C00A420809EFE1F044B054A1B780021117003B158
-S3150C00A4307047FFF7ABBF00BF809EFE1F0189FE1F52
-S3150C00A440124B1B78012B00D07047114B70B41D6852
-S3150C00A4508CB2EE692E62B4B1631E9BB22433421EDB
-S3150C00A460E81805F1230312F8011F03F8011F8342B4
-S3150C00A470F9D104340123013685F8A830EE61A5F82C
-S3150C00A480A64070BC70470424F4E700BF809EFE1FF4
-S3150C00A49030A2FE1FF8B53C4B1C78012C01D00020D5
-S3150C00A4A0F8BDF6F779F9394D002837D1FFF794F94D
-S3150C00A4B0374A384C1368384E984219D303F5FA7359
-S3150C00A4C0022013602660FBF7E7FA2B882F4F002B30
-S3150C00A4D052D1324B324A1A600520FBF7DDFA2B8833
-S3150C00A4E02A4F2BB1FCF7ACFAF6F76EF900233B803A
-S3150C00A4F0FFF772F92B4A1368984229D2032026607B
-S3150C00A500FBF7CAFA2B88214C002BC8D0FCF798FA1B
-S3150C00A510F6F75AF9002323800020F8BD224E288036
-S3150C00A5204FF40060B789FCF74FF9874217D040F615
-S3150C00A5300600B489FCF748F98442B7D1FCF714FA43
-S3150C00A5402B88002BB2D0F6F73FF900232B80ADE712
-S3150C00A55003F51C5310331360FCF7D4F9CEE72046F1
-S3150C00A560FBF79AFA2B88002BA0D0FCF769FAF6F7C2
-S3150C00A5702BF900232B8099E7FCF762FAF6F724F9FE
-S3150C00A58000233B80A5E700BF809EFE1F18A2FE1F7E
-S3150C00A590909EFE1F30A2FE1F34A2FE1F28A2FE1F95
-S3150C00A5A034A9FE1F849EFE1FF0A2FE1F38B5264D51
-S3150C00A5B0264A2B78146803F0400202F0FF010ABB0E
-S3150C00A5C0D80711D584F8A9101A0703D594F8A82032
-S3150C00A5D0012A2AD09B0706D51D4B1988852902DC32
-S3150C00A5E094F8A930C3B138BD5907EDD594F8A92014
-S3150C00A5F0012AE9D104F12000B4F8A610FCF7E8F81A
-S3150C00A6002B78E1E70023012284F8A83084F8A930DE
-S3150C00A610E261A4F8A63038BD0E4B18680439C9B2ED
-S3150C00A6200430BDE8384000F03BB8B4F8A610002062
-S3150C00A63084F8A8000029CDD084F8A92004F12000C4
-S3150C00A640FCF7C6F82B78C5E724A2FE1F30A2FE1F26
-S3150C00A65018A2FE1F2CA2FE1F074B002283F8812096
-S3150C00A660C3F8882083F88420A3F8862083F88320F7
-S3150C00A67083F88220704700BF949EFE1F034B93F80D
-S3150C00A6808100003018BF0120704700BF949EFE1F4A
-S3150C00A690024B002283F88420704700BF949EFE1F55
-S3150C00A6A0F8B50578FF2D064641D0C14C94F881309B
-S3150C00A6B0012B00D0F8BDC93D352D00F27F81DFE8B6
-S3150C00A6C015F037017D017D0194007D017D019C0013
-S3150C00A6D08000A400BB007D017D017D017D017D0113
-S3150C00A6E07D017D017D017D017D017D017D017D0168
-S3150C00A6F07D017D017D017D017D017D017D017D0158
-S3150C00A7007D017D017D017D017D017D017D017D0147
-S3150C00A7107D017D017D01CA00F100FF0052017D0122
-S3150C00A7207D017D0164017D0116011E012C01FFF7DF
-S3150C00A730C3FA9F4CE8B9FE211022022321706270E5
-S3150C00A740A4F8863094F88430994A012B09D0B2F8D3
-S3150C00A75086109748012384F88430BDE8F840FFF74B
-S3150C00A760D1B9FE221023022122706370A4F8861040
-S3150C00A770EFE700231022012684F88230A370627062
-S3150C00A780257084F88160FFF7EBF9E070FFF7F6F9B6
-S3150C00A7902071FFF7F3F90823D8406071A671E671B2
-S3150C00A7A0A4F88630FEF7F8FE94F88430804A012B24
-S3150C00A7B0D7D0B2F886100BB2002B7FF77BAF89B2DD
-S3150C00A7C0C7E7FFF7CDF973780138984270DDFF22A1
-S3150C00A7D001232270A4F886307178754D002940F05B
-S3150C00A7E00481FEF7E3FE0028DED1FE21312202238E
-S3150C00A7F021706270A4F88630A4E7FEF7BDFCFF2238
-S3150C00A80001232270A4F886309CE782794379057976
-S3150C00A810C179D4F88800664E120442EA03232B430E
-S3150C00A82043EA0161FEF7BCFE0028DED0FF220123BD
-S3150C00A8303270A6F8863085E70025FF2323706570F5
-S3150C00A840A570FFF78DF90723E07025716571A57169
-S3150C00A850A4F8863076E7FF23237081794379027951
-S3150C00A860C679D4F88870090441EA032141EA020347
-S3150C00A87053EA066600F0C880002517F8013B1D4414
-S3150C00A880FFF7A0F9013EEDB2F7D100230121082212
-S3150C00A890257161706371A371E371A370E370A4F801
-S3150C00A8A086204FE7FFF75CF97378984200F38E80A9
-S3150C00A8B0FE212222022321706270A4F8863041E721
-S3150C00A8C0FFF74EF972789042F2DD3A48D4F88810C8
-S3150C00A8D0FEF772FCFF2323707278D4F88830134489
-S3150C00A8E0C4F8883073780133A4F886305CE7FE210F
-S3150C00A8F00022022321706270A4F8863022E7FF2220
-S3150C00A900002394F88210227006226370E370237180
-S3150C00A9106371A170A4F8862014E70023FF2101229D
-S3150C00A92084F8813084F882302170A4F8862009E7F7
-S3150C00A930D4F888701E4DFFF713F9721C411E384669
-S3150C00A940FEF72CFE00283FF450AFFF232B70FFF7C9
-S3150C00A95007F9D5F88830013803440122C5F8883048
-S3150C00A960A5F88620EEE6FF232370817943790279D8
-S3150C00A970C079090441EA0323134343EA0063012225
-S3150C00A980C4F88830A4F88620DCE6FF230A48237036
-S3150C00A990072100230822C4F888006370A370E370B3
-S3150C00A9A06371A371E3712171A4F88620CAE600BF16
-S3150C00A9B0949EFE1F959EFE1F5CB70008FE2120226A
-S3150C00A9C0022321706270A4F88630BBE6B2797579E1
-S3150C00A9D03379F1790D48120442EA0522134343EA0E
-S3150C00A9E00161C4F88810727872E7D5F88800B21C39
-S3150C00A9F0FEF7D4FD00283FF4F8AE7278D5F888300F
-S3150C00AA001344C5F88830CFE635463EE7959EFE1FC3
-S3150C00AA1008B5044B586AC0F3403010B100F0C8F8C2
-S3150C00AA20012008BD008F0248642000F095B800BFD5
-S3150C00AA3000F098B8704700BF704700BF704700BF62
-S3150C00AA4000B5C7B0002168464FF48C7200F00BFAC3
-S3150C00AA5069460948FEF798F950B9009828B19DF84F
-S3150C00AA60080080F01000C0F3001047B05DF804FB3E
-S3150C00AA70002047B05DF804FB64B700080048704737
-S3150C00AA8064B7000810B5074C0749002320460A2274
-S3150C00AA9084F82832FDF7FAFD10B9012384F8283220
-S3150C00AAA010BD00BF209FFE1F7CB7000808B50848E4
-S3150C00AAB090F82832012B04D00648BDE80840FEF772
-S3150C00AAC095B9FEF799F80348BDE80840FEF78EB92C
-S3150C00AAD0209FFE1F64B70008034890F82832012B0C
-S3150C00AAE000D07047FEF788B8209FFE1FF8B5184CAB
-S3150C00AAF094F82832012B06461ED03178D9B1154C64
-S3150C00AB004FF480771348F6F78DFEFEF765FE00F1DD
-S3150C00AB100A0505E0FFF756F8FEF75EFE854203D3FD
-S3150C00AB20D4F81431DB05F5D5C4F8187116F8011FE5
-S3150C00AB300029E7D1F8BDF8BD2146FEF7E1F900285A
-S3150C00AB40DBDA0023204684F82832FEF755F8D4E7E2
-S3150C00AB50209FFE1F00000340014B1880704700BF6A
-S3150C00AB604EA1FE1F10B50E4CFEF736FE236898421A
-S3150C00AB700ED30C4B1A7862B10B4A00204FF00071C1
-S3150C00AB8018705160FEF728FE084B1B88184420608D
-S3150C00AB9010BD054A01204FF4007118705160F1E7A1
-S3150C00ABA050A1FE1F4CA1FE1F008502484EA1FE1FA0
-S3150C00ABB0024B4FF000725A60704700BF0085024886
-S3150C00ABC0F0B5424D424E0FCD91B00BAC0FC42B6875
-S3150C00ABD023600BA800248DF80740F6F7F9F82046F9
-S3150C00ABE0F5F736FF2046F5F729FF0420F5F740FF69
-S3150C00ABF0F5F776FF20210120F5F77CFF0120F5F70C
-S3150C00AC0041FFF5F775FB334809218022F6F740FD25
-S3150C00AC1022460D213046F6F73BFD336E2E4823F4C3
-S3150C00AC2000533366F5F7E2FEF5F7BEFF00F09EF82B
-S3150C00AC30FEF7DAFE20460DF1070100F0B7F89DF895
-S3150C00AC400730012B3FD001250224002723488DF81D
-S3150C00AC500870042102AA902603958DF81040F5F78A
-S3150C00AC605BFE1E480695052105AA8DF81C408DF83D
-S3150C00AC701460F5F751FE1A491848CB6910AA23F04F
-S3150C00AC8007032B43CB6102F8207D0D21F5F744FE1B
-S3150C00AC900BAA12488DF82C600C210C958DF83440BB
-S3150C00ACA0F5F73AFE0F4B1A6842F040021A60DA6862
-S3150C00ACB022F007022243DA601A6822F040021A6078
-S3150C00ACC0FEF7A4FEFCE7FEF76FFFBCE78CB70008A7
-S3150C00ACD0008F02480085024880000020008102484F
-S3150C00ACE0000003400043014830B40D4D294605F1E0
-S3150C00ACF03B0051F8034BC4F30742C4F30723134438
-S3150C00AD0053FA84F2230E13FA82F39BB211F8012F35
-S3150C00AD10134481429BB2F9D15B42AB8730BC70477E
-S3150C00AD200080FE1F30B4104D294605F13B0051F84A
-S3150C00AD30034BC4F30742C4F30723134453FA84F2B8
-S3150C00AD40230E13FA82F39BB211F8012F134481429E
-S3150C00AD509BB2F9D1A88F5B429BB2C01A30BCB0FA39
-S3150C00AD6080F04009704700BF0080FE1F10B50C4CE8
-S3150C00AD700C4B22689A420DD00B4B0A4A226003F107
-S3150C00AD803801002203F8012F8B42FBD1BDE810409D
-S3150C00AD90FFF7AABFFFF7C6FF0028EDD010BD00BF16
-S3150C00ADA00080FE1FA2E742CE0380FE1F70B50B4D3E
-S3150C00ADB00B4B2A689A4201D0002070BD0E46044601
-S3150C00ADC0FFF7B0FF40B1372CF6D8002EF4D02C4448
-S3150C00ADD001202379337070BD70BD00BF0080FE1F4B
-S3150C00ADE0A2E742CE70B50E4B0E4CE41AA410002509
-S3150C00ADF01E46A54204D056F8253098470135F8E78B
-S3150C00AE00F9F748F8084C094BE41AA41000251E461D
-S3150C00AE10A54204D056F8253098470135F8E770BDA1
-S3150C00AE200889FE1F0889FE1F0889FE1F0889FE1F58
-S3150C00AE3010B50A44441E914208D014F8013F087814
-S3150C00AE40834201D0181A10BD0131F4E7002010BD61
-S3150C00AE5010B5431E0A44914204D011F8014B03F875
-S3150C00AE60014FF8E710BD02440346934202D003F8A3
-S3150C00AE70011BFAE77047034613F8012B002AFBD196
-S3150C00AE80181A013870470000010000400008000045
-S3150C00AE902D3000086D3000088D30000800000000D1
-S3150C00AEA03931000800000000000004506B0000005F
-S3150C00AEB00700000000080000090400004F70656ED2
-S3150C00AEC0424C5420557365720000000057696E554C
-S3150C00AED053422042756C6B204465766963650000AD
-S3150C00AEE031323334353637383930313200000000E0
-S3150C00AEF00902200001010080320904000002FF0053
-S3150C00AF000000070501024000000705810240000011
-S3150C00AF101201000200000040501DAC60000201024C
-S3150C00AF200301000080000000000001000100000089
-S3150C00AF30010000008000000000000100010000007C
-S3150C00AF40010000008000000000000100010000006C
-S3150C00AF50010000008000000000000100010000005C
-S3150C00AF60010000008000000000000100010000004C
-S3150C00AF70010000008000000000000100010000003C
-S3150C00AF80010000000000000020000000400000004E
-S3150C00AF908000000000010000000200000004000018
-S3150C00AFA0000800000010000000200000000009024C
-S3150C00AFB01A0300043A061B071A080909090A1B0C8E
-S3150C00AFC01A0D000F1A103A113A123A183A193A1B7E
-S3150C00AFD01A1C1A1D3A1E1A201A211B263A2A1A372F
-S3150C00AFE03A381A063A0D3A161A1702291A2A3A3319
-S3150C00AFF012011B051B063A081A231A240001020328
-S3150C00B0000400000000010204FFFFFFFFFFFF000029
-S3150C00B010ADDE122363825363C700FC00E900E20035
-S3150C00B020E400E000E500E700EA00EB00E800EF00D2
-S3150C00B030EE00EC00C400C500C900E600C600F40032
-S3150C00B040F600F200FB00F900FF00D600DC00A200BF
-S3150C00B050A300A500A7209201E100ED00F300FA0081
-S3150C00B060F100D100AA00BA00BF001023AC00BD004D
-S3150C00B070BC00A100AB00BB009125922593250225AF
-S3150C00B08024256125622556255525632551255725E9
-S3150C00B0905D255C255B251025142534252C251C25C2
-S3150C00B0A000253C255E255F255A25542569256625F0
-S3150C00B0B0602550256C256725682564256525592549
-S3150C00B0C05825522553256B256A2518250C258825C8
-S3150C00B0D084258C2590258025B103DF009303C003BE
-S3150C00B0E0A303C303B500C403A6039803A903B403BF
-S3150C00B0F01E22C603B50329226122B10065226422F1
-S3150C00B10020232123F7004822B0001922B7001A2267
-S3150C00B1107F20B200A025A0007D1D0100632C001E1F
-S3150C00B1209601A01E5A01001F0806101F0606201FB6
-S3150C00B1300806301F0806401F0606511F0700591F38
-S3150C00B140521F5B1F541F5D1F561F5F1F601F080693
-S3150C00B150701F0E00BA1FBB1FC81FC91FCA1FCB1FEB
-S3150C00B160DA1FDB1FF81FF91FEA1FEB1FFA1FFB1F65
-S3150C00B170801F0806901F0806A01F0806B01F0400B3
-S3150C00B180B81FB91FB21FBC1FCC1F0100C31FD01F95
-S3150C00B1900206E01F0206E51F0100EC1FF21F01006C
-S3150C00B1A0FC1F4E2101003221702110028421010066
-S3150C00B1B08321D0241A05302C2F04602C0201672C15
-S3150C00B1C00601752C0201802C6401002D260841FF16
-S3150C00B1D01A03000061001A03E0001703F8000703C6
-S3150C00B1E0FF0001007801000130013201060139012E
-S3150C00B1F010014A012E017901060180014D0043021E
-S3150C00B2008101820182018401840186018701870103
-S3150C00B21089018A018B018B018D018E018F019001B1
-S3150C00B2209101910193019401F60196019701980100
-S3150C00B23098013D029B019C019D0120029F01A001EA
-S3150C00B240A001A201A201A401A401A601A701A701C4
-S3150C00B250A901AA01AB01AC01AC01AE01AF01AF0172
-S3150C00B260B101B201B301B301B501B501B701B80122
-S3150C00B270B801BA01BB01BC01BC01BE01F701C0019A
-S3150C00B280C101C201C301C401C501C401C701C80182
-S3150C00B290C701CA01CB01CA01CD011001DD010100B4
-S3150C00B2A08E01DE011201F3010300F101F401F40138
-S3150C00B2B0F8012801220212013A020900652C3B0210
-S3150C00B2C03B023D02662C3F0240024102410246020D
-S3150C00B2D00A015302400081018601550289018A0147
-S3150C00B2E058028F015A0290015C025D025E025F02F7
-S3150C00B2F093016102620294016402650266026702AE
-S3150C00B300970196016A02622C6C026D026E029C0118
-S3150C00B310700271029D01730274029F01760277021C
-S3150C00B320780279027A027B027C02642C7E027F020E
-S3150C00B330A60181028202A901840285028602870285
-S3150C00B340AE014402B101B20145028D028E028F029A
-S3150C00B35090029102B7017B030300FD03FE03FF037A
-S3150C00B360AC0304008603880389038A03B103110323
-S3150C00B370C2030200A303A303C4030803CC03030004
-S3150C00B3808C038E038F03D8031801F2030A00F9030A
-S3150C00B390F303F403F503F603F703F703F903FA03D0
-S3150C00B3A0FA033004200350041007600422018A04B7
-S3150C00B3B03601C1040E01CF040100C004D0044401BF
-S3150C00B3C06105260400000000222A3A3C3E3F7C7FA1
-S3150C00B3D0000000002B2C3B3D5B5D0000809A454134
-S3150C00B3E08E418F804545454949498E8F9092924FA3
-S3150C00B3F0994F555559999A9B9C9D9E9F41494F55DE
-S3150C00B400A5A5A6A7A8A9AAABACADAEAFB0B1B2B371
-S3150C00B410B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C362
-S3150C00B420C4C5C6C7C8C9CACBCCCDCECFD0D1D2D352
-S3150C00B430D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E342
-S3150C00B440E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F332
-S3150C00B450F4F5F6F7F8F9FAFBFCFDFEFF0103050718
-S3150C00B460090E10121416181C1E00000000C0000C49
-S3150C00B47000400000030000000000010C004000002A
-S3150C00B480040000000040010C004000000500000014
-S3150C00B4900080010C004000000600000000C0010CFA
-S3150C00B4A000400000070000000000020C0000020033
-S3150C00B4B0080000000000040C000004000900000055
-S3150C00B4C00000080C000004000A00000000000C0C30
-S3150C00B4D0000004000B0000000000100C000004002B
-S3150C00B4E00C0000000000140C000004000D0000000D
-S3150C00B4F00000180C000004000E00000000001C0CDC
-S3150C00B500000004000F000000433A2F576F726B2F98
-S3150C00B510736F6674776172652F4F70656E424C540B
-S3150C00B5202F5461726765742F536F757263652F4163
-S3150C00B530524D434D345F584D43342F727332333270
-S3150C00B5402E630000433A2F576F726B2F736F66741E
-S3150C00B550776172652F4F70656E424C542F54617231
-S3150C00B5606765742F536F757263652F41524D434D4A
-S3150C00B570345F584D43342F7573622E630000000000
-S3150C00B580303A0000433A2F576F726B2F736F667405
-S3150C00B590776172652F4F70656E424C542F546172F1
-S3150C00B5A06765742F536F757263652F66696C652EAC
-S3150C00B5B0630000004669726D776172652075706470
-S3150C00B5C06174652072657175657374206465746544
-S3150C00B5D0637465640A0D00004F70656E696E6720B2
-S3150C00B5E06669726D776172652066696C6520666F37
-S3150C00B5F0722072656164696E672E2E2E0000000043
-S3150C00B6004552524F520A0D004F4B0A0D00000000D6
-S3150C00B6105374617274696E67207468652070726FFA
-S3150C00B6206772616D6D696E672073657175656E63A2
-S3150C00B630650A0D0050617273696E67206669726DDA
-S3150C00B640776172652066696C6520746F2064657419
-S3150C00B65065637420657261736520626C6F636B73CE
-S3150C00B6602E2E2E0045726173696E67200000000055
-S3150C00B6702062797465732066726F6D206D656D6FCF
-S3150C00B6807279206174203078000000005265616484
-S3150C00B690696E67206C696E652066726F6D206669CF
-S3150C00B6A06C652E2E2E4552524F520A0D000000008C
-S3150C00B6B0496E76616C696420636865636B73756D3E
-S3150C00B6C020666F756E642E2E2E4552524F520A0D01
-S3150C00B6D00000000050726F6772616D6D696E6720B5
-S3150C00B6E00000000020627974657320746F206D650C
-S3150C00B6F06D6F72792061742030780000577269740E
-S3150C00B700696E672070726F6772616D20636865631E
-S3150C00B7106B73756D2E2E2E00436C6F73696E6720DE
-S3150C00B7206669726D776172652066696C650A0D00D3
-S3150C00B7304669726D776172652075706461746520F7
-S3150C00B7407375636365737366756C6C7920636F6D63
-S3150C00B750706C657465640A0D000000004F70656EB0
-S3150C00B760424C54002F64656D6F70726F675F786D15
-S3150C00B77063343730302E7372656300002F626F6F3F
-S3150C00B780746C6F672E74787400000000300201012F
-S3150C00B7900000010000000000000001000201010190
-S3150C00B7A0002020202020202020202828282828207F
-S3150C00B7B02020202020202020202020202020202077
-S3150C00B7C020881010101010101010101010101010DF
-S3150C00B7D010040404040404040404041010101010CF
-S3150C00B7E01010414141414141010101010101010199
-S3150C00B7F001010101010101010101010110101010EB
-S3150C00B800101042424242424202020202020202026A
-S3150C00B81002020202020202020202020210101010BE
-S3150C00B82020000000000000000000000000000000E6
-S3150C00B83000000000000000000000000000000000F6
-S3150C00B84000000000000000000000000000000000E6
-S3150C00B85000000000000000000000000000000000D6
-S3150C00B86000000000000000000000000000000000C6
-S3150C00B87000000000000000000000000000000000B6
-S3150C00B88000000000000000000000000000000000A6
-S3150C00B8900000000000000000000000000000000096
-S3090C00B8A00000000092
-S3150C00B8A400C0005000000000080027695B4500003A
-S3150C00B8B420300020A02F0020D017002000000020EC
-S3150C00B8C4000000000404000000000000000000005A
-S3150C00B8D4991B000854A1FE1F10000C000000000068
-S3150C00B8E4FF000000B8AE0008BCAE0008CCAE0008E1
-S3150C00B8F4E0AE000800C00148000000000000000093
-S3150C00B9043F000000000000000000000000000000E2
-S3150C00B9140000000000000000000000000000000011
-S3150C00B9240000000000000000000000000000000001
-S3150C00B93400000000000000000000000000000000F1
-S3150C00B94400000000000000000000000000000000E1
-S3150C00B9549488FE1F5D4200080300000000000000EE
-S30D0C00B96404010000A0B7000865
+S3150C003DF00930544FE48AFE1FEC8AFE1FE08AFE1F30
+S3150C003E00E18AFE1FF0011000D08BFE1FCC8BFE1F2B
+S3150C003E1000487047B4B000080048704794B00008DA
+S3150C003E2000487047ACAF0008012901D0012070474B
+S3150C003E301378C3F34113022B05D15378012B02D10E
+S3150C003E409388072B01D000207047034B11461A4666
+S3150C003E501B89FEF7D3BC00BFD0AF000838B52A4B80
+S3150C003E601A78E2B929492A4C012201F110051A7077
+S3150C003E7011F8013F1A09092A03F00F038CBF3732D8
+S3150C003E803032092B8CBF37333033A94204F8012C5E
+S3150C003E9004F8023BECD11F4B002283F8202010B310
+S3150C003EA003282AD81C4B53F82040204607F05BF811
+S3150C003EB0C0B21F2828BF1F2008B3431E174DDBB204
+S3150C003EC00133621E05EB43042B4612F8011F23F83F
+S3150C003ED0021FA342F9D1431C5B0043F440739BB20F
+S3150C003EE02B800E4838BD0C4B0C4D1B680B481B88A1
+S3150C003EF06B804FF441732B8038BD002038BD074DC5
+S3150C003F0040F20233ECE700BFD28BFE1FC3FF032047
+S3150C003F108588FE1F8488FE1FA888FE1FD48BFE1F73
+S3150C003F20704700BF38B5437B4BB94368044603B1B1
+S3150C003F309847257B2DB101236373002038BD0020E3
+S3150C003F4038BD204601F08EFB0028F4D065730120A5
+S3150C003F5038BD00BF08B5037B0BB1002008BD01F0CE
+S3150C003F60B3F8003018BF012008BD00BF10B4047BA5
+S3150C003F701CB100205DF8044B70475DF8044B01F052
+S3150C003F808FBB00BF10B4047B1CB100205DF8044B42
+S3150C003F9070475DF8044B01F0F7BB00BF037B0BB118
+S3150C003FA00020704700F088BFF0B5047A8BB0002370
+S3150C003FB0E407054601930293039304930593069332
+S3150C003FC007930893ADF824302ED4037B16460C4683
+S3150C003FD0002B59D0252954D8DFE811F048004800A9
+S3150C003FE04800480048005300530048005300530053
+S3150C003FF0480048004800480048005300530053004E
+S3150C0040005300530053005300530053005300530006
+S3150C00401053005300530053005300F1000B012900C9
+S3150C0040204B0020014800480003200BB0F0BD96F869
+S3150C00403020400123102C8DF8043022D896F82170DC
+S3150C004040102F1ED83B19314622460DF106008DF86D
+S3150C004050053006F075FF01AB18193A4606F110014A
+S3150C004060023006F06DFF2A7B002A72D000200BB0BE
+S3150C004070F0BD96F820300222102B8DF8042040F269
+S3150C004080C08004200BB0F0BD00F016FF030706D568
+S3150C00409014F0FB0F54D0A4F10D03012B50D9252C91
+S3150C0040A0EFD801A353F824F06D400008AD41000889
+S3150C0040B09B4100088941000897420008834000088C
+S3150C0040C083400008874200088340000883400008AC
+S3150C0040D07542000863420008BD420008AB42000866
+S3150C0040E0CF42000883400008834000088340000844
+S3150C0040F08340000883400008834000088340000882
+S3150C0041008340000883400008834000088340000871
+S3150C0041108340000883400008834000088340000861
+S3150C00412083400008BF410008F34100082F400008F7
+S3150C004130734000081D4200087741000847410008FB
+S3150C00414005200BB0F0BD2A7B08238DF80430002A1D
+S3150C0041508CD1284601A900F051FE00283FF465AF2A
+S3150C0041600F2800F0BD800A288BD033280CBF042002
+S3150C00417001200BB0F0BD2B7B002B7FF477AF2846CC
+S3150C004180314600F015FEE8E72B7B002B7FF46EAF73
+S3150C0041902846314600F03EFFDFE72B7B002B7FF4F1
+S3150C0041A065AF2846314600F02FFFD6E72B7B002B58
+S3150C0041B07FF45CAF2846314600F0CCFECDE796F88E
+S3150C0041C020300422102B8DF804203FF65AAF1A46E5
+S3150C0041D031460DF106008DF8053006F0B1FE2B7B4D
+S3150C0041E0002B7FF443AF284601A9012200F006FEFE
+S3150C0041F0B3E796F820300022102B8DF804203FF6FA
+S3150C00420040AF1A4631460DF106008DF8053006F022
+S3150C00421097FE2A7B002A7FF429AF9AE796F820406E
+S3150C0042200523102C8DF804303FF62BAF96F8217031
+S3150C004230102F3FF626AF3B19314622460DF10600EC
+S3150C0042408DF8053006F07CFE01AB181906F110014D
+S3150C0042503A46023006F074FE2B7B002B7FF406AF39
+S3150C004260C1E72B7B002B7FF401AF2846314600F0CB
+S3150C0042705DFE72E72B7B002B7FF4F8AE28463146A9
+S3150C00428000F01EFE69E72B7B002B7FF4EFAE284671
+S3150C00429001F0C4F961E72B7B002B7FF4E7AE2846CF
+S3150C0042A096E8060001F04AF957E72B7B002B7FF4C2
+S3150C0042B0DDAE2846314600F033FE4EE72B7B002B55
+S3150C0042C07FF4D4AE2846314600F0FEFD45E72B7B45
+S3150C0042D0002B7FF4CBAE2846314600F0C5FE3CE7FA
+S3150C0042E002200BB0F0BD00BF2A492B4AD1F89C30F6
+S3150C0042F043F0010370B5C1F89C30D1F89C30274EC1
+S3150C004300274C284D23F0F00343F08003C1F89C3072
+S3150C00431030460521FCF700FB304605210122FDF74E
+S3150C004320CBF930460621204AFCF7F6FA3046062130
+S3150C0043300122FDF7C1F9204600211C4AFCF7ECFAD4
+S3150C004340204600210122FDF7B7F928460621184A16
+S3150C004350FCF7E2FA284606210122FDF7ADF92846BC
+S3150C0043600721144AFCF7D8FA284607210122FDF743
+S3150C004370A3F920460121104AFCF7CEFA01210A4680
+S3150C0043802046FDF799F90D4A136843F48813136018
+S3150C00439070BD00BF0040005018B1000800830248F1
+S3150C0043A00084024800810248F8B00008E8B0000812
+S3150C0043B0C8B0000808B10008D8B00008B4400050D6
+S3150C0043C010B51048104C036810491A68138E9BB22E
+S3150C0043D02380538E9BB20B8023881BB2002B0CDBE5
+S3150C0043E02388094AC3F30E0303B910BD1188054887
+S3150C0043F089B2BDE8104000F0F7BB098889B200F01D
+S3150C00440037FCEDE71489FE1F3CA2FE1F3EA2FE1FE1
+S3150C00441010B50446006800213022203006F09BFDC2
+S3150C00442023680022627283F85020216801234B76A0
+S3150C00443021680B7621680B7721688B7623682272AC
+S3150C0044401A68938D23F004031B041B0C938510BD73
+S3150C00445070B503681A6892F82F300B43DBB282F8FA
+S3150C0044602F3005460C4605F02FFA00F2F51607E03C
+S3150C00447005F020FC2B681B6893F82F00204005D014
+S3150C00448005F022FA8642F3D22E2070BD70BD00BF15
+S3150C004490027A520601D52C20704730B5012183B023
+S3150C0044A00446FFF7D5FF002848D12368244A19682B
+S3150C0044B08B8D23F001031B041B0C8B852368196859
+S3150C0044C08B8DDBB243F480738B85236819688B8DD7
+S3150C0044D09BB243F001038B8523681B68F3219986F5
+S3150C0044E0236819684EF2FF03CB86216809683325C9
+S3150C0044F00D87216809684B872368196891F82E3057
+S3150C00450003F0F00343F00E0381F82E30236819688C
+S3150C00451091F8293003F0F10343F00E0381F82930AA
+S3150C004520237A43F0430323720190019B934205D8EF
+S3150C004530019B01330193019B9342F9D903B030BD22
+S3150C0045409F86010038B50368012283F8582004467B
+S3150C00455005F0BAF900F2E93504E005F0ABFB236887
+S3150C0045601A7A7AB9FFF72CFF05F0AEF98542F4D228
+S3150C00457023682E2000221A7223689A7E1F2A18BFDF
+S3150C004580187E38BD0020F5E70368590054BFD80FD4
+S3150C004590012013F0005F18BF012013F0806F18BFC5
+S3150C0045A0012013F0805F18BF012013F0006F18BFB5
+S3150C0045B0012013F4004F18BF012013F4001F18BF7D
+S3150C0045C0012013F4801F18BF012013F4002F18BF0D
+S3150C0045D0012013F0807F18BF0120DA0301D50120DA
+S3150C0045E0704713F0080F18BF0120704770B50368A9
+S3150C0045F0414904461868FDF791F823689A88100714
+S3150C00460003D11968496AC9072FD520460221FFF73D
+S3150C0046101FFF23689A88054612F0700F1DD1186883
+S3150C004620436A9B0719D43549FDF784F8236893F838
+S3150C00463051601868012E1AD0438E9BB233B9436A67
+S3150C004640C3F303530F2B0CBF242525252C49FDF74B
+S3150C0046504FF8236828461D7770BD20460421FFF7C6
+S3150C004660F7FE236805461868DDE72525D4E72549B6
+S3150C0046700022FDF777F8236883F8586005F024F9D3
+S3150C00468000F2E9350EE005F015FB23689A79012A4C
+S3150C0046904FF4004116D0DA79012A13D01868FDF7C9
+S3150C0046A04FF870B1FFF78CFE05F00EF98542EAD291
+S3150C0046B02268002393712268D37123682E2518680B
+S3150C0046C0BAE72368002199712368D97123681868A1
+S3150C0046D0458EADB2002DAFD0FDF72CF823680749F7
+S3150C0046E01868FDF727F820460621FFF7B1FE236868
+S3150C0046F025251868A0E700BF0000FF100080FF000A
+S3150C0047000080FF1062B100082DE9F04104460068F4
+S3150C004710002580F85150256801206876256882B0FE
+S3150C004720287616460D461F4605F0CEF800F2E938F7
+S3150C00473005F0CAF8804546D305F0BCFA236818681C
+S3150C004740426A9207F4D4426AD107F1D4426AD2077C
+S3150C00475059D42A7891063ED4697801F03F010D2987
+S3150C00476040D002F00302032A35D0227A42F010021E
+S3150C0047702272186832462946FCF7F4FF05F0A4F8B5
+S3150C00478000F2E93604E005F095FA23689A7932B915
+S3150C004790FFF716FE05F098F88642F4D2236800223D
+S3150C0047A09A712368587E1C2831D0022825D02A7885
+S3150C0047B0910644BF012283F851202046FFF716FFCD
+S3150C0047C002B0BDE8F08123681868426AD207D1D4DA
+S3150C0047D02A789106C0D5426A92070AD51B2002B0E8
+S3150C0047E0BDE8F081416A8907F8D402F00302032A76
+S3150C0047F0BBD1227A42F02002B8E76A7802F03F0277
+S3150C004800082AD4D1DCE71A2002B0BDE8F081697819
+S3150C0048100092019211F03F0230D00F2A2ED01B6865
+S3150C0048201D690095A80101F03F01237A47D503299C
+S3150C00483045D043F008032372062F44D8DFE807F06F
+S3150C0048401E392E0420242000204B08991A691202C6
+S3150C0048500A601A695969120E42EA012208994A60DD
+S3150C0048605A699969120E42EA012208998A609A6974
+S3150C004870D969130E089A43EA0123936000209FE737
+S3150C004880089B00201D609BE702A8ABB240F8043DD4
+S3150C004890FFF77AFE089B2D0C1D6091E7089B684676
+S3150C0048A01D60FFF771FE0028E8D02046FFF74AFE90
+S3150C0048B086E7089B68461D60FFF766FE80E723F0D7
+S3150C0048C008032372B8E701207AE700BF00C001484D
+S3150C0048D070B584B003680F49B3F84C4004AD00239F
+S3150C0048E045F8043D24042246009501230646FFF7AD
+S3150C0048F00BFF60B9039B03F4E8535B0A042B06D049
+S3150C00490000953046224604490223FFF7FDFE04B00B
+S3150C00491070BD00BF64B100085AB100082DE9F04122
+S3150C0049200446407A84B0000758BF49024FF0000590
+S3150C00493003AF039590461D4658BF4FEA4228009791
+S3150C0049400A4620461C490123FFF7DEFE064618B12F
+S3150C004950304604B0BDE8F081009742462046174920
+S3150C0049600123FFF7D1FE06460028F1D102460223A9
+S3150C004970134900972046FFF7C7FE064604F0A4FF2E
+S3150C0049804FF47A7303FB0500451C04F09DFF85422A
+S3150C0049900DD305F08FF923681B685A6A9207F4D475
+S3150C0049A05B6ADB07D4D504F08FFF8542F1D22E2645
+S3150C0049B0304604B0BDE8F0817AB100087CB100083D
+S3150C0049C07EB100082DE9F04104460D4616461F46F9
+S3150C0049D004F07AFF00F2E93804E005F06BF923687D
+S3150C0049E0DA7932B9FFF7ECFC04F06EFF8045F4D2AD
+S3150C0049F023680022DA712368197E1E2907D001224A
+S3150C004A0083F851202046BDE8F041FFF7EFBDBFB15A
+S3150C004A1013460AE0022E03D1226829681268116235
+S3150C004A200133BB4205F104050AD0012EF2D12268EE
+S3150C004A3012680133126A2A60BB4205F10405F4D1EF
+S3150C004A400020BDE8F08100BF2DE9F047074600685D
+S3150C004A5001248476787A86B04FF0000E0E46010754
+S3150C004A600E9D9DF83C80CDF808E014469A4602D47B
+S3150C004A7033685B0233603B68049418684FF4007229
+S3150C004A80222303A94FF0010903928DF814308DF8F7
+S3150C004A901590FCF76DFE3B684FF080711868FCF7BB
+S3150C004AA027FE02A8326800904B4651463846FFF75F
+S3150C004AB02BFE064670B914B910E0013C0ED02946FF
+S3150C004AC0384642468023FFF77DFF05F500750646FE
+S3150C004AD00028F2D0304606B0BDE8F0873846FFF71E
+S3150C004AE031FD06460028F5D13B68DA7E092AF1D15C
+S3150C004AF01A680396928FD20718D51B7F242BE9D1FF
+S3150C004B0003AB00933846114932460123FFF7FCFDEF
+S3150C004B100028DFD02528DDD038460421FFF798FC85
+S3150C004B200028D7D13B681B689B8FD3E738460221F8
+S3150C004B30FFF78EFC0028CDD103AB00933846034912
+S3150C004B4032460123FFF7E0FDE4E700BF62B100083F
+S3150C004B502DE9F0418846016886B004461E46086871
+S3150C004B609DF834700396002303A9154602938DF81D
+S3150C004B7014308DF81530FCF7FBFD02AB2A4600937A
+S3150C004B80414620460123FFF7BFFD054618B12846CE
+S3150C004B9006B0BDE8F081F31C9B083A4620460C99FA
+S3150C004BA0FFF710FF05460028F1D104F08DFE00F248
+S3150C004BB0E93604E005F07EF823681A7A32B9FFF775
+S3150C004BC0FFFB04F081FE8642F4D2236800221A729F
+S3150C004BD023689A7E1F2ADAD00122204683F85120B8
+S3150C004BE0FFF704FD0546D2E738B5044688060D46A0
+S3150C004BF032D4E90624D4AA0712D4EB070ED52368BF
+S3150C004C001C225A76236801211868FCF793FD237A37
+S3150C004C10226823F01003012123729171002038BD04
+S3150C004C2023681F229A76236802211868FCF782FDF6
+S3150C004C30237A226823F02003012123721172DCE708
+S3150C004C4023681E221A76236810211868FCF772FD59
+S3150C004C5023680122DA71CEE723681E221A762368AE
+S3150C004C6020211868FCF766FD23680122DA71C0E77B
+S3150C004C7038B503680446C8070D46998000F186804E
+S3150C004C80A90772D46A075FD42B074CD4E80639D42B
+S3150C004C90A90626D46A0613D4EB050FD52368092278
+S3150C004CA0DA76237A226823F03003237210684FF0E9
+S3150C004CB08071FCF73FFD236801229A71012038BDF3
+S3150C004CC0236808221A76237A226823F0200323729B
+S3150C004CD010684FF48001FCF72DFD23680122DA7170
+S3150C004CE0DAE7236807221A76237A226823F0200350
+S3150C004CF0237210684FF40011FCF71CFD2368012287
+S3150C004D00DA71C7E7236806221A76237A226823F01B
+S3150C004D102003237210684FF48011FCF70BFD2368F7
+S3150C004D200122DA71B4E7236805225A76237A2268BF
+S3150C004D3023F01003237210684FF40021FCF7FAFCE1
+S3150C004D40236801229A71A1E7236804225A76237AF2
+S3150C004D50226823F01003237210684FF48021FCF7AD
+S3150C004D60E9FC236801229A718EE7236803225A769E
+S3150C004D70237A226823F01003237210684FF4003153
+S3150C004D80FCF7D8FC236801229A717BE72368022280
+S3150C004D905A76237A226823F01003237210684FF494
+S3150C004DA08031FCF7C7FC236801229A7168E700BFC3
+S3150C004DB030B585B004AB0268002543F8045DB2F843
+S3150C004DC04C2000930D4612040B4901230446FFF7B1
+S3150C004DD09BFC38B9039B9B0106D42870237A23F0DD
+S3150C004DE00803237205B030BD01232B70237A43F0E0
+S3150C004DF00803237205B030BD64B10008F0B585B068
+S3150C004E000F4616460546FFF763FD08B105B0F0BD23
+S3150C004E102B6827491A68938923F010031B041B0C73
+S3150C004E2093817C78013424F0010403AB02340093A3
+S3150C004E30224628460123FFF767FC0028E6D102210B
+S3150C004E400246A3B20191009728461A49FFF780FE45
+S3150C004E502B681A68536A9907FCD403AB0093144960
+S3150C004E60012328464FF40072FFF74EFC2B68196895
+S3150C004E704B6A9A07FCD44B6ADB07F9D40028C5D1D8
+S3150C004E8028460DF10B01FFF793FF0028BED19DF8C4
+S3150C004E900B30012B07D00BB11020B7E7002E0CBF3F
+S3150C004EA000201020B2E7012E0CBF00201020ADE729
+S3150C004EB068B1000880B10008007A00F00F00704756
+S3150C004EC0437A0B600020704703685B6AC3F30B03DD
+S3150C004ED00B800268D38C926A43EA02434B600368E8
+S3150C004EE05B8D0B72036893F82F304B720368DB8D66
+S3150C004EF08B720368DB6A1B0ACB720368DB6A0B7363
+S3150C004F00036893F82B304B7303681B6B1B0A8B736C
+S3150C004F1003681B6BCB7303685B8E0B7400207047A6
+S3150C004F2003681B6A0B600020704700BF30B403682F
+S3150C004F3053F8345F5C689868C1F80900C1F80150F1
+S3150C004F40C1F805404A1C99899B7B9373918100207B
+S3150C004F5030BC704710B4437A03F0040385B003F0F9
+S3150C004F60FF0203BB0368009253F8342FCDF80120DF
+S3150C004F705A689B68CDF80520CDF80930BDF8083085
+S3150C004F809DF807200198C3F30904930943EA8403A7
+S3150C004F90C0F3C23002300133834000200B6005B0F1
+S3150C004FA05DF8044B7047006850F8344F4368CDF8F1
+S3150C004FB005309DF80830BDF806208068CDF809004C
+S3150C004FC003F03F0342EA0343013300229B02002015
+S3150C004FD000920B60CDF8014005B05DF8044B7047AC
+S3150C004FE030B583B002AB002443F8044D0D46194688
+S3150C004FF01446FFF7AFFF20B9019B2C449C4288BF97
+S3150C005000332003B030BD00BF4FF400730B8000207B
+S3150C005010704700BF10B4437A026803F0040385B0EE
+S3150C00502003F0FF04ABB952F8343F0094CDF80130CD
+S3150C0050305368CDF80530BDF804309268CDF80920D8
+S3150C005040C3F3C613013300200B6005B05DF8044BA7
+S3150C005050704752F8343F002450680094CDF8050090
+S3150C005060CDF80130E7E700BFF0B585B000230D465B
+S3150C00507003930446FFF72CFC08B105B0F0BD23687A
+S3150C0050800F49B3F84C2003AB0093120420460123BE
+S3150C005090FFF73AFB0028F0D123680A491E68B3894A
+S3150C0050A09BB223F0100343F010030127B381024691
+S3150C0050B0402320468DE8A000FFF74AFD05B0F0BD61
+S3150C0050C082B1000888B100082DE9F04397B0044678
+S3150C0050D004F0FAFB00F2E93506E004F0EBFD236878
+S3150C0050E01B689A8D900708D404F0EEFB8542F4D227
+S3150C0050F02E25284617B0BDE8F0839A8D92B242F061
+S3150C00510004029A8523681A6892F8293043F0010341
+S3150C00511082F82930236893F85A7027B1012528465E
+S3150C00512017B0BDE8F083B84600221346B049CDF857
+S3150C00513000802046FFF7E8FA054616AEAD49204634
+S3150C0051404FF4D5720623A946002D3FD146F8405D93
+S3150C0051500096FFF7D9FA054650B9069BDAB2AA2A89
+S3150C00516000F0E5805FB11925284617B0BDE8F0833D
+S3150C00517023685A7E022A04D047BB192826D1012758
+S3150C005180D2E783F8509023689B49B3F84C7016AB62
+S3150C005190002243F8482D20463A4600930123FFF798
+S3150C0051A0B3FA236893F8502005460AB9122D00D09D
+S3150C0051B065B9203300933A46204690490423FFF7FD
+S3150C0051C0A3FA1228054644D0002842D02B2D90D1A4
+S3150C0051D0277A23688A49B3F84C8034334FEA084857
+S3150C0051E0002507F008070093424620460323FFB22A
+S3150C0051F0039504950595FFF787FA10B9002F00F073
+S3150C005200C6802046FFF764FB23681A6893899BB215
+S3150C00521023F0100343F0100305469381002D7FF411
+S3150C00522068AF04AB0093204676494FF40072012315
+S3150C005230FFF76AFA054600287FF45BAF002F7FD094
+S3150C005240236800250122284683F85A2017B0BDE8AA
+S3150C005250F08300222368069293F850206A4B002AAA
+S3150C0052600CBF4FF4801898463327009620466249A7
+S3150C00527000220123FFF748FA05460028A6D1236829
+S3150C0052805E4920330093204642460423FFF73CFA3E
+S3150C005290054608B1122899D104F016FB00F1150544
+S3150C0052A001E004F007FD04F00FFB8542F9D8013F3D
+S3150C0052B0236802D01A6A002AD7DA93F85020002AFB
+S3150C0052C000F0C0801A6A12F0804F627A14BF42F066
+S3150C0052D00C0242F0010262722433009320464B49C1
+S3150C0052E000220323FFF710FA054600287FF46EAF61
+S3150C0052F0236847494C332A46009320460523FFF77B
+S3150C00530003FA054600287FF461AF31462046FFF7C5
+S3150C0053104FFD054600287FF459AF9DF81830012B38
+S3150C00532000F0FC80277A07F0FC07277251E7C3F3DD
+S3150C0053300323012B7FF416AF226882F8503022E744
+S3150C00534006AE002320460693FFF7C2FA002861D06A
+S3150C00535023681B6893F8282002F0DD0283F82820C6
+S3150C00536093F82820D2B283F8282040223046002118
+S3150C00537005F0F1FD236893F84420120730D11A6822
+S3150C00538092F8283003F0FB0382F8283058E706AE73
+S3150C00539039464022304605F0DEFD20463146FFF701
+S3150C0053A063FE054600287FF4A4AE069BC3F30742B2
+S3150C0053B01B0E53EA022303D0237A43F00403237211
+S3150C0053C0637ADB0643D504AB009320460D494FF4B4
+S3150C0053D000720123FFF798F905460028B1D088E63C
+S3150C0053E02046FFF775FA002867D02368C7E700BF89
+S3150C0053F050B100085CB1000882B100088EB10008FB
+S3150C0054005EB1000868B100080000104052B10008F7
+S3150C00541054B10008236840211868FCF77FF923680B
+S3150C00542093F84520510761D41B6893F8282002F0A5
+S3150C005430DD0283F8282093F8282042F0020283F834
+S3150C005440282092E7627A42F00202627244E7204612
+S3150C005450FFF73EFA054600287FF44BAE2368324927
+S3150C005460B3F84C2003AB009348EA024220460123D2
+S3150C005470FFF74AF9054600287FF43BAE23682B4913
+S3150C005480186883899BB223F0100343F0100304AE13
+S3150C0054904FF0010E83812A46082320468DE84040B2
+S3150C0054A0FFF756FB2368054696E80300443383E86A
+S3150C0054B00300002D7FF41DAEB3E601230193009685
+S3150C0054C020461B491B4A4023FFF742FB00288CD180
+S3150C0054D00A9B03F00F03012B87D123681A6892F8F5
+S3150C0054E0283043F0040382F82830A9E6B3F84C20A0
+S3150C0054F00D490096120420460123FFF705F90028F2
+S3150C0055007FF426AF009620460B4902220123FFF7B3
+S3150C005510FBF800287FF41CAF236885E7237A23F079
+S3150C0055200303237254E600BF82B1000892B100084F
+S3150C00553058B100080100008086B100082DE9F0473B
+S3150C005540354D06460F4690460FCD9AB06C460FC4A5
+S3150C0055500FCD0FC495E80300402284E803000AA887
+S3150C005560002105F0F8FC3268012353763268137675
+S3150C00557032689376337A58070BD50F2033681A683E
+S3150C005580536A9907FCD4536ADB07F9D41AB0BDE801
+S3150C005590F08708F10104E41B224630463946FFF732
+S3150C0055A01FFD0028EAD10AA93046FFF75DFD002849
+S3150C0055B0E4D10C9A0D9BC2F303551AA901EB850590
+S3150C0055C0110E55F8685CDAB242EA012205FB02F5C7
+S3150C0055D0C3F3012AAC42C3F38523B3FBF2F39A441B
+S3150C0055E00DD2B946002CC9D04946424653463046E0
+S3150C0055F0FFF794F9C2E7641BA5424F46F2D807EBB6
+S3150C00560005094A46304639465346FFF787F90028BE
+S3150C005610F1D0B946E6E700BF28B1000830B5027AEA
+S3150C00562002F0020283B002F0FF031AB101252846EC
+S3150C00563003B030BD02680A49B2F84C20009312043C
+S3150C0056400446FFF761F805460028F0D12046FEF720
+S3150C005650DFFE2368284683F85A5003B030BD00BFDE
+S3150C00566066B1000810B5036804461868FCF734F8F0
+S3150C0056700220FBF707FA237A5A0604D42046BDE823
+S3150C0056801040FEF705BF2046FEF7C2FE204601215C
+S3150C005690FEF7DEFE237A5B06F0D52C2010BD00BF8C
+S3150C0056A02DE9F0410F46017ACE0784B004460BD59E
+S3150C0056B0036803201A68536A9907FCD4536ADB07FC
+S3150C0056C0F9D404B0BDE8F0810D0702D503680520B6
+S3150C0056D0F0E71E46012E1546036810D04FF0010860
+S3150C0056E083F819800368039283F81880036883F89B
+S3150C0056F01A80036893F85A2042BB0120DAE793F824
+S3150C0057005A20002AF9D032462946FFF769FC10BB0D
+S3150C005710637A1B4918072368186883899BB223F0A0
+S3150C005720100343F0100358BF6D02012683812A46ED
+S3150C0057302046009701964FF40073FFF709FA236889
+S3150C0057400028B7D03328D8D10420B3E729463246EF
+S3150C005750FFF746FC08B12368F4E72268094B10688A
+S3150C005760818989B221F0100141F010018181324604
+S3150C00577020468DE8800103A9FFF766F9DFE700BF35
+S3150C0057806AB100086CB10008F0B50F46017ACD0776
+S3150C00579085B004460AD5036803201A68536A99072C
+S3150C0057A0FCD4536ADB07F9D405B0F0BD0E0702D55D
+S3150C0057B003680520F1E74D0712D4012B15461E464A
+S3150C0057C011D002680395012353760268137602689A
+S3150C0057D09376036893F85A20002A2FD10120DCE730
+S3150C0057E003680220D9E7036893F85A20002AF5D0FB
+S3150C0057F032462946FFF7F4FB28BB637A1D49180786
+S3150C00580023681868838923F010034FEA03434FEA91
+S3150C005810134358BF6D02022683812A462046009701
+S3150C00582001964FF40073FFF793F923680028B4D060
+S3150C0058301E280AD03328D1D10420AEE72946324699
+S3150C005840FFF7CEFB18B12368F2E70020A5E7226824
+S3150C005850094B1068818921F010010904090C0225F5
+S3150C0058608181324620460097019503A9FFF7ECF893
+S3150C005870DBE700BF6EB1000870B1000810B5044636
+S3150C0058800548FEF74FFB0CB1032010BD0248FEF78E
+S3150C00589061FB024B185C10BD1489FE1FA8B10008F1
+S3150C0058A008B10320704708B50248FEF777FB024B98
+S3150C0058B0185C08BD1489FE1FA8B1000808B10420A5
+S3150C0058C07047002BFBD008B50348DBB2FEF74EFB46
+S3150C0058D0024B185C08BD00BF1489FE1FA0B100085E
+S3150C0058E008B104207047002BFBD008B50348DBB287
+S3150C0058F0FEF748FB024B185C08BD00BF1489FE1F5F
+S3150C005900A0B1000808B10420704708B50248FEF79C
+S3150C0059104BFB024B185C08BD1489FE1FA0B1000896
+S3150C005920013A0A44914230B416D20C462578637873
+S3150C00593003EB05239BB2184480B2834288BF013027
+S3150C00594004F1020488BF80B2A242EFD8CB431344C1
+S3150C00595023F0010302331944914201D030BC704745
+S3150C0059600B781B02184480B2834284BF013080B28C
+S3150C00597030BC704738B50E4D6B7C2C7C03EB042485
+S3150C005980A4B2A4F10E0005F11A01082280B2FFF7A9
+S3150C005990C7FFA4F1140292B205F12201FFF7C0FF72
+S3150C0059A010B94FF6FF7038BD40BA80B238BD00BF93
+S3150C0059B018A3FE1F70B4C278134C0A44D2B2E2701C
+S3150C0059C083780E0A3344DBB2A37045786570007891
+S3150C0059D020709E4203D90135EDB265708DB1C9B206
+S3150C0059E08A420CDA0133DBB2A370074A3BB953780F
+S3150C0059F00133DBB2537013B913780133137070BCD7
+S3150C005A00704701302070EAE748A2FE1F10B5094C1A
+S3150C005A102368014603F10800FFF7CCFF064A23680A
+S3150C005A20507814789178D2781C7258729972DA720E
+S3150C005A3010BD00BF58A2FE1F48A2FE1F08B50020CD
+S3150C005A4005491422FFF76CFF10B94FF6FF7008BD1D
+S3150C005A5040BA80B208BD00BF26A3FE1FF0B4084AA8
+S3150C005A60084F094E094D0A48012100234FF4806462
+S3150C005A7011703B807376AB800480F0BC704700BF1E
+S3150C005A80288CFE1F08A3FE1F5CA2FE1F5CA9FE1F2E
+S3150C005A901C8CFE1FF0B5164F164E3B88B5888646F5
+S3150C005AA001339BB2B3F5FA4F5CBA0CD34FF4805367
+S3150C005AB01024A542F4D0104A3B800020107025B16A
+S3150C005AC001231370F0BDA4B2F3E7B480F180094B47
+S3150C005AD0BEF1000F09D0BEF800201A80BEF80220D5
+S3150C005AE05A80402333720348F0BDC3F800E0F8E750
+S3150C005AF01C8CFE1F5CA9FE1F288CFE1F074B084A38
+S3150C005B00198810B40024147021B1012313705DF8A8
+S3150C005B10044B704718805DF8044B704708A3FE1FB2
+S3150C005B20288CFE1F2DE9F04F954E042885B0316860
+S3150C005B301BD0944B944A954C1C600328146062D07D
+S3150C005B40022800F0D180052800F09281363CA17B1A
+S3150C005B50452900F02D81DFF850928D4D00232B80C6
+S3150C005B6089F8003005B0BDE8F08FDFF83C92884D1F
+S3150C005B70DFF838A2BAF80030002BEFD085488649FA
+S3150C005B80864C0968B0F800E047887E4E03F11C028B
+S3150C005B9092B2100A20746274087AA07508335BBA44
+S3150C005BA000204FF0110CE38484F817C084F8280009
+S3150C005BB084F829008B886384CB88A384A4F81AE024
+S3150C005BC0A7830B88E38349882A8004F13603218452
+S3150C005BD0336073490B8801339BB200221D0A4520A2
+S3150C005BE0E374A574A073E2736275227522766276ED
+S3150C005BF00B80FFF723FFC0432083002389F8003076
+S3150C005C0005B0BDE8F08F487E00F00F000328A2D146
+S3150C005C10088A00289FD18DE80E00DFF88C915C4D28
+S3150C005C20DFF888A1082089F8000004F037FD9DE80C
+S3150C005C300E0099F8004004F0200000F0FF06002842
+S3150C005C4000F08B81554C534F002314224B76AAF847
+S3150C005C50003084F82F2028232B80502384F82E30F4
+S3150C005C600B7A84F82A304B7A84F82B308B7A84F8AA
+S3150C005C702C30CB7A84F82D300B7B84F826304B7B7A
+S3150C005C8084F827308B7B84F82830CB7B84F829303A
+S3150C005C900622E2758B886384CE887B883888A68436
+S3150C005CA06083A3830B88E3834B882384497E3B4B19
+S3150C005CB0C90640F14C81002283F8312083F830204C
+S3150C005CC02B8863741A0A402100232274A17584F868
+S3150C005CD0353084F8343084F8323084F83330FFF7BA
+S3150C005CE049FEC043608674E72E4CE0780130C0B2A2
+S3150C005CF0E07060B9A0780130C0B2A07038B9607895
+S3150C005D000130C0B2607010B92078013020704C7E22
+S3150C005D101F4DDFF898A004F0FD060020052E288004
+S3150C005D20AAF8000000F0BD80002C00F09E80088AC6
+S3150C005D30002800F00381887E461E8E76002840F0EF
+S3150C005D409480C87E082800F04781661E012E40F21A
+S3150C005D50408104289CBF0326864004F00F0E94BF96
+S3150C005D60F6B2302601300EF1FF37C8768E76072F45
+S3150C005D707BD8DFE807F0BAA0C7BF7ABF7ABF00BFEF
+S3150C005D8058A2FE1F54A2FE1F44A2FE1F4EA3FE1FC6
+S3150C005D9040A2FE1F14A3FE1F50A2FE1F18A3FE1F37
+S3150C005DA0168CFE1F188CFE1F4CA2FE1F5AA9FE1F36
+S3150C005DB0BA4D94F810A0617C288801EB0A2A82451A
+S3150C005DC053DC217D1FFA8AFA8F06A5F800A04CD168
+S3150C005DD094F81590B9F1000F47D1B14FB7F8008080
+S3150C005DE0B8F1000F40F0CB807988002940F0C780CD
+S3150C005DF08DE80C00FFF722FE01464FF6FF7081423C
+S3150C005E009DE80C0031D1E07DDFF89CB2062800F04D
+S3150C005E105781112800F0F780012826D19BF82230F3
+S3150C005E20082B22D1BBF82430DFF890924FF6F6728D
+S3150C005E3093424FF000018CBF09330833A28B8BF8C9
+S3150C005E402210ABF824307988638BA1832284E383F8
+S3150C005E50A4F81A80D1E6009B002B00F0C482072B15
+S3150C005E6000F0BE8201238BF80030DFF8509275E605
+S3150C005E708C490968898800293FF46DAEDFF82CA29D
+S3150C005E80864DDFF8389200210C3C08201C6014600B
+S3150C005E90AAF800103160298089F8000000F0DCFFB8
+S3150C005EA068E68B7E0133DBB2782B8B76DDD14876B8
+S3150C005EB0DFF8089252E67C4C794F84F82FE04FF0CD
+S3150C005EC002084FF0040C06260A202C22602384F8C4
+S3150C005ED0368084F837C084F8386084F839002A8014
+S3150C005EE084F82E30DFF8D491BAE66F4C6C4F4FF035
+S3150C005EF0120EE2E7DFF8C4916B4C694F112384F85C
+S3150C005F002F30A8E6DFF8B49104208DE80E0089F84E
+S3150C005F10000004F0C3FB9DE80E00BAF800001268FE
+S3150C005F201A60002848D00B8A002B45D05E4C5C4F7B
+S3150C005F30283318222B8084F82F208EE604F00F04C9
+S3150C005F40032C92D18DE80E00DFF870916AE60A21D7
+S3150C005F5083F8302083F83110B2E604F0100000F01C
+S3150C005F60FF07B8B1504CCE760120042211230882CB
+S3150C005F704A76AAF800604A4F84F82F306BE6E18B1C
+S3150C005F80494841457FF471AF008C798888427FF48B
+S3150C005F906CAF2DE7BAF80000444E50B1E4072CD58F
+S3150C005FA00F824C8AA04288BFAAF80040BAF80000BB
+S3150C005FB008820024CC76B2E799F800309C077FF56E
+S3150C005FC0CDAD394C364F1022282384F82F202B8048
+S3150C005FD043E605287FF4BDAE0023DFF8E0904B7650
+S3150C005FE0314C0091802389F8003004F057FB1423C0
+S3150C005FF084F82F302A4F00992DE60C8A002CD0D02D
+S3150C00600034802046D5E72A482649B0F804E00860D3
+S3150C006010AAF11C0AA5F800A0BEF1000F03D0BBF82C
+S3150C0060202470774504D0234B0B60DFF8909095E5F0
+S3150C006030C78837B1BBF822E0BE4502D0B7F58A4F08
+S3150C006040F1D10788DFF868E0F7B9BEF802E0BEF1D7
+S3150C006050000F08D0B4F81AE0134CBE45E3D1A48B5C
+S3150C00606040888442DFD11449DFF85090DFF83CA019
+S3150C00607019600220002389F80000AAF8003033606A
+S3150C006080116000F0E9FE75E54FF6FF7C6745E1D13E
+S3150C006090BEF802E0BE45DDD1E5E700BF40A2FE1F1B
+S3150C0060A014A3FE1F50A2FE1F18A3FE1F5AA9FE1F03
+S3150C0060B05CA9FE1F9CA9FE1F42A3FE1F4CA2FE1F3D
+S3150C0060C08DE80E00FFF756FC0099019A029B884258
+S3150C0060D07FF4CBAEDFF8F48298F81910009129B151
+S3150C0060E0BBF824E0B8F80400864578D094F82F3035
+S3150C0060F0B44803F03F03022B5AD0DFF8D49294F83D
+S3150C0061002F20B04B50073FF529AD93F82900DFF847
+S3150C006110C88293F82DA093F8266093F82AC093F8BA
+S3150C006120281093F82CE093F8272083F829A0013047
+S3150C006130C0B24FF0140B4FF0280A88F8006083F8B1
+S3150C00614026C04FF0500893F82BC083F82D0083F827
+S3150C0061502A6083F82FB0A5F800A083F82E8083F868
+S3150C0061602C1083F828E083F82B2083F827C060B91D
+S3150C0061700131C9B283F82C1039B90132D2B283F885
+S3150C0061802B2012B9721C83F82A20DFF850C2638CBC
+S3150C006190B4F824E0668BA08B39887A88ACF800308A
+S3150C0061A0A384A4F822E0E68320846183A28387E596
+S3150C0061B0854A838C1088DFF824A2DFF81CB2AAF873
+S3150C0061C000304FF0000E83421A468BF800E03FF485
+S3150C0061D042AE0123DFF8F8918BF800308FE7BBF85D
+S3150C0061E022E0B8F80600864580D1BBF81AE0B8F86C
+S3150C0061F0000086457FF47AAFBBF81CE0B8F80200C5
+S3150C00620086457FF473AF9BF82F00DFF8C491C6F870
+S3150C006210008000F0040C4FF0000E0CF0FF01019111
+S3150C00622089F800E0BCF1000F50D19BF82EE00099E4
+S3150C006230DFF8A4B14FEA1E1E4FEA8E0EAAF1140C1B
+S3150C006240CEEB0C0C01F00F011FFA8CFC0229A5F801
+S3150C00625000C08BF800E012D0BCF1000F01D1810711
+S3150C00626011D0B4F826A0B8F808C0DFF858E15749A1
+S3150C006270E24541D01023554984F82F30EBE400F069
+S3150C0062803F011229E8D1C10604D5B8F81010DFF881
+S3150C0062903CA1B9BB98F819E00EF00F01013907299A
+S3150C0062A03FF65CAC01A050F821F000BF1367000864
+S3150C0062B09B6600089765000857650008EF640008A0
+S3150C0062C0D564000875620008DD620008202388F892
+S3150C0062D019E089F8003004F0E1F93FE499F8002060
+S3150C0062E03B4BD0077FF53AAC0021102288F81910E9
+S3150C0062F01A7004F0D3F931E4BEF828E049898E45CA
+S3150C006300B8D1C0E70AF10C0003930292FFF752FBD7
+S3150C006310304994F82AE00B7800937345029A039B54
+S3150C006320B8D1284891F801C090F82BE0F445B1D1CA
+S3150C00633090F82C0091F802E08645ABD12148C9783B
+S3150C00634090F82D008142A5D19AF81B0002908AF88C
+S3150C0063500F1002999DF800008AF80C008AF80DC0FF
+S3150C0063608AF80EE011BB9AF818109AF81AE09AF807
+S3150C0063701600CEEB0101A1EBD001C9B25FFA81FE8A
+S3150C0063801EF0800F08441CBF49425FFA81FE98F844
+S3150C0063901710A1EB91017144C0B2C9B28AF816006C
+S3150C0063A001EBD00088F8180088F81710012198F82E
+S3150C0063B0180089F80010002188F81A00A8F81010A7
+S3150C0063C068E700BF18A3FE1F08A3FE1F5CA2FE1FF2
+S3150C0063D04CA2FE1F48A2FE1F288CFE1F148CFE1F0B
+S3150C0063E001238BF8003094F8223094F823E0E17EF8
+S3150C0063F0009194F81DC0217FA07EC6F8008043EA68
+S3150C0064000E2E009ED34BA8F8042041EA0C21012243
+S3150C00641093F801C0A8F806E040EA062093F802E0DB
+S3150C0064201E78A8F80210DB78A8F8000003211046A5
+S3150C00643088F80C6088F80DC000264FF0040C88F81C
+S3150C0064400EE088F80F3094F829E094F8283088F894
+S3150C0064501920A8F8102088F81A1094F8272088F824
+S3150C006460181094F8261088F817C088F80BE088F8EE
+S3150C006470166088F81B6088F80A3088F8092088F8B6
+S3150C0064800810FFF7C3FA94F82E3003F0F002502AE6
+S3150C00649040F2C481B0498BF800601A09053A0B78B2
+S3150C0064A0920004EB09009145064680F2B18190F802
+S3150C0064B03630002B00F0AC81012B00F0B281022BA0
+S3150C0064C02ED096F83700002800F0A28181445FFA9E
+S3150C0064D089F9E6E799F80030D8077FF53FAB072234
+S3150C0064E0002388F8192088F81A30FFF737BB28885C
+S3150C0064F09A4E002840F09A8194F82F30DB077FF5EE
+S3150C0065002DAB0722002388F81A30012088F81920B1
+S3150C006510FFF77CFA102389F8003004F0BFF8A9E6DF
+S3150C00652090F837E0BEF1040FCBD190F8386090F8B4
+S3150C00653039200B7042EA062240F20A63934228BFC6
+S3150C00654013468BF80090AAF80020A8F81230A8F889
+S3150C00655014308349CBE4288808B1FFF757FA94F82E
+S3150C0065602F3013F0010300F08D8099F80030D90715
+S3150C00657040F184800023072288F8192088F81A3005
+S3150C006580A8F810300120FFF741FA102389F80030E3
+S3150C00659004F084F86EE694F82F10C80725D51EF083
+S3150C0065A0100F22D1B8F81030002B7FF4D7AA288808
+S3150C0065B0013080B2FFF72AFA99F800302988694A27
+S3150C0065C043F0100089F8000011B143F01203137068
+S3150C0065D004F064F80120082200236149A8F8100091
+S3150C0065E088F8192088F81B3088E48F060BD594F8A8
+S3150C0065F0347094F8351018682E8841EA072108443F
+S3150C006600711A18602980288870B11EF0100F0BD1F2
+S3150C00661099F8001041F002018DE80C0089F8001081
+S3150C006620FFF7F4F99DE80C0094F8306094F83110FB
+S3150C006630B8F81400DFF834A101EB062189B28142C7
+S3150C006640AAF8001000D809B9AAF8000099F80010A9
+S3150C006650BAF80000A8F812008E073FF47FAADFF8FC
+S3150C00666010A13F490293002001920091AAF8000064
+S3150C00667004F014F89DE80E00FFF7DBBA062388F841
+S3150C00668019307FE799F80020D2075CD50522A8F8C7
+S3150C006690103088F81920FFF761BA99F80010C9076D
+S3150C0066A006D594F82F10304801F03F01122908D076
+S3150C0066B0202389F8003003F0F1FF336800225A7664
+S3150C0066C01DE590F82E1001F0F00050286CD90E093B
+S3150C0066D02149DDF804E00878053E0027B6008BF862
+S3150C0066E0007004EB0E07B645BC4680F2888097F81E
+S3150C0066F03600002800F08380012800F084800228F0
+S3150C00670038D09CF83770002F79D0BE445FFA8EFED5
+S3150C006710E7E799F800001349C0077FF51FAA2888F8
+S3150C00672003274026002488F819700E70A8F810402C
+S3150C006730002894D042248DE80C000C70FFF766F903
+S3150C0067409DE80C008BE72B88002B7FF493ADFFF7AD
+S3150C00675005BA00BF188CFE1F298CFE1F40A2FE1F17
+S3150C0067605CA2FE1F4CA2FE1F18A3FE1F148CFE1F5C
+S3150C0067705AA9FE1F97F837A0BAF1040FC1D1F446F7
+S3150C00678097F838E097F83970087040F20A6147EAD2
+S3150C0067900E202D4E8BF800C0814228BF014630805A
+S3150C0067A0A8F81210A8F8141094F826E094F82910FA
+S3150C0067B094F8277094F8286088F808E0032088F885
+S3150C0067C0190088F80B100120DFF884A088F80970EE
+S3150C0067D088F80A6002930192FFF718F9002142200B
+S3150C0067E0AAF80010A8F8101029801849009189F809
+S3150C0067F0000003F053FF9DE80E00FFF71ABA08706D
+S3150C0068008BF800E0D0E70EF1010E5FFA8EFE68E71A
+S3150C0068100B708BF800900D49FFF769BB0B49FFF71E
+S3150C00682066BB09F101095FFA89F93AE6FFF7EEF85A
+S3150C00683094F82F30DB073FF564AE3388002B7FF4DA
+S3150C00684019ADFFF78BB900BF148CFE1F5CA2FE1F9F
+S3150C0068505AA9FE1F40BA80B2704700BF0A1E0346F3
+S3150C00686009DD0548054900680A80834203D01946AC
+S3150C00687092B204F065BB704744A2FE1F5AA9FE1FD4
+S3150C0068803A4B00222DE9F0439F8BB3F81EE0384EAD
+S3150C006890384B154605E008290A4603F10C03CDB220
+S3150C0068A01BD033F8020C511C0028F4D01C88002C89
+S3150C0068B0F1D0B842EFD17445EDD12F4B2F49304F63
+S3150C0068C008688C883978357002EB420203EB820239
+S3150C0068D0506014819172BDE8F083274D00222F463B
+S3150C0068E02B461988501C1C4609B95988C1B3C2B22B
+S3150C0068F0082A03F10C03F4D1214BDFF88C9093F8A2
+S3150C00690000C0DFF888804FF0000E70467246714664
+S3150C006910AB7AC3EB0C038B42D4B202F10102C4BFB7
+S3150C006920D8B2A646082A05F10C050146F0D10EEBA5
+S3150C0069304E0489F8000088F800E086F800E007EBC2
+S3150C0069408404104923460A46086843F8040B52F897
+S3150C006950060D606092889A8084F80AC0BDE8F083C0
+S3150C006960074B327093F800C0EBE700BF18A3FE1F6D
+S3150C0069702A8CFE1F2E8CFE1F2C8CFE1F2EA3FE1F98
+S3150C0069808D8CFE1F34A3FE1F2B8CFE1F8C8CFE1FC2
+S3150C00699070B4154A154C157815490135EDB200231E
+S3150C0069A015701E4604E0082B237001F10C0119D05A
+S3150C0069B048880A880243013392B2DBB2002AF2D02D
+S3150C0069C08A7AAA1A772AEEDD0A46082B02F8016B98
+S3150C0069D002F101024E7002F8016B2370167001F180
+S3150C0069E00C01E5D170BC70478D8CFE1F2A8CFE1FE6
+S3150C0069F02C8CFE1F2DE9F047304C2388292B12D9FD
+S3150C006A002F4DAB8A0026B3F5807F268004D0B3F5D4
+S3150C006A10007F0CD0BDE8F0872A4FEA8C3B889A425F
+S3150C006A2012D0BDE8F08700232380BDE8F087254B04
+S3150C006A30E98C1A889142F4D12A8D5B889A42F0D15E
+S3150C006A40BDE8F047FFF71CBF2A8D7B889A42E8D138
+S3150C006A50FFF716FF2B4602226A7553F816CF1A4A11
+S3150C006A60B3F804E010689188C5F820C0A5F824E0B6
+S3150C006A70C5F81600B5F824909980D5F820A0B5F87D
+S3150C006A801C80B5F81EC0B7F800E02E757F88C5F8D7
+S3150C006A900600082606222A236981A5F80490C5F863
+S3150C006AA000A0A5F82680A5F828C0A5F81CE0EF8361
+S3150C006AB02E736A732380BDE8F08700BF40A2FE1FC9
+S3150C006AC018A3FE1F14A3FE1F208CFE1F2DE9F84FE2
+S3150C006AD04D4EF18B4FF6FF738DB29D4200F08980BF
+S3150C006AE0DFF84881494AB8F8003010886B400342F9
+S3150C006AF074D0474B474F1D885B887B803D80DFF801
+S3150C006B0030E17888444B002404E0CCB2082C03F125
+S3150C006B100C031FD01A88AA4204F10101F5D15A8838
+S3150C006B208242F2D153F8040F8EF800409B883060F5
+S3150C006B30B3803A4A3A4913883A4C08688D88C6F8A5
+S3150C006B4006000E33A5800020082113807073317364
+S3150C006B50BDE8F88FFF2106222B488EF8004004F082
+S3150C006B60FAF92F4B2F4A798898881F6834730023BB
+S3150C006B70DFF8C0A0DFF8A490F5843474062504244D
+S3150C006B80B8F800C0B8F802E0318502F1300B0121EB
+S3150C006B904FF02A08C6F80670C6F8167090809082D8
+S3150C006BA086F8203086F8213086F8223086F8233095
+S3150C006BB086F8243086F82530B574F474CAF800B01B
+S3150C006BC0A9F800803375B3737374A6F81CC0A6F8C5
+S3150C006BD01EE07175F1737573BDE8F88F308CB8F8DB
+S3150C006BE0023052884340134283D10A4F3980788051
+S3150C006BF085E7338CAB427FF473AF0B4B18689B88DD
+S3150C006C003060B38095E700BF18A3FE1F10A3FE1FCC
+S3150C006C100CA3FE1F908CFE1F2C8CFE1F40A2FE1F89
+S3150C006C20208CFE1F1EA3FE1FACB1000814A3FE1F72
+S3150C006C302A8CFE1F54A2FE1F10B541600446F9F7BC
+S3150C006C40CFFC206010BD00BF10B50446F9F7C8FC98
+S3150C006C5023686268C01A9042B4BF0020012010BDA0
+S3150C006C60F8B501221D4B02700446427098691C4906
+S3150C006C701C4AA0700025E570086812686060E26026
+S3150C006C8025746574A574E57425756575A575E57526
+S3150C006C9025766576A576E5769E69596925818027E0
+S3150C006CA03246678104F11C0004F04AF9A019C6F1BA
+S3150C006CB0100229461C3004F04EF92946402204F1F4
+S3150C006CC02C0004F048F929463A4604F16C0004F00D
+S3150C006CD042F9054B1868C4F8EC00F8BD948CFE1FFD
+S3150C006CE0B4B1000814A3FE1FB8B10008F8B5174DCF
+S3150C006CF02C682046FFF7B4FF154B2A68D869C4F8F0
+S3150C006D00F500586AC4F8FB0004234FF0010E032764
+S3150C006D1036263225FF204FF0350C04F5807184F8A9
+S3150C006D20FF0084F8F0C084F8F1E084F8F27084F87F
+S3150C006D30F36084F8F95084F8F43084F8FA30891A40
+S3150C006D401046BDE8F840FFF789BD00BF54A2FE1FF0
+S3150C006D50948CFE1FF8B52D4B1D682B78022B01D099
+S3150C006D600020F8BD281D2A49042204F0D9F804464F
+S3150C006D700028F5D1274E05F11C00B269716904F0A3
+S3150C006D80CFF8024608B12046F8BD234B28691C886B
+S3150C006D90706205F1F0031C44A34223D206F1200CC9
+S3150C006DA006F11C0E06F1300706F12C0528360DE00F
+S3150C006DB0032927D0062921D0012902D1D3F80200B4
+S3150C006DC03060597802310B449C420BD9197833291F
+S3150C006DD00FD0EDD9362907D0FF2903D03529F0D1AC
+S3150C006DE09A78EEE71046F8BDD3F80200CEF800000C
+S3150C006DF0E7E7D3F80200CCF80000E2E7D3F802008C
+S3150C006E002860DEE7D3F802003860DAE754A2FE1FEA
+S3150C006E10B4B10008948CFE1F40A2FE1F10B50D4C99
+S3150C006E2082B04FF6FF7300226061A16101A84FF496
+S3150C006E308641A270ADF80430ADF80630FEF72AFE96
+S3150C006E40606010B14FF4884383800023238002B026
+S3150C006E5010BD00BF948CFE1FF8B5934C2388B3F578
+S3150C006E60937F41D030D9B3F5AB7F00F0B18040F2BF
+S3150C006E70A880B3F5B57F00F09D8040F26B1293426B
+S3150C006E8040F09C80894D2B789A0740F1F880FFF7EB
+S3150C006E9061FF052800F0B5802369834A42F2107120
+S3150C006EA08B4200F38B80917803F57A730329136177
+S3150C006EB000F0A980FFF71AFF7D482169FFF7BCFE99
+S3150C006EC04FF4B5732380F8BD40F20F1293422BD0CA
+S3150C006ED0B3F5887FC0F08D8029D040F225129342FD
+S3150C006EE06CD14FF493732380704D2B78980740F137
+S3150C006EF0D080FFF72FFF052800F0838023696A4AAC
+S3150C006F0042F210718B4259DC917803F57A7303299E
+S3150C006F10136178D0FFF7EAFE65482169FFF78CFE0E
+S3150C006F2040F225132380F8BD4FF4887323805F4D00
+S3150C006F302B789E0740F19980FFF70CFF022800F092
+S3150C006F408F802369584A4EF65F218B42DCBF5B006B
+S3150C006F501361A378022B00F08480564E35682846C0
+S3150C006F60FFF77EFE3068012303224FF0350C4FF0FD
+S3150C006F70370E0627FF2605F1F90185F8F13085F85D
+S3150C006F80F23085F8F530091A85F8F0C085F8F3E08B
+S3150C006F9085F8F42085F8F62085F8F77085F8F86002
+S3150C006FA0FFF75CFC42482169FFF746FE40F20F13DF
+S3150C006FB02380F8BD40F26B13238063E70023238004
+S3150C006FC0F8BD40F255129342F8D14FF4AB732380BF
+S3150C006FD0354D05F10800FFF737FE48B1364B002258
+S3150C006FE002204FF47A711A805A80A870296161E7E1
+S3150C006FF0F8BD002BE2D101224FF47A73A270236103
+S3150C007000ABE70323A3702D4B2B492D4A608EB4F8A6
+S3150C00701024C0B4F826E05880668D258E278D208CEA
+S3150C007020A1F800C0A1F802E056801D801780FFF77A
+S3150C00703011FC0504608C1C4EFFF70CFC28434FF426
+S3150C0070407A73410803FB01F10029B8BF6FF00041C8
+S3150C00705017483161FFF7F0FD40F255132380F8BD58
+S3150C007060A0704FF47A73236154E71148FFF7ECFDD7
+S3150C0070700028BDD02B789D077FF563AF5CE70C48E5
+S3150C007080FFF7E2FD0028B3D02B789B077FF504AF02
+S3150C007090FDE60748FFF7D8FD0028A9D02B789907FD
+S3150C0070A03FF527AF2AE700BF948CFE1F4CA2FE1FAC
+S3150C0070B09C8CFE1F54A2FE1F14A3FE1F0CA3FE1FC6
+S3150C0070C010A3FE1F024B00221A805A80704700BF85
+S3150C0070D014A3FE1F7F2811D989B910B40D4B01E0FA
+S3150C0070E0802915D033F8022F82428CB201F10101AE
+S3150C0070F0F6D104F1800080B25DF8044B7047FF288E
+S3150C00710004D8054B803833F81000704700207047C0
+S3150C0071100020F1E7BAB10008BCB1000870B4234BEB
+S3150C007120234AB0F5805F28BF134604330BE0884230
+S3150C0071300ED333F8022CD4B20D19A8424FEA122200
+S3150C00714008DB04337AB133F8041C1E460029EED151
+S3150C00715070BC7047082AFBD8DFE802F00C10161931
+S3150C0071601C1F2225080006EB4403DEE7A0F5E350BE
+S3150C00717080B2EDE7411A33F81100E9E7411A01F044
+S3150C0071800103C01A80B2E3E7103880B2E0E720387A
+S3150C00719080B2DDE7303880B2DAE71A3880B2D7E74A
+S3150C0071A0083080B2D4E7503880B2D1E778B3000803
+S3150C0071B0BCB200080168C9B110B40C781F2C09D9EF
+S3150C0071C03A2C0ED00A4601E03A2B07D012F8013FB2
+S3150C0071D01F2BF9D800205DF8044B70474B1C9A42C4
+S3150C0071E007D04FF0FF305DF8044B70474FF0FF307F
+S3150C0071F07047302CF5D1023101600020EBE700BF5F
+S3150C00720010B5044682B018B103680BB11A7822B9CE
+S3150C00721000230B60092002B010BDD888A2889042CA
+S3150C007220F6D158780191FEF73BFB10F0010001995D
+S3150C007230EED123680B60EEE70A44013811F8013BE6
+S3150C00724000F8013F9142F9D1704700BFF8B5C46A06
+S3150C00725000F1300705462246407839460123FEF7F1
+S3150C0072603FFBB0B92A6AAB69E870A21A9A420ED2F1
+S3150C007270AE78012E01D80AE0AB6968781C44013E51
+S3150C007280224639460123FEF72BFB012EF4D10020B2
+S3150C007290F8BD0120F8BD00BF38B5C36A8B42044661
+S3150C0072A00D4616D0C3787BB92A46607804F13001B6
+S3150C0072B00123FEF703FB002818BF4FF0FF35E562EC
+S3150C0072C00CBF0020012038BDFFF7C0FF0028EBD013
+S3150C0072D038BD002038BD00BF2DE9F84FC3780546F0
+S3150C0072E063B92B78032B0FD0002168780A46FEF77A
+S3150C0072F009FB003018BF0120BDE8F88FFFF7A6FF89
+S3150C0073000028EED0BDE8F88F2B79012BECD105F1D6
+S3150C00731030010B4605F50C70002203F8012B834255
+S3150C0073204FF00004F9D12B69E868EA6985F8183240
+S3150C0073301F0A1E0C1B0E4FF0520E4FEA102A4FEA74
+S3150C00734010494FEA106801324FF0550C85F8197246
+S3150C00735085F81A626127412685F81B324FF0AA0B75
+S3150C007360722385F81C0285F8143285F8153285F8D7
+S3150C0073701DA285F81E9285F81F82EA6285F82EC238
+S3150C00738085F82FB285F830E085F831E085F8327053
+S3150C00739085F8177285F8336085F8166268780123CC
+S3150C0073A0FEF79EFA2C719FE700224FF0FF3370B563
+S3150C0073B0C270C3620446FFF76FFF08B1042070BDAC
+S3150C0073C094F82F1294F82E324AF6552243EA0123EA
+S3150C0073D0934201D0032070BD94F8696094F868302C
+S3150C0073E094F8671094F866200F4D43EA062341EA99
+S3150C0073F0032342EA032323F07F43AB42EBD094F8FA
+S3150C007400850094F8843094F8831094F8822043EA2B
+S3150C007410002341EA032342EA032323F07F43AB42D2
+S3150C00742014BF0220002070BD46415400F0B5002365
+S3150C00743085B00B600F461446FFF7BCFE061E18DB24
+S3150C007440C44B53F82650BDB13D602B7804F0FE04B6
+S3150C00745023B16878FEF724FAC70710D5F0B20023DB
+S3150C00746068702B70FEF70AFAC60713D5032005B011
+S3150C007470F0BD0B2005B0F0BD0C2005B0F0BD002C06
+S3150C00748000F0F18000F0040303F0FF00002BEED0B7
+S3150C0074900A20ECE70CB14107FAD428460021FFF785
+S3150C0074A083FF022807D004284FF0000627D00128B6
+S3150C0074B02DD90D20DBE76C4668462B4605F14007B7
+S3150C0074C093F8F2216AB193F8F9E193F8F82193F85D
+S3150C0074D0F76193F8F61142EA0E2246EA022241EAD5
+S3150C0074E002221033BB4240F8042BE9D104AF54F806
+S3150C0074F0046B36B90320BC42F9D10428D9D101203A
+S3150C007500B5E728463146FFF74FFF0128F3D895F823
+S3150C0075103C2095F83B3043EA0223B3F5007FC8D1F3
+S3150C00752095F8471095F8463053EA012340F09D80B4
+S3150C00753095F8570095F8562095F8553095F854104F
+S3150C00754042EA002243EA022341EA032195F840402D
+S3150C007550A961631E012BAC70ABD895F83D309AB27D
+S3150C0075606A81002AA5D05A1E1A42A2D195F841204A
+S3150C00757095F8420042EA00200207288199D195F835
+S3150C007580447095F8432052EA07220DD195F853C062
+S3150C00759095F852E095F8517095F850204EEA0C2E5D
+S3150C0075A047EA0E2742EA072295F83FE095F83E7027
+S3150C0075B057EA0E2E3FF47DAF04FB01F40EEB1017C9
+S3150C0075C02744BA42FFF475AFD21BB2FBF3F3002B80
+S3150C0075D03FF46FAF40F6F572934240F2C1804FF61E
+S3150C0075E0F572934240F29A8095F85BC095F85A4032
+S3150C0075F0EE6106EB0E02023337442A6254EA0C2281
+S3150C0076006B61AF627FF455AF00287FF452AF95F8EB
+S3150C0076105F7095F85E4095F85D0095F85C2044EA3D
+S3150C00762007249B0040EA042003F2FF1342EA0022DF
+S3150C007630B1EB532F6A62FFF43CAF95F8611095F8E5
+S3150C007640603043EA01234FF0FF328021012B2A617F
+S3150C007650EA6029710BD003233F4A2B701388013340
+S3150C0076609BB21380EB80002001E719466EE7711C74
+S3150C0076702846FFF711FE0028EDD195F82F2295F834
+S3150C0076802E3243EA02234AF65522002193422971EF
+S3150C007690E1D195F8334095F8321095F8312095F8EC
+S3150C0076A030302E4841EA042142EA012243EA022301
+S3150C0076B08342D0D195F8174295F8161295F81522F3
+S3150C0076C095F8143200F1FF5041EA042100F5005000
+S3150C0076D042EA0122203043EA02238342BBD195F8C9
+S3150C0076E01BE295F81A6295F81F7295F81E4295F8EA
+S3150C0076F0190295F81D1295F8182295F81C3246EACF
+S3150C0077000E2644EA072440EA062041EA042142EA0E
+S3150C007710002243EA01232A61EB609CE7023306EB65
+S3150C0077200E0237446B612A62AF62EE6100283FF4A9
+S3150C007730C0AE5B0003F2FF132244B1EB532F6A6217
+S3150C007740FFF4B7AE4FF0FF3380222B61EB602A714A
+S3150C007750022381E7CC8EFE1FC88EFE1F525261415A
+S3150C007760023306EB0E0237446B612A62AF62EE619E
+S3150C00777000283FF49EAE03F0010000F2FF1003EB6D
+S3150C007780430300EB53032244B1EB532F6A62FFF41D
+S3150C00779090AE4FF0FF3380222B61EB602A710123F0
+S3150C0077A05AE700BF012919D942699142F8B508D2A6
+S3150C0077B00278022A07460C462ED0032A10D0012A3C
+S3150C0077C001D00120F8BD016A04EB540501EB5521EB
+S3150C0077D0FFF762FD90B34FF0FF30F8BD0120704704
+S3150C0077E0016A01EBD411FFF757FD0028F3D1A10074
+S3150C0077F001F4FE7101F130033B443944DC7898788E
+S3150C0078005A7891F8303040EA042042EA002043EAE4
+S3150C007810002020F07040F8BD016A01EB1421FFF73F
+S3150C0078203BFD0028D7D1610001F4FF717B1893F85A
+S3150C007830302093F8310042EA0020F8BDC5F3080366
+S3150C007840396A6E1C3B4401EB5621384693F830508E
+S3150C007850FFF722FD0028BED1C6F30806BB1993F824
+S3150C0078603000E30745EA00204CBF0009C0F30B00CB
+S3150C007870F8BD00BFB1F5001F2DE9F04105460C46D9
+S3150C007880066802D30220BDE8F08111F01F08F9D179
+S3150C0078908168046129B93378022B1AD9736AC3B18A
+S3150C0078A0194677897F02BC422AD3E41B304608E08E
+S3150C0078B00128E7D973699842E4D2A74221D82868EF
+S3150C0078C0E41BFFF76FFF431C0146F1D10120BDE815
+S3150C0078D0F0813389B3EB541FD4D9D6F82480C5F87C
+S3150C0078E018806961B8F1000FCCD0C4F308033033AB
+S3150C0078F008EB54241E44EE61AC610020BDE8F08117
+S3150C0079007369023B8A1E9A4204D2B6F80A80B36A9D
+S3150C00791008FB0238C5F81880E3E700BF2DE9F047ED
+S3150C00792090F80090B9F1020F05460C46174658D050
+S3150C007930B9F1030F30D0B9F1010F03D0022630464E
+S3150C007940BDE8F087016A04EB540801EB5821FFF7F8
+S3150C007950A3FC06460028F2D108F1010AE307C8F396
+S3150C0079600808A84454D598F83020296AFBB202F0CE
+S3150C0079700F0242EA031388F8303001EB5A2185F8DE
+S3150C00798003902846FFF788FC00284CD1CAF3080A56
+S3150C007990AA44C7F3071752E0016A01EBD411FFF7AB
+S3150C0079A07BFC06460028CAD1A40004F4FE7404F13C
+S3150C0079B030032B4427F07047DA78120602F0704237
+S3150C0079C017432C44380C4FEA172E390E012284F833
+S3150C0079D03070987083F801E0D970EA703046BDE8D3
+S3150C0079E0F087016A01EB1421FFF756FC06460028C6
+S3150C0079F0A5D1640004F4FF742919C7F307220123E7
+S3150C007A0081F8307081F83120EB703046BDE8F08794
+S3150C007A10296A88F8307001EB5A2185F803902846BC
+S3150C007A20FFF73AFC08B1064689E7CAF3080AAA44E6
+S3150C007A30C7F303279AF8303023F00F031F430123B3
+S3150C007A408AF83070EB707AE72DE9F04107468846E4
+S3150C007A50066839BBF5687369EDB901252C4606E055
+S3150C007A60012816D0431C14D0AC4218D073690134CB
+S3150C007A709C4202D3012D12D9022438682146FFF705
+S3150C007A8091FE0028ECD1012C02D97369A3421BD8B4
+S3150C007A900120BDE8F0819D4228BF0125DEE70020CC
+S3150C007AA0BDE8F0813046FFF77DFE0128F0D9421C77
+S3150C007AB006D073699842ECD34546CFE70128E7D147
+S3150C007AC04FF0FF30BDE8F081304621464FF0FF32D3
+S3150C007AD0FFF724FF0028F1D1B8F1000F0CD0B8F154
+S3150C007AE0010FD5D973699845D2D241463046224604
+S3150C007AF0FFF714FF0028E1D172693369F460023A8A
+S3150C007B00934201D2013B3361337943F00103337164
+S3150C007B102046BDE8F08100BF2DE9F04F8369076868
+S3150C007B20026983B01BB9042003B0BDE8F08F02F1E3
+S3150C007B302005B5F5001FF6D2C5F308020E4604461D
+S3150C007B401ABB41690133836129B37B89013B13EA73
+S3150C007B5055281AD138460192FFF724FE0128814692
+S3150C007B60019A20D9B0F1FF3F31D07B6998421CD2E3
+S3150C007B70861E023B9E42C4F8149004D2B7F80A80C3
+S3150C007B80BB6A08FB0638C4F8188030321744E76124
+S3150C007B9025610020C8E73B89B3EB551FF5D80023B8
+S3150C007BA0A3610420C0E70220BEE7002EF7D02046D2
+S3150C007BB061690192FFF748FF019A814648B907208F
+S3150C007BC0B2E738460192FFF741FB019A48B1012012
+S3150C007BD0AAE70128E7D0B0F1FF3FF8D0FB78002BDD
+S3150C007BE0EFD107F1300307F50C70002103F8011BE8
+S3150C007BF08342FBD17B697989023BA9F102069E423D
+S3150C007C0036BFBB6A002301FB0633FB624FF0000A4A
+S3150C007C104FF0010B0DE087F803B00192FFF716FB4E
+S3150C007C200028D4D1FB6A7989019A01330AF1010A39
+S3150C007C30FB628A453846EED3F96A7B69CAEB0101C9
+S3150C007C40F96296E7416A4B1C2DE9F041044605683A
+S3150C007C50066906D0FFF70EFE034610B11846BDE8BE
+S3150C007C60F0814FF0E50801270BE0E26982F800800D
+S3150C007C70EF70226996422046F0D9FFF74DFF034676
+S3150C007C8038B9A1692846FFF707FB034601460028C9
+S3150C007C90EBD0042B08BF02231846BDE8F08100BFC9
+S3150C007CA02DE9F04F002187B00746D0F80080FFF78A
+S3150C007CB0E1FD002851D14FF0FF334FF0FF0ADFF8FA
+S3150C007CC090B17B62994656460AE00F2B48D0C7F80E
+S3150C007CD02490FF2638460021FFF71EFF00283CD1D2
+S3150C007CE04046B969FFF7D8FA002836D1FC692578E1
+S3150C007CF0002D00F08D80E27AE52D02F03F03BB717A
+S3150C007D00E5D01007E1D40F2B2AD076B904F10B007D
+S3150C007D10214611F8012BF30143EA560652FA86F670
+S3150C007D208142F6B2F5D1B24576D0396ACB7ADB0709
+S3150C007D30CDD40846237810F80B2B01319B1A01344D
+S3150C007D40002BC4D111F8012B14F8013B8142A3EB93
+S3150C007D500203F5D1002BBAD1184607B0BDE8F08F57
+S3150C007D60BB6A002BB6D069064ED53A6994F80DA0BD
+S3150C007D707A6205F0BF0594F80DC0D44546D1E17E74
+S3150C007D80A27E52EA01223CD12178304ACDF80880F5
+S3150C007D9001F03F01013901EB410A01EB8A0A4FF070
+S3150C007DA0010E0193049705952746CDF80CC0D046D5
+S3150C007DB07346144610E0B8F1FE0F1DD8FFF7AEF966
+S3150C007DC0019B054633F81800FFF7A8F9854213D135
+S3150C007DD03346D0465C4521D014F8010B3E18385C6E
+S3150C007DE0767840EA062608F1010A3046002BE2D1E5
+S3150C007DF04FF6FF729642EDD0DDF80880DDF80CC028
+S3150C007E00049FE246FF2665E7AE42B4D0FF2661E743
+S3150C007E10042007B0BDE8F08F00209EE73C46C24622
+S3150C007E202278059DDDF80CC0DDF80880049F52060B
+S3150C007E309E46019B06D5BEF1000F03D033F81A30CF
+S3150C007E40002BDED1013DEEB2E24643E700B6000858
+S3150C007E500DB600082DE9F04FD0F82090076899F878
+S3150C007E600B30866A13F0A00389B003D0062009B044
+S3150C007E70BDE8F08F358835B11D46334633F8022FF1
+S3150C007E800135002AFAD10C220446494605A8FFF70B
+S3150C007E90D3F99DF81F30DA0776D5002389F80B3015
+S3150C007EA04846A36205A90B224FF00108FFF7C4F957
+S3150C007EB043460DF1140E072203F00F0000F13001BA
+S3150C007EC0392988BF00F137011B0902F1FF320EF880
+S3150C007ED0011DF1D108A911447E2001F8140C002AC9
+S3150C007EE000F0A58099F80010202908D0494603E037
+S3150C007EF011F8010F202802D001339342F8D109EB77
+S3150C007F00030108A81044072A03F1010396BF10F8D1
+S3150C007F10140C20200132072B01F8010BF1D9204655
+S3150C007F20FFF7BEFE30BB08F10108B8F1640F00F094
+S3150C007F30EB80484605A90B22FFF77EF9B8F1050F31
+S3150C007F4016D9A6F1020E43463EF8022F002AB0D0EF
+S3150C007F50102102F0010000EB4303D80344BF83F465
+S3150C007F60883383F0210301394FEA5202F1D1EBE752
+S3150C007F7043469EE704287FF47AAF9DF81F3089F8B4
+S3150C007F800B309DF81F30A6629B0742D40126204673
+S3150C007F900021D4F80080FFF76DFC024600283FD183
+S3150C007FA0054605E01546FFF7B7FD0246002837D112
+S3150C007FB0A1694046FFF770F9012102460D4478BBD2
+S3150C007FC0E3691B78E52B204601D0002BEAD1AE42A3
+S3150C007FD0E9D1731E01932CD13846A169FFF75CF9E0
+S3150C007FE000287FF444AFE36903F1200203F8010B88
+S3150C007FF09342FBD1E069216A0B22FFF71DF9236A34
+S3150C008000E169DB7A012203F018030B730020FA7086
+S3150C0080102DE7404E0C35A6FB0536B6080136B6E7FD
+S3150C008020042A08BF0722104609B0BDE8F08F134694
+S3150C00803065E72169019B2046A1EB4311FFF71AFC6A
+S3150C00804002460028EFD1216A134601F10B0011F804
+S3150C008050015BDA0142EA530355FA83F38142DBB240
+S3150C008060F5D1DFF8B8801E463846A169FFF714F93A
+S3150C0080700346002B4AD19DF804A0E569D4F8289054
+S3150C008080254A6E730AF1FF3101EB410001EB8001C9
+S3150C0080900F20E8722B73AB76EB764FF6FF7C4FF026
+S3150C0080A0FF0B0EE039F811302B5428444FEA132EEF
+S3150C0080B0013180F801E00BB94FF6FF7301324245EE
+S3150C0080C00BD063451078EDD105EB000E013242451D
+S3150C0080D005F800B08EF801B0F3D14FF6FF7293425B
+S3150C0080E002D039F811300BB94AF0400A012385F851
+S3150C0080F000A02046FB700021FFF70EFD30B9019B56
+S3150C008100013B0193B0D167E70720B0E60246104663
+S3150C0081108AE700BF4FECC44E00B600080DB6000847
+S3150C0081200129F8B507460E46046802D963699942D7
+S3150C00813001D30220F8BD62B1012AFAD99342F8D9CB
+S3150C008140114620464FF0FF32FFF7E8FB50BB38686C
+S3150C00815015E0204613E0314620460022FFF7DEFBF1
+S3150C00816008BB23695A1C05D02279013342F001025F
+S3150C0081702361227163699D4211D238682E463146BD
+S3150C008180FFF710FB054650B10128D2D0411C08D090
+S3150C008190012ECED963699E42DDD30220F8BD0020A4
+S3150C0081A0F8BD0120F8BDF8BD2DE9F04FD0F800B0B0
+S3150C0081B085B080460C4611F8013B2F2BFAD05C2B70
+S3150C0081C0F8D00021C8F8081020781F2840F2458105
+S3150C0081D0009180B21F28D8F8285030D92F282ED0DD
+S3150C0081E05C282CD00121A5F1020927460126FEF7B1
+S3150C0081F071FF00B37F2809D822281CD0A64A01E0BB
+S3150C008200984218D012F8013F002BF9D129F8020F29
+S3150C00821017F8010F1F2806F1010312D92F2810D0C9
+S3150C0082205C280ED0B3F5807F05D001211E46FEF7E3
+S3150C00823051FF0028DED1062005B0BDE8F08F0026E0
+S3150C008240012323441A782F2A1F4603F10103F9D080
+S3150C0082505C2AF7D0202834BF4FF0040A4FF0000AEE
+S3150C0082603C464EB105EB460232F8023D202B01D0BE
+S3150C0082702E2B04D1013EF7D100232B80DBE7D8F857
+S3150C0082802030BDF8002025F8162003F10B0005EB75
+S3150C0082904602202103F8011B8342FBD1AB1E4FF093
+S3150C0082A0000901E009F1010933F8020F2028F9D081
+S3150C0082B02E28F7D0B9F1000F01D04AF0030A134665
+S3150C0082C033F8022D2E2A01D0013EF9D10022134695
+S3150C0082D04FF0080C3A4627462C461D4609F1010973
+S3150C0082E078B320281FD02E281BD0654520D24E45AA
+S3150C0082F072D07F287AD82B2800F08D80DFF8A0E189
+S3150C00830002E0884200F087801EF8011F0029F8D190
+S3150C008310A0F14101192900F2AA8043F00203C0B270
+S3150C0083207CE04E4558D04AF0030A34F81900D5E7DC
+S3150C008330BCF10B0F7AD04E4551D0B1454AF0030A29
+S3150C0083404DD93C461746D8F820201178E52978D027
+S3150C008350BCF1080F04BF9B00DBB203F00C010C2927
+S3150C00836061D003F0030003285DD01AF0020F09D187
+S3150C00837003F00303012B08BF4AF0100A042908BFB7
+S3150C0083804AF0080A82F80BA04046FFF789FCD8F899
+S3150C0083902030DB7A002874D15A073FF54DAF98F898
+S3150C0083A00630DB0655D5D8F810309BF80010C3F311
+S3150C0083B0080330335B440329D87E9A7E42EA0022B6
+S3150C0083C003D0C8F80820387803E7597D1B7D43EAAB
+S3150C0083D0012342EA0342F4E7BCF10B0F26D09B00C3
+S3150C0083E0DBB2B1464FF00B0C08259EE70021CDF809
+S3150C0083F00CC002920193FEF76DFE019B029ADDF80A
+S3150C0084000CC018B3254908444AF0020A10F8800C2F
+S3150C00841000287FF470AF4AF0030A5F20D8F82010CA
+S3150C0084204855013581E74AF0020A9EE73C46174655
+S3150C008430D8F820201178E5294AF0030A8DD14FF09F
+S3150C0084400B0C05211170D8F8202081E74AF0020A9E
+S3150C008450E1E7052005B0BDE8F08FD8F82030802282
+S3150C0084604046DA7205B0BDE8F04FFFF703BAA0F14B
+S3150C0084706101192997BF2038C0B2C0B243F001037D
+S3150C008480CCE704287FF4D8AE13F0040F08BF052000
+S3150C00849005B0BDE8F08F00BF6CB5000880B50008CC
+S3150C0084A078B500082DE9F843436A013306460C46B5
+S3150C0084B01AD0836A18889D1C90B103F5007901F1D6
+S3150C0084C01508002707E04D450AD008F8010F35F8C6
+S3150C0084D0020B013728B10021FEF7FCFD0028F2D172
+S3150C0084E0002727440023BB750021A57D0B464FF0C2
+S3150C0084F02E0EF269D25C202A03F101031AD0052A4A
+S3150C00850008BFE522092B3DD0601842728DB9A2F145
+S3150C0085104107192F0CD8F769082B3F7B8CBF4FF0FE
+S3150C008520100C4FF0080C1CEA070F1CBF2032D2B2FD
+S3150C008530827501310B2BDCD135B963189D75F36946
+S3150C0085401B7B002B08BF0021214400234B72F369CF
+S3150C008550DB7A2372F369DD7F9A7F587F197F42EAB3
+S3150C008560052240EA022241EA02222260597E1A7E44
+S3150C00857042EA0122A280DA7D9B7D43EA0223E38054
+S3150C008580BDE8F88360180DB980F816E080F809E0AC
+S3150C0085900131B9E72DE9F047FF2704460668DFF8F5
+S3150C0085A018813D46042006E0FF2520460021FFF7F2
+S3150C0085B0B3FA002855D1A169002956D03046FEF7EA
+S3150C0085C06BFE00284DD1E1690A78002A48D0CB7A97
+S3150C0085D0E52A03F03F03A371E6D02E2AE4D023F05C
+S3150C0085E0200EBEF1080FDFD00F2B42D1500634D52A
+S3150C0085F023694F7B636202F0BF0591F80DE0BE451F
+S3150C008600D2D1CA7E8B7ED4F828C053EA022321D15C
+S3150C0086100B78284A03F03F03013B03EB430003EBC3
+S3150C008620800001274FF6FF7907E0FE2812D82CF8B8
+S3150C00863010301F460130424530D012F8013B01EB99
+S3150C008640030ACB5C9AF801A043EA0A23002FECD16B
+S3150C0086504B45F0D07746FF25A7E7AA42A4D1CCE735
+S3150C00866004200023A361BDE8F0870028F9D1BDE8FA
+S3150C008670F08775B901F10B06034611F8015BDA01B7
+S3150C00868042EA530355FA83F3B142DBB2F5D19F426A
+S3150C008690EDD04FF0FF336362BDE8F0870B785B06D5
+S3150C0086A004D5FE28D6D800232CF81030013DEDB2A7
+S3150C0086B077467AE700B600080DB6000810B584B008
+S3150C0086C004AB019043F8041D184600911446FEF7BE
+S3150C0086D071FD002810DB0F4951F820300BB1002238
+S3150C0086E01A70019B5BB10022012C1A7041F82030E4
+S3150C0086F009D0104604B010BD0B2004B010BD41F8D3
+S3150C00870020301846F6E7684601A9FEF78FFE04B03E
+S3150C00871010BD00BFCC8EFE1FF0B593B0019168B1B1
+S3150C008720002302F01F06044615460360324601A8D4
+S3150C00873003A9FEF77BFE20B113B0F0BD092013B0E0
+S3150C008740F0BD039A564B079207A804AA01990F92FB
+S3150C0087501193FFF729FDB0B90F9B93F90B30002B42
+S3150C0087607EDB15F01C0F69D19DF82230D90679D421
+S3150C008770AA0701D5DB076AD405F00803DBB2039D13
+S3150C008780002B39D13AE015F01C0FD5D00428D3D1E3
+S3150C00879007A8FFF75FFB46F008060028CCD1300788
+S3150C0087A062D50E9B039D0022482161209A73DA73D1
+S3150C0087B0597418740E9B9A75DA75597618760E9B41
+S3150C0087C02022DA720E9B2A78DF7E997E032A41EAF2
+S3150C0087D007275DD000229A76DA762978032904BF1A
+S3150C0087E01A755A750E9B002201211A775A779A77B9
+S3150C0087F0DA77E970002F39D146F02006EA6A0E9B2B
+S3150C008800226263622978D87E9A7E032942EA002284
+S3150C0088101FD0A260987FDF7F597F1A7F267440EAAB
+S3150C0088200723002041EA0323607442EA0323EA8803
+S3150C008830A280E36025606061E0617DE79DF82230EF
+S3150C00884013F0110F03D16D07A9D5082074E7072083
+S3150C00885072E7587D197D41EA002142EA0142D8E7C8
+S3150C008860062069E7042067E7039DC7E707A8394692
+S3150C008870ED6AFFF755FC00287FF45EAF2946039896
+S3150C008880FEF70AFD039D013FEF600028B4D053E7C5
+S3150C008890597D1A7D42EA012247EA02479AE700BF50
+S3150C0088A0C88CFE1F2DE9F04F1E4683B000230F46E1
+S3150C0088B0336001A914460546FEF7A2FC28B9687C6C
+S3150C0088C018B92B7CD80703D4072003B0BDE8F08F6A
+S3150C0088D06B69EA68C3EB0209A14528BFA14605F1FD
+S3150C0088E02808B9F1000F3DD0C3F30801002957D170
+S3150C0088F00199B1F80AA00AF1FF3A1AEA532A5BD099
+S3150C008900A8694B690238023B98426ED24B898C6A35
+S3150C00891003FB0040002868D05FEA592B00EB0A04E1
+S3150C00892022D00AEB0B029A4288BFCAEB030B48789B
+S3150C008930224639465B46FCF7C1FF002845D12B7C05
+S3150C0089405A0603D5E869001B834546D84FEA4B24E3
+S3150C0089506B69326823442244B9EB04096B612744E2
+S3150C0089603260C1D10020B0E7EA69A24214D02B7C58
+S3150C0089705B060AD5487801234146FCF7B1FF20BBBC
+S3150C0089802B7C019923F040032B74487822464146F0
+S3150C0089900123FCF793FFC0B96969EC61C1F30801C7
+S3150C0089A0C1F500744C4528BF4C4628312944224653
+S3150C0089B03846FEF741FCCBE753B9A868012814D911
+S3150C0089C0411C02D00199A8619BE7012068747CE7E1
+S3150C0089D02868A969FEF7E6FEF0E707EB402041465A
+S3150C0089E04FF40072FEF728FCB0E7022068746CE7BF
+S3150C0089F02DE9F04F1F4683B0002388463B6001A942
+S3150C008A0016460446FEF7FCFB28B9607C18B9227C96
+S3150C008A10910703D4072003B0BDE8F08F6369DE42EB
+S3150C008A2028BFDE43002E00F0878004F128094DE0B4
+S3150C008A30019AB2F80AA00AF1FF3A1AEA532A0ED1A1
+S3150C008A40002B72D1A06800287BD0012800F09780FB
+S3150C008A50421C67D0A368A061019A03B9A060237C6D
+S3150C008A605B0652D4A3695169023B02398B4280F0F2
+S3150C008A7086805089956A03FB0053002B7FD05FEAF2
+S3150C008A80562B0AEB030535D00AEB0B03834288BF42
+S3150C008A90CAEB000B414650785B462A46FCF720FF92
+S3150C008AA000283FD1E169491B8B455CD84FEA4B2521
+S3150C008AB06369E1683A682B44994238BF19462A44DF
+S3150C008AC0761B6361E160A8443A6034D0C3F30800B6
+S3150C008AD00028ADD0C0F50075B54228BF3546283004
+S3150C008AE020442A464146FEF7A7FB237C43F040036D
+S3150C008AF02374DDE7E3696069AB4202D0E368984210
+S3150C008B0027D3E561C0F30800E4E75078E2694946EB
+S3150C008B100123FCF7E5FE28B9237C019A23F04003D8
+S3150C008B2023749FE70120607475E72046A169FEF760
+S3150C008B308BFF002889D1227C42F02002227400206F
+S3150C008B4069E720465146FEF77FFF00287FF47DAF8C
+S3150C008B50F1E7507849462A460123FCF7AFFE002878
+S3150C008B60E0D16069CDE708EB412148464FF400722D
+S3150C008B70FEF762FB237C23F04003237496E7022066
+S3150C008B80607448E770B50A2982B00E4605461AD0BD
+S3150C008B906A68002A08DBAB18541C3C2C1E7305DCD7
+S3150C008BA0AB686C600133AB6002B070BD29462246DF
+S3150C008BB001AB51F80C0BFFF71BFF019BE41A18BF16
+S3150C008BC04FF0FF34ECE70D21FFF7DCFFE0E700BFC9
+S3150C008BD0F0B583B001A90446FEF712FB002848D174
+S3150C008BE0227C02F0200303F0FF00002B41D0530639
+S3150C008BF00DD5019BE269587804F128010123FCF795
+S3150C008C006FFE002837D1237C23F040032374019890
+S3150C008C10216AFEF741FB60BB636ADA7A42F02002F6
+S3150C008C20DA72A26821689A76C2F30720D876097898
+S3150C008C30032922D0E268019D1A7700214FEA122CF3
+S3150C008C404FEA124E4820120E61270126587683F8F9
+S3150C008C501DC083F81EE0DA779975D9759974D974A5
+S3150C008C601F762846EE70FEF737FB237C23F0200395
+S3150C008C70237403B0F0BD0120FBE7120C110A1A7520
+S3150C008C805975D7E710B582B00446FFF7A1FF08B1B6
+S3150C008C9002B010BD204601A9FEF7B2FA0028F7D1A2
+S3150C008CA0206002B010BD00BF70B582B00D4601A9A0
+S3150C008CB00446FEF7A5FA002842D1607C00283FD175
+S3150C008CC0E368AB4204D2227C12F0020F08BF1D46A9
+S3150C008CD0002263696261002D34D0019A56897602AE
+S3150C008CE03BB1013B6A1EB3FBF6F1B2FBF6F28A42CC
+S3150C008CF05DD2A268002A65D0A26132BB61691546B5
+S3150C008D00C1F30803002B68D0E269AA4265D0237C24
+S3150C008D105B063DD404F12806019B314658782A4659
+S3150C008D200123FCF7CBFD00283BD16169E368E561C3
+S3150C008D3099426CD9237CE16043F020032374002014
+S3150C008D4002B070BD284602B070BDB54213D847E0DC
+S3150C008D50FEF77AFE0246002841D0511C21D0012A8A
+S3150C008D6022D9019B5B699A421ED26369A261334484
+S3150C008D70AE42636135D2237C9B0720461146A5EB98
+S3150C008D800605E5D411462068FEF70CFD0246E4E71D
+S3150C008D90019B04F12806587831460123FCF7A0FD07
+S3150C008DA058B101206074CBE702206074C8E77242A8
+S3150C008DB013406361ED1AA2699FE7237C23F04003FD
+S3150C008DC02374A9E711462046FEF73EFE012802460B
+S3150C008DD0EAD0411CE5D0A0608EE7E368A8E73546EB
+S3150C008DE063695919C5F30803616173B1019E706912
+S3150C008DF0931E02388342D7D27089B26A00FB0323D2
+S3150C008E00002BD1D003EB55257AE71D4678E70020D9
+S3150C008E1096E700BF30B591B010AB0D4643F83C0D4C
+S3150C008E2005A918460022FEF701FB044610B12046A0
+S3150C008E3011B030BD02AA0F4B01990D9205A80F93E4
+S3150C008E40FFF7B2F904460028F1D10D9B93F90B30CC
+S3150C008E50002B0ADB002DEAD00B9BA875002BE6D065
+S3150C008E6005A82946FFF71EFBE1E70624204611B0AC
+S3150C008E7030BD00BFC88CFE1F30B59DB01CAB0222A6
+S3150C008E8043F86C0D02A91846FEF7D0FA029B06931E
+S3150C008E90024610B110461DB030BD03AA264B0199EF
+S3150C008EA00E9206A81093FFF77FF902460028F1D11F
+S3150C008EB00E9B93F90B30002B05DB9DF81E30DA0761
+S3150C008EC003D50722E6E70622E4E7029D0D9A2978E8
+S3150C008ED0D47E907E032940EA042405D1517D127D6F
+S3150C008EE042EA012244EA0244DB060BD406A8FEF74A
+S3150C008EF0A9FE02460028CDD1B4B90298FEF7ECF9CA
+S3150C008F000246C7E711A8002111951394FEF7B2FC8F
+S3150C008F1002460028BED111A8FFF73CFB02460028EA
+S3150C008F20CFD00428E2D0B5E706A82146FFF7F8F81B
+S3150C008F3002460028AED1E0E7C88CFE1F2DE9F041B1
+S3150C008F40804682B017464E1E05460024B44238466B
+S3150C008F5069464FF0010201AB0EDAFFF7A3FC019B49
+S3150C008F60012B09D19DF800300D2BEFD00A2B05F8FB
+S3150C008F70013B04F10104E9D1002C4FF0000314BFAE
+S3150C008F80404618462B7002B0BDE8F08110B594B07F
+S3150C008F9002780191002304460293039352B11146C1
+S3150C008FA001A8FFF7EFFD14F8012F002AF7D1029A5A
+S3150C008FB0002A0CDB019804A96B46FFF719FD30B9A2
+S3150C008FC0029A009B9A4202D1039814B010BD4FF03E
+S3150C008FD0FF3014B010BD00BF72B6704762B6704752
+S3150C008FE0F0B55448544D85B0F8F726F8F7F71AFD46
+S3150C008FF0A842044600F29380640000F05BFEAC428B
+S3150C009000FAD94E4D4B484E4E22460121F8F742F8FE
+S3150C00901028464FF4FA52012301A901940296ADF8A1
+S3150C0090200C20ADF80E30F7F773FF2B68454A464C0B
+S3150C009030D079916843F040032B6002262B6866F3C7
+S3150C0090408710D071506843F001032B6040F2E17336
+S3150C009050E568146063F31C0063F31C01060E0B0E2B
+S3150C00906043F0200345F000556FF345160827E560DD
+S3150C00907050609160D671D372177302F10F0302F12F
+S3150C0090801700002103F8011F8342FBD101242D4850
+S3150C0090901476F8F741F8214626480022F7F7BEFF6A
+S3150C0090A02A4A2B4BD17994681360022060F38711FE
+S3150C0090B0D1715568D96840F2676060F31C0560F39E
+S3150C0090C01C04200E2E0E40F020006FF345160827C8
+S3150C0090D041F0005194605560D072D671177302F14D
+S3150C0090E01704D960002002F10F0303F8010FA34205
+S3150C0090F04FF00001F9D115481176F8F70DF801215A
+S3150C0091000A460C48F7F78AFF0C4B1A6822F0400205
+S3150C0091101A601A6822F001021A6005B0F0BD0D4DF6
+S3150C009120A8427FF66EAF640800F0C4FDAC42FAD8D4
+S3150C00913067E700BF00400148FF1AB700004301482B
+S3150C00914020A10700D08EFE1F00500148F08EFE1F96
+S3150C00915020500148000E270738B5144C217359B11D
+S3150C009160013950FA81F104F10F03013810F8012F7F
+S3150C00917003F8012F8842F9D10C48F8F715F8236843
+S3150C0091800A480222DA61F8F717F800F09DFB00F1A5
+S3150C009190320505E000F08EFD00F096FB854203D308
+S3150C0091A02368DB699B07F5D438BD00BFD08EFE1F44
+S3150C0091B070B5124C2368DB6913F0010301D1184614
+S3150C0091C070BD054620460E46F8F706F888B9237B8F
+S3150C0091D03370237B6BB10346E218591C127CEA549C
+S3150C0091E0227BCBB29A42F7D823680122DA6101209E
+S3150C0091F070BD23680122DA61002070BDF08EFE1F5F
+S3150C009200FFF7EABE10B500F045FAA0B101F078FC04
+S3150C00921088B100F0EDFC00F041FB00F03DFA084B84
+S3150C00922020F0604020F07F00186000F035FA4468AA
+S3150C009230FFF7D4FEA047BDE8104000F02DBD00BFDF
+S3150C00924008ED00E070B5561EB6B252B10D46064496
+S3150C009250441E15F8013B04F8013F00F02BFDB44207
+S3150C009260F7D170BD2DE9F0410E4F06463C4607F18D
+S3150C0092709C08002500F01EFD2368B34203D86268E3
+S3150C00928013449E4207D30C34444505F10105F1D134
+S3150C009290FF20BDE8F08105EB450507EB8505287A2F
+S3150C0092A0BDE8F08110B600082DE9F84305460068C4
+S3150C0092B0FFF7D8FFFF2830D06FF00306761B05F1B9
+S3150C0092C0040805F2044700F0F5FC2B6806EB0800D1
+S3150C0092D0C41800F0F9FA414600F10D092046F7F7DB
+S3150C0092E0D5FA05E000F0F0FA814516D300F0E2FC61
+S3150C0092F0F7F7C4FAC307F5D4F7F7C0FA30F0100342
+S3150C0093000BD14346E01A08F5807801E0434507D0B7
+S3150C009310C15C13F8012B9142F8D00020BDE8F8830C
+S3150C0093209F4202D10120BDE8F8839846CBE700BFE7
+S3150C00933038B5104B984204460D4618D00E4A914249
+S3150C00934007D0FFF7B1FF10B1C5F3090313B1002025
+S3150C00935038BD1C4623689D4207D02046294640F856
+S3150C009360045B4FF48062FFF76DFF204638BD034C5B
+S3150C009370EAE700BF108FFE1F00C0000C1493FE1FFF
+S3150C0093802DE9F8430C46016824F47F791D464B1CE5
+S3150C0093900746164629F0030932D0894506D03846C9
+S3150C0093A04946FFF7C5FF074638B30168641A3C44C3
+S3150C0093B0043409F5806907F1040805E016F8013B49
+S3150C0093C004F8013B013D15D000F074FCC8EB040316
+S3150C0093D0B3F5806FF2D338464946FFF7A9FF074627
+S3150C0093E058B100F10408444616F8013B04F8013B59
+S3150C0093F0013DE9D10120BDE8F8830020BDE8F883E2
+S3150C0094008046494648F8049B4FF480624046FFF775
+S3150C00941019FF3968C1E700BF0349044A4FF0FF330F
+S3150C0094200B601360704700BF1493FE1F108FFE1F56
+S3150C009430030E2DE9F041082B0E461549044608BFCC
+S3150C00944000F18064751E091B8D42174602D9002057
+S3150C009450BDE8F0812046FFF705FFFF28F7D060191D
+S3150C009460FFF700FFFF28F2D00A4A24F47F7323F09B
+S3150C0094700303934221463A46334604D00648BDE8D8
+S3150C009480F041FFF77DBF0548BDE8F041FFF778BF17
+S3150C009490FFFF1F0C00C0000C1493FE1F108FFE1F45
+S3150C0094A0030E082B414B2DE9F047054608BF00F18A
+S3150C0094B080654C1E5B1B9C4202D90020BDE8F087E0
+S3150C0094C02846FFF7CFFE07462819FFF7CBFE874243
+S3150C0094D08046F2D8FB1EDBB2FB2BEED80F28ECD85D
+S3150C0094E0DFF8CC90324C00F0E5FB2646002502E076
+S3150C0094F001350D2DE1D000F0DDFB337ABB4206F1D0
+S3150C0095000C06F5D105EB450559F82550681CD4D049
+S3150C0095100023227ABA4204F10C0421D001330D2B1C
+S3150C009520F7D100F0D1F900F5CE5428460834F7F7F8
+S3150C009530D7F905E000F0C8F98442BED300F0BAFBB7
+S3150C009540F7F79CF9C307F5D4F7F798F930F0200331
+S3150C009550B3D10137FFB2B845C4D20120BDE8F087BC
+S3150C00956003EB430309EB830259F823405668A10722
+S3150C00957015D1B20713D1B608EBD004EB860A002638
+S3150C00958005E023680434002BCBD15445E1D016F00A
+S3150C009590FF0F06F10106F4D100F08CFBF1E705484C
+S3150C0095A040F24F3100F040FAE5E700BFFFFF1F0C19
+S3150C0095B010B60008ACB60008104B1A6801321AD067
+S3150C0095C0F0B5D3F808E05F68DE681D695C699969D7
+S3150C0095D0DA690B480EEB070333442B44234483B060
+S3150C0095E00B44134402AADB4342F8043D0421FFF763
+S3150C0095F01FFF03B0F0BD0120704700BF108FFE1F88
+S3150C00960000C2000C0D490E4B0E4A1B689068F0B454
+S3150C0096100F6815688C680C4E3B4410312B44103285
+S3150C00962023440968126803440B4430681344DB4333
+S3150C009630181AF0BCB0FA80F04009704704C0000C50
+S3150C00964000C0000C08C0000C00C2000C0A4808B58B
+S3150C0096500368013302D0FFF727FE58B107480368A9
+S3150C009660013305D0FFF720FE003018BF012008BDDE
+S3150C009670012008BD08BD00BF108FFE1F1493FE1FEE
+S3150C0096800048704700C0000CFFF7C6BEFFF7D0BEFF
+S3150C009690FFF706BFFFF7B6BFFFF7F2BF08B5FFF738
+S3150C0096A08BFF00B908BDBDE80840FFF7CFBF00BF70
+S3150C0096B070B5144DD5F81431DB0401D5002070BDFE
+S3150C0096C001462846F8F7AEF800F0FEF800F10A0657
+S3150C0096D005E000F0EFFA00F0F7F886420BD3D5F868
+S3150C0096E0143113F48074F4D0064B4FF480720120BD
+S3150C0096F0C3F8182170BD034B4FF480722046C3F893
+S3150C009700182170BD00000340F0B5164C85B001253C
+S3150C0097104FF4614E082320462A461027002601A93D
+S3150C009720CDF804E08DF809308DF80A308DF80B5021
+S3150C0097308DF80C70ADF80E60F8F736F82046394601
+S3150C0097402B460422F8F734F92B46204631460422E0
+S3150C009750F8F744F9236C23F00F0343F00203236458
+S3150C00976005B0F0BD00000340812938B50D4604460E
+S3150C0097701ED82846FFF79CFF012803D00F487E21F0
+S3150C00978000F052F9ADB295B1013D14FA85F5013CE4
+S3150C00979000F090FA14F8010FFFF78AFF01284FF03A
+S3150C0097A08701064801D000F03FF9AC42F0D138BD34
+S3150C0097B002487A2100F038F9DBE700BFFCB6000856
+S3150C0097C02DE9F843254D2C7844B92548D0F81431A9
+S3150C0097D01B0730D500242046BDE8F8838046204878
+S3150C0097E0204ED0F8143196F8009013F008040BD0E4
+S3150C0097F000F06AF81C4B1B68C8339842EAD900245F
+S3150C0098002C702046BDE8F8830F46F8F71DF817496B
+S3150C00981033788944013389F801000A78DBB29A421D
+S3150C0098203370D7D140460131FFF70CFD33782C70DD
+S3150C0098303B700124CFE7F8F707F8C0B2431E0B4A7A
+S3150C009840DBB2802B1070C5D800F03EF8064B054AEB
+S3150C0098501860012314702B70BDE700BF1897FE1F0C
+S3150C00986000000340A097FE1FA497FE1F1C97FE1F27
+S3150C009870074B084910B40022074C1A6005205A60A1
+S3150C0098809A605C609A605DF8044B18600A607047D9
+S3150C00989010E000E0A897FE1F7F320200024B002268
+S3150C0098A01A605A609A60704710E000E0044B1B681F
+S3150C0098B0DB0303D5034A136801331360704700BFFB
+S3150C0098C010E000E0A897FE1F044B1B6813F4803FC2
+S3150C0098D0034B18681CBF01301860704710E000E09D
+S3150C0098E0A897FE1F10B504460020F9F75BFB48B19C
+S3150C0098F0214600200122F9F761FBA0F10100B0FA24
+S3150C00990080F0400910BD00BF08B50020F8F764F9D7
+S3150C00991000F0CCF8B0F5FA6F00D308BD4FF4FA603E
+S3150C009920BDE8084000F0BCB8F8F740B910B582B0F5
+S3150C0099303F298DF8071004461ED800200DF10701AB
+S3150C0099400122F9F74DFB012803D00E48792100F0CE
+S3150C0099506BF8214600209DF80720F9F741FB9DF88E
+S3150C0099600730984203D007487C2100F05DF80020B0
+S3150C009970F9F750FB02B010BD0248752100F054F8FF
+S3150C009980DBE700BF4CB700082DE9F84380461D4DB8
+S3150C00999000200F46F9F700FF4FF0FF300021F8F7D3
+S3150C0099A02BFB2C784CB9184E3046FFF79BFF012841
+S3150C0099B020D000242046BDE8F883144EDFF84890EA
+S3150C0099C0307801304844FFF78DFF01280446F0D16A
+S3150C0099D0337899F800200133DBB29A423370E8D120
+S3150C0099E0404609F10101FFF72DFC33783B7000234B
+S3150C0099F02B70DFE73378013B3E2BDAD8034B28700C
+S3150C009A001C70D7E7ED97FE1FAC97FE1FEC97FE1F59
+S3150C009A10012001F087B800BF002001F083B800BF19
+S3150C009A2001F082B801F082B808B500F043F9FCE702
+S3150C009A3010B500F029F9012806D000F0B5F918B1D7
+S3150C009A400C4C2378012B00D010BDFFF73DFF0A4AC2
+S3150C009A500A4B12681B68134403F5FA739842F3D346
+S3150C009A600023237000F0A8F90028EDD1BDE81040C2
+S3150C009A70FFF7C8BBF497FE1FF097FE1FF897FE1F63
+S3150C009A8008B5054B01221A70FFF71EFF034B186031
+S3150C009A90BDE80840FFF7CCBFF497FE1FF897FE1FF2
+S3150C009AA0014B1860704700BFF097FE1F014B1868FA
+S3150C009AB0704700BFF097FE1F08B5054B1B78012BAE
+S3150C009AC000D008BDFFF700FF024B186008BD00BFB1
+S3150C009AD0F497FE1FF897FE1F08B5FFF791FB00F0F1
+S3150C009AE0E7F8FFF7C5FEFFF7CFFD00F043F900F0EE
+S3150C009AF013F8BDE80840FFF7C3BF00BF08B500F078
+S3150C009B00D9F8FFF7D3FE00F061FA00F019F8BDE8BA
+S3150C009B100840FFF78DBF00BF10B5084C00F014FECF
+S3150C009B20FFF75EFA01232370FFF7EEFD0023237087
+S3150C009B30FFF7EAFE0223237010BD00BF2489FE1F27
+S3150C009B4000B583B00DF107012748FFF731FB01285B
+S3150C009B50034622D024480DF10701FFF731FE0128F8
+S3150C009B6029D021480DF10701FFF70EFF012831D04E
+S3150C009B700DF107011C4800F005FD012802D003B0C9
+S3150C009B805DF804FB194B18489DF8071003221A7050
+S3150C009B9000F0FEFD03B05DF804FB144A12489DF874
+S3150C009BA00710137000F0F4FD0F480DF10701FFF7D5
+S3150C009BB007FE0128D5D10D4B0B489DF80710002246
+S3150C009BC01A7000F0E5FD08480DF10701FFF7DCFE01
+S3150C009BD00128CDD1054B04489DF8071002221A70B6
+S3150C009BE000F0D6FDC4E700BFFC97FE1F2489FE1FBC
+S3150C009BF0FFF79ABE70B5154C2378012B0D46064619
+S3150C009C001ED03BB1022B0CD0032B11D0BDE87040FB
+S3150C009C1000F0B6BD3046E9B2FFF7A6FD2378022B5D
+S3150C009C20F2D13046E9B2FFF781FE2378032BEDD152
+S3150C009C303046E9B200F07CFCBDE8704000F0A0BDF7
+S3150C009C40C9B2FFF789FA2378DBE700BF2489FE1F28
+S3150C009C50054B1B78012B04D0022B0CBF3F20812017
+S3150C009C6070470820704700BF2489FE1F054B1B78E0
+S3150C009C70012B04D0022B0CBF3F20812070470820FB
+S3150C009C80704700BF2489FE1F08B500F06FFD003039
+S3150C009C9018BF012008BD00BF08B500F03BFC034B04
+S3150C009CA003221A70BDE80840FFF706BF2489FE1F81
+S3150C009CB000F032BF00F034BF0209092A034615D959
+S3150C009CC003F00F033732092B0A701FD8124A126899
+S3150C009CD030331A440846527802F00302022A08BFAF
+S3150C009CE0203BDBB200224B708A7070470A48006832
+S3150C009CF03032104403F00F03407800F003000228C2
+S3150C009D0008BF203AD2B2092B0A70DFD937330022AA
+S3150C009D104B708A70084670472889FE1F144B70B426
+S3150C009D201E68411E451C002011F8014F32192346AE
+S3150C009D30527802F00302022A08BFA4F12003DBB218
+S3150C009D40A3F13002D2B2162AA3F13A040DD8062C8E
+S3150C009D500BD9092A84BF373BDAB202EB0010A942B1
+S3150C009D6000F0FF00E0D170BC7047002070BC70475B
+S3150C009D702889FE1F10B50023074C08480849237094
+S3150C009D801A46FEF79BFC00B910BD06487721BDE8C4
+S3150C009D901040FFF749BE00BFC098FE1FCC98FE1FAF
+S3150C009DA09CB70008A0B70008024B1878B0FA80F0F0
+S3150C009DB040097047C098FE1F10B5FFF765FF0128D4
+S3150C009DC002D0054C23780BB1002010BD00F0B0FE7C
+S3150C009DD00128F9D1207010BDC098FE1F0F4A0378D8
+S3150C009DE01168CA18527802F00302022A08BF203BF7
+S3150C009DF0532B01D003207047437819444A785207F5
+S3150C009E00F8D5312B06D0322B06D0332B0CBF0220C3
+S3150C009E100320704700207047012070472889FE1FD9
+S3150C009E2070B506460230FFF779FF0436054684B254
+S3150C009E303046FFF773FF013CA4B22844012CC5B28F
+S3150C009E4006F10206F4D83046FFF768FFED43EDB293
+S3150C009E50281AB0FA80F0400970BD00BF2DE9F04118
+S3150C009E60044616460D4600294ED000284CD02046F6
+S3150C009E70FFF7B4FF0328074642D02046FFF7D0FF72
+S3150C009E80002800F09D80012F6BD043D3022F37D1D1
+S3150C009E90A01CFFF743FF0746201DFFF73FFF4FEAC5
+S3150C009EA00068C5F80080A01DFFF738FF08EB0048D6
+S3150C009EB0C5F8008004F10800FFF730FF08EB002816
+S3150C009EC0C5F8008004F10A00FFF728FF053F40445F
+S3150C009ED02860BFB20C347EB10FFA87F8B8F1000FC8
+S3150C009EE00ADD00252046FFF719FF6B1C70559DB245
+S3150C009EF0454504F10204F5DB384600B2BDE8F081B5
+S3150C009F00002000B2BDE8F0812F4840F26321FFF734
+S3150C009F108BFDACE7A01CFFF701FF0746201DFFF7E2
+S3150C009F20FDFE4FEA0028C5F80080A01DFFF7F6FEDF
+S3150C009F30033F40442860BFB20834002EDCD00FFA31
+S3150C009F4087F8B8F1000FD7DD00252046FFF7E6FEAF
+S3150C009F506B1C70559DB2454504F10204F5DB384681
+S3150C009F60CBE7A01CFFF7DAFE0746201DFFF7D6FE4F
+S3150C009F704FEA0048C5F80080A01DFFF7CFFE08EB9E
+S3150C009F800028C5F8008004F10800FFF7C7FE043F5F
+S3150C009F9040442860BFB20A34002EADD00FFA87F8C1
+S3150C009FA0B8F1000FA8DD00252046FFF7B7FE6B1CA5
+S3150C009FB070559DB2454504F10204F5DB38469CE725
+S3150C009FC04FF6FF709DE700BFA0B700082DE9F047DC
+S3150C009FD0BE4F3C783CB1012C00F01581022C00F0F0
+S3150C009FE08E80032C01D0BDE8F087B94EB94D06F52D
+S3150C009FF00C7228464FF48071FEF7A0FF96F841923A
+S3150C00A000B9F1000F40F04381002855D0284605F5DC
+S3150C00A010C07105F58072FFF721FFB0F1FF3F804656
+S3150C00A02000F01E81002847DDAB4800F0D7FDAB4A97
+S3150C00A030AB494346A1FB0303DB0802F10102F9D14C
+S3150C00A040A74813704446A0FB0413DB0803EB8301FB
+S3150C00A050A4EB4104303402F8014D1C46002BF2D11E
+S3150C00A0609E4800F0BBFD9F4800F0B8FD9B4995F853
+S3150C00A0708301FFF721FE9C4995F88201FFF71CFE30
+S3150C00A0809A4995F88101FFF717FE994995F88001D1
+S3150C00A090FFF712FE914800F0A1FD964800F09EFDD8
+S3150C00A0A0D5F88001944A4146FFF7F0FA002800F0F3
+S3150C00A0B00081924800F092FDD6F84422D6F83C3244
+S3150C00A0C09A4290D18E4800F089FDFFF7E7FA0346D5
+S3150C00A0D0002800F09281894800F080FD894800F044
+S3150C00A0E07DFD8948FEF7CEFD884800F077FD0023FC
+S3150C00A0F03B7000F053FDBDE8F047FFF783B8744E94
+S3150C00A100744D06F50C7228464FF48071FEF716FF57
+S3150C00A11096F84192B9F1000F40F0C780A8B12846D5
+S3150C00A12005F5C0714A46FFF799FEB0F1FF3F804630
+S3150C00A13000F06F81002808DD754C6368002B40F039
+S3150C00A1409D80D5F8803184E80801D6F84422D6F8EB
+S3150C00A1503C329A427FF447AF6B480021FEF7A4FDD0
+S3150C00A160002840F064816A4C6368002B44D0634835
+S3150C00A17000F034FD674800F031FD636857495848D4
+S3150C00A1801A46A0FB0252D20801F10101F9D1544D35
+S3150C00A1900A70A5FB0302D20802EB8200A3EB400374
+S3150C00A1A0303301F8013D1346002AF2D14B4800F03A
+S3150C00A1B015FD594800F012FD25684849280EFFF791
+S3150C00A1C07BFD4949C5F30740FFF776FD4749C5F3C3
+S3150C00A1D00720FFF771FD4649E8B2FFF76DFD3F48D2
+S3150C00A1E000F0FCFC434800F0F9FC94E80300FFF790
+S3150C00A1F04FFA002800F0F480404800F0EFFC0323EF
+S3150C00A2003B70BDE8F087FFF73FFA00F0B3FC43481C
+S3150C00A21000F0E4FC424800F0E1FC00F0A7FC22460A
+S3150C00A22001463948FEF778FA054648B100233D4801
+S3150C00A2303B7000F0D3FC2046BDE8F04700F0C4BCF0
+S3150C00A2402E4800F0CBFC384800F0C8FC374800F02C
+S3150C00A250C5FC2F4B02221D605D603A70BDE8F0878D
+S3150C00A260334887F8009000F0B9FC204600F0ACFCAF
+S3150C00A27006F50C70BDE8F047FEF704BD2268D5F86C
+S3150C00A28080111A44914257D1034463605DE7002361
+S3150C00A29028483B7000F0A2FC022000F095FC06F565
+S3150C00A2A00C70BDE8F047FEF7EDBC00231D483B7073
+S3150C00A2B0D9E71C483C7000F091FC062000F084FCA9
+S3150C00A2C01148BDE8F047FEF7DDBC00BFC098FE1F85
+S3150C00A2D0CC98FE1F249DFE1F04B900088098FE1F13
+S3150C00A2E0CDCCCCCC14B900088298FE1F8498FE1FE6
+S3150C00A2F08698FE1F44B90008249EFE1F38B8000835
+S3150C00A3002CB9000848B90008FC9AFE1F60B9000871
+S3150C00A310C498FE1F94B80008A0B80008E4B700085B
+S3150C00A32008B8000830B8000840B8000864B800083F
+S3150C00A330E0B80008BCB80008434800F04FFC43489E
+S3150C00A34000F04CFC6368424942481A46A0FB02E204
+S3150C00A350D20801F10101F9D1DFF8F8E00A70AEFB81
+S3150C00A3600302D20802EB8200A3EB4003303301F860
+S3150C00A370013D1346002AF2D13548DFF8FCA000F067
+S3150C00A3802DFC354800F02AFCD4F8009030494FEAF1
+S3150C00A3901960FFF791FC3149C9F30740FFF78CFCB4
+S3150C00A3A02F49C9F30720FFF787FC2E495FFA89F07E
+S3150C00A3B0FFF782FC264800F011FC2B4800F00EFC3F
+S3150C00A3C094E80300FFF764F950B11F4800F006FC4F
+S3150C00A3D0264800F003FCD5F880318AE80801B4E67B
+S3150C00A3E0002323483B7000F0F9FB052000F0ECFB42
+S3150C00A3F02048BDE8F047FEF745BC1D483B7000F011
+S3150C00A400EDFB072000F0E0FB1A48BDE8F047FEF72D
+S3150C00A41039BC174887F8009000F0E0FB032000F0E9
+S3150C00A420D3FB06F50C70BDE8F047FEF72BBC0023FA
+S3150C00A4300F483B7000F0D2FB042000F0C5FB0D4822
+S3150C00A440BDE8F047FEF71EBC38B8000894B8000803
+S3150C00A4508098FE1FCDCCCCCCA0B800088298FE1FED
+S3150C00A4608498FE1F8698FE1F44B9000864B800083D
+S3150C00A47030B80008FC9AFE1FC498FE1F10B5F6F7FC
+S3150C00A480B1F8FFF721FA1C4B1C4C00F5FA7018605A
+S3150C00A490FFF71AFA1A4B00F51C5010301860FBF730
+S3150C00A4A0DDFA184A184900234EF603000B804B8040
+S3150C00A4B02380638013805380FBF720FBF6F70EF99D
+S3150C00A4C01248F6F759F911480621FCF7A7FCFCF7D8
+S3150C00A4D0F9FDFFF7EBFA42F20F73984203D90C4BD6
+S3150C00A4E001221A7010BD42F21070FFF7D9FA084B10
+S3150C00A4F001221A7010BD00BFB89EFE1F14A3FE1FCA
+S3150C00A500AC9EFE1F0CA3FE1F10A3FE1FB09EFE1FCB
+S3150C00A510A89EFE1F044B054A1B780021117003B13F
+S3150C00A5207047FFF7ABBF00BFA89EFE1F2589FE1F15
+S3150C00A530124B1B78012B00D07047114B70B41D6861
+S3150C00A5408CB2EE692E62B4B1631E9BB22433421EEA
+S3150C00A550E81805F1230312F8011F03F8011F8342C3
+S3150C00A560F9D104340123013685F8A830EE61A5F83B
+S3150C00A570A64070BC70470424F4E700BFA89EFE1FDB
+S3150C00A58058A2FE1FF8B53C4B1C78012C01D00020BC
+S3150C00A590F8BDF6F701F9394D002837D1FFF794F9D4
+S3150C00A5A0374A384C1368384E984219D303F5FA7368
+S3150C00A5B0022013602660FBF7B5FA2B882F4F002B71
+S3150C00A5C052D1324B324A1A600520FBF7ABFA2B8874
+S3150C00A5D02A4F2BB1FCF77AFAF6F7F6F800233B80F4
+S3150C00A5E0FFF772F92B4A1368984229D2032026608A
+S3150C00A5F0FBF798FA2B88214C002BC8D0FCF766FA8F
+S3150C00A600F6F7E2F8002323800020F8BD224E2880BE
+S3150C00A6104FF40060B789FCF71DF9874217D040F656
+S3150C00A6200600B489FCF716F98442B7D1FCF7E2F9B7
+S3150C00A6302B88002BB2D0F6F7C7F800232B80ADE79A
+S3150C00A64003F51C5310331360FCF7A2F9CEE7204632
+S3150C00A650FBF768FA2B88002BA0D0FCF737FAF6F735
+S3150C00A660B3F800232B8099E7FCF730FAF6F7ACF831
+S3150C00A67000233B80A5E700BFA89EFE1F40A2FE1F3D
+S3150C00A680B89EFE1F58A2FE1F5CA2FE1F50A2FE1F04
+S3150C00A6905CA9FE1FAC9EFE1F18A3FE1F38B5264DE7
+S3150C00A6A0264A2B78146803F0400202F0FF010ABB1D
+S3150C00A6B0D80711D584F8A9101A0703D594F8A82041
+S3150C00A6C0012A2AD09B0706D51D4B1988852902DC41
+S3150C00A6D094F8A930C3B138BD5907EDD594F8A92023
+S3150C00A6E0012AE9D104F12000B4F8A610FCF7B6F85B
+S3150C00A6F02B78E1E70023012284F8A83084F8A930EE
+S3150C00A700E261A4F8A63038BD0E4B18680439C9B2FC
+S3150C00A7100430BDE8384000F03BB8B4F8A610002071
+S3150C00A72084F8A8000029CDD084F8A92004F12000D3
+S3150C00A730FCF794F82B78C5E74CA2FE1F58A2FE1F17
+S3150C00A74040A2FE1F54A2FE1F074B002283F8812055
+S3150C00A750C3F8882083F88420A3F8862083F8832006
+S3150C00A76083F88220704700BFBC9EFE1F034B93F8F4
+S3150C00A7708100003018BF0120704700BFBC9EFE1F31
+S3150C00A780024B002283F88420704700BFBC9EFE1F3C
+S3150C00A790F8B50578FF2D064641D0C14C94F88130AA
+S3150C00A7A0012B00D0F8BDC93D352D00F27F81DFE8C5
+S3150C00A7B015F037017D017D0194007D017D019C0022
+S3150C00A7C08000A400BB007D017D017D017D017D0122
+S3150C00A7D07D017D017D017D017D017D017D017D0177
+S3150C00A7E07D017D017D017D017D017D017D017D0167
+S3150C00A7F07D017D017D017D017D017D017D017D0157
+S3150C00A8007D017D017D01CA00F100FF0052017D0131
+S3150C00A8107D017D0164017D0116011E012C01FFF7EE
+S3150C00A820C3FA9F4CE8B9FE211022022321706270F4
+S3150C00A830A4F8863094F88430994A012B09D0B2F8E2
+S3150C00A84086109748012384F88430BDE8F840FFF75A
+S3150C00A850D1B9FE221023022122706370A4F886104F
+S3150C00A860EFE700231022012684F88230A370627071
+S3150C00A870257084F88160FFF7EBF9E070FFF7F6F9C5
+S3150C00A8802071FFF7F3F90823D8406071A671E671C1
+S3150C00A890A4F88630FEF7F8FE94F88430804A012B33
+S3150C00A8A0D7D0B2F886100BB2002B7FF77BAF89B2EC
+S3150C00A8B0C7E7FFF7CDF973780138984270DDFF22B0
+S3150C00A8C001232270A4F886307178754D002940F06A
+S3150C00A8D00481FEF7E3FE0028DED1FE21312202239D
+S3150C00A8E021706270A4F88630A4E7FEF78BFCFF2279
+S3150C00A8F001232270A4F886309CE782794379057986
+S3150C00A900C179D4F88800664E120442EA03232B431D
+S3150C00A91043EA0161FEF7BCFE0028DED0FF220123CC
+S3150C00A9203270A6F8863085E70025FF232370657004
+S3150C00A930A570FFF78DF90723E07025716571A57178
+S3150C00A940A4F8863076E7FF23237081794379027960
+S3150C00A950C679D4F88870090441EA032141EA020356
+S3150C00A96053EA066600F0C880002517F8013B1D4423
+S3150C00A970FFF7A0F9013EEDB2F7D100230121082221
+S3150C00A980257161706371A371E371A370E370A4F810
+S3150C00A99086204FE7FFF75CF97378984200F38E80B8
+S3150C00A9A0FE212222022321706270A4F8863041E730
+S3150C00A9B0FFF74EF972789042F2DD3A48D4F88810D7
+S3150C00A9C0FEF740FCFF2323707278D4F888301344CA
+S3150C00A9D0C4F8883073780133A4F886305CE7FE211E
+S3150C00A9E00022022321706270A4F8863022E7FF222F
+S3150C00A9F0002394F88210227006226370E370237190
+S3150C00AA006371A170A4F8862014E70023FF210122AC
+S3150C00AA1084F8813084F882302170A4F8862009E706
+S3150C00AA20D4F888701E4DFFF713F9721C411E384678
+S3150C00AA30FEF72CFE00283FF450AFFF232B70FFF7D8
+S3150C00AA4007F9D5F88830013803440122C5F8883057
+S3150C00AA50A5F88620EEE6FF232370817943790279E7
+S3150C00AA60C079090441EA0323134343EA0063012234
+S3150C00AA70C4F88830A4F88620DCE6FF230A48237045
+S3150C00AA80072100230822C4F888006370A370E370C2
+S3150C00AA906371A371E3712171A4F88620CAE600BF25
+S3150C00AAA0BC9EFE1FBD9EFE1F8CB90008FE212022F7
+S3150C00AAB0022321706270A4F88630BBE6B2797579F0
+S3150C00AAC03379F1790D48120442EA0522134343EA1D
+S3150C00AAD00161C4F88810727872E7D5F88800B21C48
+S3150C00AAE0FEF7D4FD00283FF4F8AE7278D5F888301E
+S3150C00AAF01344C5F88830CFE635463EE7BD9EFE1FAB
+S3150C00AB0008B5044B586AC0F3403010B100F0C8F8D1
+S3150C00AB10012008BD008F0248642000F095B800BFE4
+S3150C00AB2000F098B8704700BF704700BF704700BF71
+S3150C00AB3000B5C7B0002168464FF48C7200F00BFAD2
+S3150C00AB4069460948FEF766F950B9009828B19DF890
+S3150C00AB50080080F01000C0F3001047B05DF804FB4D
+S3150C00AB60002047B05DF804FB94B900080048704714
+S3150C00AB7094B9000810B5074C0749002320460A2251
+S3150C00AB8084F82832FDF7C8FD10B9012384F8283261
+S3150C00AB9010BD00BF489FFE1FACB9000808B5084899
+S3150C00ABA090F82832012B04D00648BDE80840FEF781
+S3150C00ABB063B9FEF767F80348BDE80840FEF75CB9D1
+S3150C00ABC0489FFE1F94B90008034890F82832012BC1
+S3150C00ABD000D07047FEF756B8489FFE1FF8B5184CC4
+S3150C00ABE094F82832012B06461ED03178D9B1154C73
+S3150C00ABF04FF480771348F6F715FEFEF765FE00F165
+S3150C00AC000A0505E0FFF756F8FEF75EFE854203D30C
+S3150C00AC10D4F81431DB05F5D5C4F8187116F8011FF4
+S3150C00AC200029E7D1F8BDF8BD2146FEF7AFF900289B
+S3150C00AC30DBDA0023204684F82832FEF723F8D4E723
+S3150C00AC40489FFE1F00000340014B1880704700BF51
+S3150C00AC5076A1FE1F10B50E4CFEF736FE2368984201
+S3150C00AC600ED30C4B1A7862B10B4A00204FF00071D0
+S3150C00AC7018705160FEF728FE084B1B88184420609C
+S3150C00AC8010BD054A01204FF4007118705160F1E7B0
+S3150C00AC9078A1FE1F74A1FE1F0085024876A1FE1F37
+S3150C00ACA0024B4FF000725A60704700BF0085024895
+S3150C00ACB0F0B5424D424E0FCD91B00BAC0FC42B6884
+S3150C00ACC023600BA800248DF80740F6F781F8204680
+S3150C00ACD0F5F7BEFE2046F5F7B1FE0420F5F7C8FEE3
+S3150C00ACE0F5F7FEFE20210120F5F704FF0120F5F70C
+S3150C00ACF0C9FEF5F7FDFA334809218022F6F7C8FCA0
+S3150C00AD0022460D213046F6F7C3FC336E2E4823F44B
+S3150C00AD1000533366F5F76AFEF5F746FF00F09EF82A
+S3150C00AD20FEF7DAFE20460DF1070100F0B7F89DF8A4
+S3150C00AD300730012B3FD001250224002723488DF82C
+S3150C00AD400870042102AA902603958DF81040F5F799
+S3150C00AD50E3FD1E480695052105AA8DF81C408DF8C5
+S3150C00AD601460F5F7D9FD1A491848CB6910AA23F0D7
+S3150C00AD7007032B43CB6102F8207D0D21F5F7CCFDA3
+S3150C00AD800BAA12488DF82C600C210C958DF83440CA
+S3150C00AD90F5F7C2FD0F4B1A6842F040021A60DA68EA
+S3150C00ADA022F007022243DA601A6822F040021A6087
+S3150C00ADB0FEF7A4FEFCE7FEF76FFFBCE7BCB9000884
+S3150C00ADC0008F02480085024880000020008102485E
+S3150C00ADD0000003400043014830B40D4D294605F1EF
+S3150C00ADE03B0051F8034BC4F30742C4F30723134447
+S3150C00ADF053FA84F2230E13FA82F39BB211F8012F45
+S3150C00AE00134481429BB2F9D15B42AB8730BC70478D
+S3150C00AE100080FE1F30B4104D294605F13B0051F859
+S3150C00AE20034BC4F30742C4F30723134453FA84F2C7
+S3150C00AE30230E13FA82F39BB211F8012F13448142AD
+S3150C00AE409BB2F9D1A88F5B429BB2C01A30BCB0FA48
+S3150C00AE5080F04009704700BF0080FE1F10B50C4CF7
+S3150C00AE600C4B22689A420DD00B4B0A4A226003F116
+S3150C00AE703801002203F8012F8B42FBD1BDE81040AC
+S3150C00AE80FFF7AABFFFF7C6FF0028EDD010BD00BF25
+S3150C00AE900080FE1FA2E742CE0380FE1F70B50B4D4D
+S3150C00AEA00B4B2A689A4201D0002070BD0E46044610
+S3150C00AEB0FFF7B0FF40B1372CF6D8002EF4D02C4457
+S3150C00AEC001202379337070BD70BD00BF0080FE1F5A
+S3150C00AED0A2E742CE70B50E4B0E4CE41AA410002518
+S3150C00AEE01E46A54204D056F8253098470135F8E79A
+S3150C00AEF0F9F716F8084C094BE41AA41000251E465F
+S3150C00AF00A54204D056F8253098470135F8E770BDB0
+S3150C00AF102C89FE1F2C89FE1F2C89FE1F2C89FE1FD7
+S3150C00AF2010B50A44441E914208D014F8013F087823
+S3150C00AF30834201D0181A10BD0131F4E7002010BD70
+S3150C00AF4010B5431E0A44914204D011F8014B03F884
+S3150C00AF50014FF8E710BD02440346934202D003F8B2
+S3150C00AF60011BFAE77047034613F8012B002AFBD1A5
+S3150C00AF70181A013870470000010000400008000054
+S3150C00AF802D3000086D3000088D300008293E000871
+S3150C00AF903931000800000000000004506B0000006E
+S3150C00AFA0070000000008000009040000050F21003E
+S3150C00AFB0011C100500DF60DDD88945C74C9CD265A5
+S3150C00AFC09D9E648A9F000003069E000100000000FF
+S3150C00AFD00A000000000003069E00140003005749F7
+S3150C00AFE04E55534200000000000000000000800097
+S3150C00AFF00400010028004400650076006900630027
+S3150C00B000650049006E007400650072006600610000
+S3150C00B01063006500470055004900440000004E00DF
+S3150C00B0207B00380030003700390039003900430006
+S3150C00B03033002D0045003400450030002D0034004F
+S3150C00B0403000450041002D00380031003800380032
+S3150C00B0502D0034003800450038003500320042001F
+S3150C00B060350034004600320042007D00000000002E
+S3150C00B0704F70656E424C542055736572000000008B
+S3150C00B08057696E5553422042756C6B204465766940
+S3150C00B0906365000009022000010100804B090400D1
+S3150C00B0A00002FF00000007050102400000070581B1
+S3150C00B0B0024000001201010200000040501DAC606D
+S3150C00B0C000010102030100008000000000000100E5
+S3150C00B0D001000000010000008000000000000100DB
+S3150C00B0E001000000010000008000000000000100CB
+S3150C00B0F001000000010000008000000000000100BB
+S3150C00B10001000000010000008000000000000100AA
+S3150C00B110010000000100000080000000000001009A
+S3150C00B12001000000010000000000000020000000EB
+S3150C00B130400000008000000000010000000200003A
+S3150C00B14000040000000800000010000000200000B1
+S3150C00B150000009021A0300043A061B071A0809091B
+S3150C00B160090A1B0C1A0D000F1A103A113A123A184A
+S3150C00B1703A193A1B1A1C1A1D3A1E1A201A211B269A
+S3150C00B1803A2A1A373A381A063A0D3A161A17022973
+S3150C00B1901A2A3A3312011B051B063A081A231A24DB
+S3150C00B1A0000102030400000000010204FFFFFFFF80
+S3150C00B1B0FFFF0000ADDE122363825363C700FC0061
+S3150C00B1C0E900E200E400E000E500E700EA00EB003D
+S3150C00B1D0E800EF00EE00EC00C400C500C900E60074
+S3150C00B1E0C600F400F600F200FB00F900FF00D600E2
+S3150C00B1F0DC00A200A300A500A7209201E100ED004F
+S3150C00B200F300FA00F100D100AA00BA00BF00102327
+S3150C00B210AC00BD00BC00A100AB00BB009125922583
+S3150C00B220932502252425612562255625552563255A
+S3150C00B230512557255D255C255B25102514253425C0
+S3150C00B2402C251C2500253C255E255F255A255425D5
+S3150C00B25069256625602550256C2567256825642596
+S3150C00B260652559255825522553256B256A251825FC
+S3150C00B2700C25882584258C2590258025B103DF0097
+S3150C00B2809303C003A303C303B500C403A603980327
+S3150C00B290A903B4031E22C603B50329226122B100F9
+S3150C00B2A06522642220232123F7004822B0001922AC
+S3150C00B2B0B7001A227F20B200A025A0007D1D010038
+S3150C00B2C0632C001E9601A01E5A01001F0806101FB3
+S3150C00B2D00606201F0806301F0806401F0606511FCB
+S3150C00B2E00700591F521F5B1F541F5D1F561F5F1F00
+S3150C00B2F0601F0806701F0E00BA1FBB1FC81FC91F90
+S3150C00B300CA1FCB1FDA1FDB1FF81FF91FEA1FEB1F23
+S3150C00B310FA1FFB1F801F0806901F0806A01F0806B1
+S3150C00B320B01F0400B81FB91FB21FBC1FCC1F0100F1
+S3150C00B330C31FD01F0206E01F0206E51F0100EC1F0B
+S3150C00B340F21F0100FC1F4E21010032217021100258
+S3150C00B350842101008321D0241A05302C2F04602C63
+S3150C00B3600201672C0601752C0201802C6401002D4C
+S3150C00B370260841FF1A03000061001A03E0001703B8
+S3150C00B380F8000703FF0001007801000130013201CB
+S3150C00B3900601390110014A012E01790106018001CD
+S3150C00B3A04D004302810182018201840184018601E0
+S3150C00B3B08701870189018A018B018B018D018E0121
+S3150C00B3C08F0190019101910193019401F60196016F
+S3150C00B3D09701980198013D029B019C019D01200259
+S3150C00B3E09F01A001A001A201A201A401A401A60132
+S3150C00B3F0A701A701A901AA01AB01AC01AC01AE01E1
+S3150C00B400AF01AF01B101B201B301B301B501B50191
+S3150C00B410B701B801B801BA01BB01BC01BC01BE0140
+S3150C00B420F701C001C101C201C301C401C501C401B8
+S3150C00B430C701C801C701CA01CB01CA01CD01100160
+S3150C00B440DD0101008E01DE011201F3010300F101A1
+S3150C00B450F401F401F8012801220212013A02090052
+S3150C00B460652C3B023B023D02662C3F024002410228
+S3150C00B470410246020A01530240008101860155022F
+S3150C00B48089018A0158028F015A0290015C025D0201
+S3150C00B4905E025F029301610262029401640265021C
+S3150C00B4A066026702970196016A02622C6C026D02B3
+S3150C00B4B06E029C01700271029D01730274029F015F
+S3150C00B4C076027702780279027A027B027C02642C7D
+S3150C00B4D07E027F02A60181028202A90184028502F4
+S3150C00B4E086028702AE014402B101B20145028D0209
+S3150C00B4F08E028F0290029102B7017B030300FD03BB
+S3150C00B500FE03FF03AC0304008603880389038A0346
+S3150C00B510B1031103C2030200A303A303C40308036C
+S3150C00B520CC0303008C038E038F03D8031801F2039C
+S3150C00B5300A00F903F303F403F503F603F703F70321
+S3150C00B540F903FA03FA0330042003500410076004CD
+S3150C00B55022018A043601C1040E01CF040100C00485
+S3150C00B560D00444016105260400000000222A3A3C5E
+S3150C00B5703E3F7C7F000000002B2C3B3D5B5D0000BA
+S3150C00B580809A45418E418F804545454949498E8F64
+S3150C00B5909092924F994F555559999A9B9C9D9E9F67
+S3150C00B5A041494F55A5A5A6A7A8A9AAABACADAEAF68
+S3150C00B5B0B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF01
+S3150C00B5C0C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFF1
+S3150C00B5D0D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE1
+S3150C00B5E0E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFD1
+S3150C00B5F0F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFC1
+S3150C00B60001030507090E10121416181C1E00000063
+S3150C00B61000C0000C00400000030000000000010CFC
+S3150C00B62000400000040000000040010C0040000037
+S3150C00B630050000000080010C004000000600000020
+S3150C00B64000C0010C00400000070000000000020CC6
+S3150C00B65000000200080000000000040C00000400BA
+S3150C00B660090000000000080C000004000A0000009D
+S3150C00B67000000C0C000004000B0000000000100C75
+S3150C00B680000004000C0000000000140C0000040074
+S3150C00B6900D0000000000180C000004000E00000055
+S3150C00B6A000001C0C000004000F000000433A2F574A
+S3150C00B6B06F726B2F736F6674776172652F4F70653F
+S3150C00B6C06E424C545F57696E5553425F4175746FA9
+S3150C00B6D05F496E7374616C6C2F5461726765742F5D
+S3150C00B6E0536F757263652F41524D434D345F584D00
+S3150C00B6F043342F666C6173682E630000433A2F57F0
+S3150C00B7006F726B2F736F6674776172652F4F7065EE
+S3150C00B7106E424C545F57696E5553425F4175746F58
+S3150C00B7205F496E7374616C6C2F5461726765742F0C
+S3150C00B730536F757263652F41524D434D345F584DAF
+S3150C00B74043342F72733233322E630000433A2F5731
+S3150C00B7506F726B2F736F6674776172652F4F70659E
+S3150C00B7606E424C545F57696E5553425F4175746F08
+S3150C00B7705F496E7374616C6C2F5461726765742FBC
+S3150C00B780536F757263652F41524D434D345F584D5F
+S3150C00B79043342F7573622E6300000000303A0000AC
+S3150C00B7A0433A2F576F726B2F736F6674776172659E
+S3150C00B7B02F4F70656E424C545F57696E5553425FFE
+S3150C00B7C04175746F5F496E7374616C6C2F54617242
+S3150C00B7D06765742F536F757263652F66696C652E7A
+S3150C00B7E0630000004669726D77617265207570643E
+S3150C00B7F06174652072657175657374206465746512
+S3150C00B800637465640A0D00004F70656E696E67207F
+S3150C00B8106669726D776172652066696C6520666F04
+S3150C00B820722072656164696E672E2E2E0000000010
+S3150C00B8304552524F520A0D004F4B0A0D00000000A4
+S3150C00B8405374617274696E67207468652070726FC8
+S3150C00B8506772616D6D696E672073657175656E6370
+S3150C00B860650A0D0050617273696E67206669726DA8
+S3150C00B870776172652066696C6520746F20646574E7
+S3150C00B88065637420657261736520626C6F636B739C
+S3150C00B8902E2E2E0045726173696E67200000000023
+S3150C00B8A02062797465732066726F6D206D656D6F9D
+S3150C00B8B07279206174203078000000005265616452
+S3150C00B8C0696E67206C696E652066726F6D2066699D
+S3150C00B8D06C652E2E2E4552524F520A0D000000005A
+S3150C00B8E0496E76616C696420636865636B73756D0C
+S3150C00B8F020666F756E642E2E2E4552524F520A0DCF
+S3150C00B9000000000050726F6772616D6D696E672082
+S3150C00B9100000000020627974657320746F206D65D9
+S3150C00B9206D6F7279206174203078000057726974DB
+S3150C00B930696E672070726F6772616D2063686563EC
+S3150C00B9406B73756D2E2E2E00436C6F73696E6720AC
+S3150C00B9506669726D776172652066696C650A0D00A1
+S3150C00B9604669726D776172652075706461746520C5
+S3150C00B9707375636365737366756C6C7920636F6D31
+S3150C00B980706C657465640A0D000000004F70656E7E
+S3150C00B990424C54002F64656D6F70726F675F786DE3
+S3150C00B9A063343730302E7372656300002F626F6F0D
+S3150C00B9B0746C6F672E7478740000000030020101FD
+S3150C00B9C0000001000000000000000100020101015E
+S3150C00B9D0002020202020202020202828282828204D
+S3150C00B9E02020202020202020202020202020202045
+S3150C00B9F020881010101010101010101010101010AD
+S3150C00BA00100404040404040404040410101010109C
+S3150C00BA101010414141414141010101010101010166
+S3150C00BA2001010101010101010101010110101010B8
+S3150C00BA301010424242424242020202020202020238
+S3150C00BA40020202020202020202020202101010108C
+S3150C00BA5020000000000000000000000000000000B4
+S3150C00BA6000000000000000000000000000000000C4
+S3150C00BA7000000000000000000000000000000000B4
+S3150C00BA8000000000000000000000000000000000A4
+S3150C00BA900000000000000000000000000000000094
+S3150C00BAA00000000000000000000000000000000084
+S3150C00BAB00000000000000000000000000000000074
+S3150C00BAC00000000000000000000000000000000064
+S3090C00BAD00000000060
+S3150C00BAD400C0005000000000080027695B45000008
+S3150C00BAE420300020A02F0020D017002000000020BA
+S3150C00BAF40000000004040000000000000000000028
+S3150C00BB04991B00087CA1FE1F10000C00000000000D
+S3150C00BB14FF00000030313233343536373839414280
+S3150C00BB2443444546000000000000000000000000ED
+S3150C00BB340000000000000000A8AF000870B0000868
+S3150C00BB4480B000088488FE1F00C001480000000075
+S3150C00BB54000000003F000000000000000000000090
+S3150C00BB6400000000000000000000000000000000BF
+S3150C00BB7400000000000000000000000000000000AF
+S3150C00BB84000000000000000000000000000000009F
+S3150C00BB94000000000000000000000000000000008F
+S3150C00BBA400000000B888FE1FE942000803000000EC
+S3110C00BBB40000000004010000D0B90008DD
S70508000201EF
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/tusb_config.h b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/tusb_config.h
index 0dc157b03..7f727684e 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/tusb_config.h
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/tusb_config.h
@@ -71,6 +71,11 @@
// require tud_int_handler() to be called continuously in the program's infinite loop.
#define CFG_TUSB_POLLING_ENABLED 1
+// Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+// makes it possible to automatically install WinUSB devices without having to provide
+// a device specific INF file.
+#define CFG_TUD_WINUSB_ENABLED 1
+
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
* Tinyusb use follows macros to declare transferring memory so that they can be put
* into those specific section.
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/usb_descriptors.c b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/usb_descriptors.c
index f90e1e7a2..dc44939b8 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/usb_descriptors.c
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_GCC/Boot/Libraries/TinyUSB/cfg/usb_descriptors.c
@@ -24,33 +24,88 @@
*/
#include "tusb.h"
+#include "xmc_common.h"
-/* USB Vendor and Product identifiers. */
-#define USB_VID (0x1d50)
-#define USB_PID (0x60ac)
+
+#define USB_VID 0x1D50 // OpenMoko
+#define USB_PID 0x60AC // OpenBLT Bootloader
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+#define USB_BCD 0x0201 // Needs to be >= 2.01 for BOS
+#else
+#define USB_BCD 0x0200
+#endif
+
+//--------------------------------------------------------------------+
+// Unique ID string
+//--------------------------------------------------------------------+
+// Length of the unique ID in bytes. On the XMC4xxx, the unique chip
+// identifier is 16 bytes.
+#define UID_STR_BYTE_LEN (16U)
+
+// NUL terminated character array for storing the device's unique
+// identifier. Callback function tud_descriptor_string_cb() overwrites
+// its default value with the actual device's unique identifier.
+static char uniqueIdStr[(UID_STR_BYTE_LEN * 2U) + 1U] = "0123456789ABCDEF";
+
+
+// Initializes the string that holds the ASCII representation of the device's
+// unique identifier.
+static void UniqueIdStrInit(void)
+{
+ uint8_t charIdx = 0U;
+ static uint8_t initialized = 0U;
+
+ // Only initialize once.
+ if (initialized == 0U)
+ {
+ // Update flag.
+ initialized = 1U;
+ // Loop through all unique identifier bytes.
+ for (uint8_t idx = 0U; idx < UID_STR_BYTE_LEN; idx++)
+ {
+ // Convert byte value to nibbles.
+ uint8_t nibbles[2];
+ nibbles[0] = (g_chipid[idx] >> 4U) & 0x0F;
+ nibbles[1] = g_chipid[idx] & 0x0F;
+ // Loop through the nibbles.
+ for (uint8_t n = 0U; n < sizeof(nibbles); n++)
+ {
+ // Convert the nibble to an ASCII character.
+ char nibbleChr = (nibbles[n] < 10U) ? nibbles[n] + '0' : nibbles[n] - 10 + 'A';
+ // Store the ASCII character in the string.
+ uniqueIdStr[charIdx] = nibbleChr;
+ // Update indexer for the next character.
+ charIdx++;
+ }
+ }
+ // Add NUL termination.
+ uniqueIdStr[charIdx] = '\0';
+ }
+}
//--------------------------------------------------------------------+
// Device Descriptors
//--------------------------------------------------------------------+
tusb_desc_device_t const desc_device =
{
- .bLength = sizeof(tusb_desc_device_t),
- .bDescriptorType = TUSB_DESC_DEVICE,
- .bcdUSB = 0x0200,
- .bDeviceClass = 0x00,
- .bDeviceSubClass = 0x00,
- .bDeviceProtocol = 0x00,
- .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
-
- .idVendor = USB_VID,
- .idProduct = USB_PID,
- .bcdDevice = 0x0200,
-
- .iManufacturer = 0x01,
- .iProduct = 0x02,
- .iSerialNumber = 0x03,
-
- .bNumConfigurations = 0x01
+ .bLength = sizeof(tusb_desc_device_t),
+ .bDescriptorType = TUSB_DESC_DEVICE,
+ .bcdUSB = USB_BCD,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+
+ .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
+
+ .idVendor = USB_VID,
+ .idProduct = USB_PID,
+ .bcdDevice = 0x0100,
+
+ .iManufacturer = 0x01,
+ .iProduct = 0x02,
+ .iSerialNumber = 0x03,
+
+ .bNumConfigurations = 0x01
};
// Invoked when received GET DEVICE DESCRIPTOR
@@ -78,7 +133,7 @@ enum
uint8_t const desc_fs_configuration[] =
{
// Config number, interface count, string index, total length, attribute, power in mA
- TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
+ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 150),
// Interface number, string index, EP Out & EP In address, EP size
TUD_VENDOR_DESCRIPTOR(ITF_NUM_VENDOR, 0, EPNUM_VENDOR_OUT, EPNUM_VENDOR_IN, 64),
@@ -94,6 +149,103 @@ uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
return desc_fs_configuration;
}
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+//--------------------------------------------------------------------+
+// BOS Descriptor
+//--------------------------------------------------------------------+
+
+/* Microsoft OS 2.0 registry property descriptor per MS requirements:
+ * https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx
+ * device should create DeviceInterfaceGUID. It can be done by driver and
+ * in case of real PnP solution device should expose MS "Microsoft OS 2.0
+ * registry property descriptor". Such descriptor can insert any record
+ * into Windows registry per device/configuration/interface. In our case it
+ * will insert "DeviceInterfaceGUID" string property.
+ */
+
+#define BOS_TOTAL_LEN (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)
+
+#define MS_OS_20_DESC_LEN 0x9E
+
+#define VENDOR_REQUEST_MICROSOFT 1
+
+// BOS Descriptor is required for MS OS 2.0.
+uint8_t const desc_bos[] =
+{
+ // total length, number of device caps
+ TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),
+
+ // Microsoft OS 2.0 descriptor
+ TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, VENDOR_REQUEST_MICROSOFT)
+};
+
+uint8_t const * tud_descriptor_bos_cb(void)
+{
+ return desc_bos;
+}
+
+uint8_t const desc_ms_os_20[] =
+{
+ // Set header: length, type, windows version, total length
+ U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),
+
+ // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID
+ U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible
+
+ // MS OS 2.0 Registry property descriptor: length, type
+ U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),
+ U16_TO_U8S_LE(0x0001), U16_TO_U8S_LE(0x0028), // wPropertyDataType, wPropertyNameLength and PropertyName "DeviceInterfaceGUID\0" in UTF-16
+ 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,
+ 'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00,
+
+ U16_TO_U8S_LE(0x004E), // wPropertyDataLength
+ //bPropertyData: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0"
+ '{', 0x00, '8', 0x00, '0', 0x00, '7', 0x00, '9', 0x00, '9', 0x00, '9', 0x00, 'C', 0x00, '3', 0x00, '-', 0x00,
+ 'E', 0x00, '4', 0x00, 'E', 0x00, '0', 0x00, '-', 0x00, '4', 0x00, '0', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00,
+ '8', 0x00, '1', 0x00, '8', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '8', 0x00, 'E', 0x00, '8', 0x00, '5', 0x00,
+ '2', 0x00, 'B', 0x00, '5', 0x00, '4', 0x00, 'F', 0x00, '2', 0x00, 'B', 0x00, '}', 0x00, 0x00, 0x00
+};
+
+TU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, "Incorrect size");
+
+bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
+{
+ // nothing to with DATA & ACK stage
+ if (stage != CONTROL_STAGE_SETUP) return true;
+
+ switch (request->bmRequestType_bit.type)
+ {
+ case TUSB_REQ_TYPE_VENDOR:
+ switch (request->bRequest)
+ {
+ case VENDOR_REQUEST_MICROSOFT:
+ if ( request->wIndex == 7 )
+ {
+ // Get Microsoft OS 2.0 compatible descriptor
+ uint16_t total_len;
+ memcpy(&total_len, desc_ms_os_20+8, 2);
+
+ return tud_control_xfer(rhport, request, (void*)(uintptr_t) desc_ms_os_20, total_len);
+ }else
+ {
+ return false;
+ }
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // stall unknown request
+ return false;
+}
+#endif /* (CFG_TUD_WINUSB_ENABLED == 1) */
+
//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+
@@ -104,7 +256,7 @@ char const* string_desc_arr [] =
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"OpenBLT User", // 1: Manufacturer
"WinUSB Bulk Device", // 2: Product
- "123456789012", // 3: Serials, should use chip ID
+ uniqueIdStr, // 3: Serials, use chip ID
};
static uint16_t _desc_str[32];
@@ -117,6 +269,9 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
uint8_t chr_count;
+ // Make sure the unique identifier string is initialized.
+ UniqueIdStrInit();
+
if ( index == 0)
{
memcpy(&_desc_str[1], string_desc_arr[0], 2);
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/bin/openblt_xmc4700.srec b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/bin/openblt_xmc4700.srec
index 045d273aa..5feb86256 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/bin/openblt_xmc4700.srec
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/bin/openblt_xmc4700.srec
@@ -1,36 +1,36 @@
S01700006F70656E626C745F786D63343730302E73726563A7
-S31508000000A8A9FE1FD1B300081DB4000821B4000832
-S3150800001025B4000829B400082DB400080000000023
-S3150800002000000000000000000000000031B40008D5
-S3150800003035B400080000000039B400083DB40008D3
-S3150800004041B4000845B4000849B400084DB4000896
-S3150800005051B4000855B4000859B400085DB4000846
-S3150800006061B4000800000000000000000000000065
-S3150800007065B400080000000069B400086DB4000803
-S3150800008071B4000875B4000879B400087DB4000896
-S3150800009081B4000885B4000889B400088DB4000846
-S315080000A091B4000895B4000899B400089DB40008F6
-S315080000B0A1B40008A5B40008A9B40008ADB40008A6
-S315080000C0B1B40008B5B40008B9B40008BDB4000856
-S315080000D0C1B40008C5B40008C9B40008CDB4000806
-S315080000E0D1B40008D5B40008D9B40008DDB40008B6
-S315080000F0E1B40008E5B40008E9B40008EDB4000866
-S31508000100F1B40008F5B40008F9B40008FDB4000815
-S3150800011001B5000805B5000809B500080DB50008C1
-S3150800012011B5000815B5000819B500081DB5000871
-S3150800013021B5000825B5000829B500082DB5000821
-S3150800014031B5000835B5000839B500083DB50008D1
-S3150800015041B5000845B5000849B500084DB5000881
+S31508000000D0A9FE1F59B6000895B6000899B600088B
+S315080000109DB60008A1B60008A5B6000800000000B5
+S31508000020000000000000000000000000A9B600085B
+S31508000030ADB6000800000000B1B60008B5B6000865
+S31508000040B9B60008BDB60008C1B60008C5B60008AE
+S31508000050C9B60008CDB60008D1B60008D5B600085E
+S31508000060D9B60008000000000000000000000000EB
+S31508000070DDB6000800000000E1B60008E5B6000895
+S31508000080E9B60008EDB60008F1B60008F5B60008AE
+S31508000090F9B60008FDB6000801B7000805B700085C
+S315080000A009B700080DB7000811B7000815B700080A
+S315080000B019B700081DB7000821B7000825B70008BA
+S315080000C029B700082DB7000831B7000835B700086A
+S315080000D039B700083DB7000841B7000845B700081A
+S315080000E049B700084DB7000851B7000855B70008CA
+S315080000F059B700085DB7000861B7000865B700087A
+S3150800010069B700086DB7000871B7000875B7000829
+S3150800011079B700087DB7000881B7000885B70008D9
+S3150800012089B700088DB7000891B7000895B7000889
+S3150800013099B700089DB70008A1B70008A5B7000839
+S31508000140A9B70008ADB70008B1B70008B5B70008E9
+S31508000150B9B70008BDB70008C1B70008C5B7000899
S315080001600000000000000000000000000000000081
-S3150800017051B5000855B5000859B500085DB5000821
-S3150800018061B5000865B5000869B500086DB50008D1
-S3150800019071B5000875B5000879B500087DB5000881
-S315080001A081B5000885B5000889B500088DB5000831
-S315080001B091B5000895B5000899B500089DB50008E1
-S315080001C0A1B50008A5B50008A9B50008ADB5000891
-S315080001D0B1B50008B5B50008B9B5000800000000BB
-S315080001E0BDB50008C1B50008A53B0008C5B500089F
-S315080001F0C9B5000800000000CDB5000800000000E1
+S31508000170C9B70008CDB70008D1B70008D5B7000839
+S31508000180D9B70008DDB70008E1B70008E5B70008E9
+S31508000190E9B70008EDB70008F1B70008F5B7000899
+S315080001A0F9B70008FDB7000801B8000805B8000847
+S315080001B009B800080DB8000811B8000815B80008F5
+S315080001C019B800081DB8000821B8000825B80008A5
+S315080001D029B800082DB8000831B80008000000004A
+S315080001E035B8000839B80008A53B00083DB800082E
+S315080001F041B800080000000045B8000800000000EB
S315080002004178007840EA01207047C178827842EA4E
S315080002100122417841EA0221007840EA012070472C
S315080002200170090A417070470170090A4170090A8C
@@ -443,12 +443,12 @@ S31508001B801DD1387C00F0BF00387401232A4607F1BE
S31508001B9028010098407800F02DF900280FD1FD6142
S31508001BA07869F968814204D2F860387C40F02000F0
S31508001BB038743046BDE8F68102207874FAE70120C9
-S31508001BC07874F7E7C8B0000831B58EB00C46002225
+S31508001BC07874F7E7F0B2000831B58EB00C460022FB
S31508001BD003A90EA8FFF72AFB050016D168460B9045
S31508001BE0DFF8F0000D900E9903A8FFF78DFA0500AF
S31508001BF00BD10B98C07A000601D5062505E0002C06
S31508001C0003D0214603A8FFF70DF928460FB030BDCB
-S31508001C10464154005CA1FE1F31B59AB00024022249
+S31508001C104641540084A1FE1F31B59AB00024022221
S31508001C2069461AA8FFF702FB05000098019048D1FB
S31508001C300CA8099027480B901A9901A8FFF764FA8F
S31508001C4005003ED10998C07A000601D5062504E0AC
@@ -460,7 +460,7 @@ S31508001C902846042800D10025280012D101A8FFF7FC
S31508001CA09AF8050007D1002C05D00022214601A884
S31508001CB0FEF760FC0546280003D10098FEF724FBD2
S31508001CC0054628461BB030BD00000000525261414F
-S31508001CD0727241613C97FE1F000061482DE9FC4184
+S31508001CD0727241616497FE1F000061482DE9FC415C
S31508001CE005460F46904600242E46781E844211DA91
S31508001CF001AB012269464046FFF7CAFC0198012854
S31508001D0008D19DF800000D28EFD006F8010B641CD9
@@ -484,7 +484,7 @@ S31508001E1011A1085C02BD000080B5002801D004208D
S31508001E2002BD002B01D1042002BDDBB2094800F037
S31508001E30B7F800BF08A1085C02BD000080B50028FD
S31508001E4001D0042002BD034800F0BEF802A1085CD8
-S31508001E5002BD00005882FE1F0001020304000000B4
+S31508001E5002BD00008082FE1F00010203040000008C
S31508001E60000102040246802A00DA704710B40029ED
S31508001E700BD0B2F5807F01DB002017E02C4800EB81
S31508001E804200A0F58070008810E000210346284C27
@@ -498,7 +498,7 @@ S31508001EF005090E10121416181A005B1A34F8130086
S31508001F0012E0411A01F00101401A0DE010380BE009
S31508001F10203809E0303807E01A3805E0083003E0D1
S31508001F20503801E0A0F5E35080B270BC704700005D
-S31508001F3070AE00085CA6000870B5044600252E465B
+S31508001F30A8AF000894A7000870B5044600252E46E9
S31508001F40607B012812D06068002800D08047207B7B
S31508001F50002803D1204601F0C9FC0646002E03D00E
S31508001F6001250020607301E001206073284670BDDA
@@ -839,12 +839,12 @@ S3150800344051762268117622689176216891F85A1089
S31508003450012915D1324603992046FFF7DFFE010000
S315080034600ED1002120680068FEF79FFF0220019018
S315080034700095DFF84C34324603A92046FFF76EFB69
-S3150800348004B070BD48B100087CB504460D46164622
+S3150800348004B070BDC0B300087CB504460D461646A8
S315080034902A20216891F85A1001291AD101223146A9
S315080034A02046FFF7BBFE010013D1607A000700D45F
S315080034B07602002120680068FEF777FF0220019057
S315080034C000954FF400733246DFF8F8132046FFF7ED
-S315080034D079FB76BD54B100082DE9F0479AB0054648
+S315080034D079FB76BDCCB300082DE9F0479AB00546CE
S315080034E08946904610A8DFF8E013282200F098FADB
S315080034F000224021684600F065FA012029684876CE
S315080035002968087629688876287A400710D50F240E
@@ -859,7 +859,7 @@ S315080035802010514320460C4601E0D1463F1BA74276
S3150800359009D304EB090A3346524649462846FFF73B
S315080035A04DFE0100F1D00446494638463346002808
S315080035B0AED042462846FFF741FE0446A8E700007B
-S315080035C060B100082DE9FE4304460E461546FFF78E
+S315080035C0D8B300082DE9FE4304460E461546FFF714
S315080035D02DFD8146002847D1002120680068FEF7A6
S315080035E0E4FE77787F1C7F087F00BF1CDFF8DC824B
S315080035F002A8009001233A4608F118012046FFF771
@@ -874,7 +874,7 @@ S3150800367004460D460020019001A800900123206809
S31508003680B0F84C20120492492046FFF725F80100AD
S315080036900FD10199890106D501212970217A41F0B6
S315080036A0080121723EBD00212970217A01F0F70137
-S315080036B021723EBD4CB10008007A00F00F00704739
+S315080036B021723EBDC4B30008007A00F00F007047BF
S315080036C0407A0860002070470268526AC2F30B020B
S315080036D00A800268936A526A120C42EA03424A60F6
S315080036E00268926A120C0A720268D26A120E4A724A
@@ -905,10 +905,10 @@ S3150800386070BD38B504460125207A800713D4002098
S31508003870009003462068B0F84C20120415492046EB
S31508003880FEF72AFF050006D12046FEF7C1FD0020F7
S31508003890216881F85A00284632BD000001000080E0
-S315080038A050B100080000FF100080FF005AB1000860
-S315080038B00080FF10A086010064B1000862B100080C
-S315080038C068B1000866B10008B8B2000848B1000837
-S315080038D05CB100085EB1000880B52C21027A520658
+S315080038A0C8B300080000FF100080FF00D2B300086C
+S315080038B00080FF10A0860100DCB30008DAB3000818
+S315080038C0E0B30008DEB300081CB50008C0B3000862
+S315080038D0D4B30008D6B3000880B52C21027A520664
S315080038E002D4FFF7FAFC0146084602BD10B50446A5
S315080038F02068006800F002FA022000F067FB204604
S31508003900FFF734FD2046BDE81040E5E738B5044624
@@ -942,7 +942,7 @@ S31508003AB010494160002181600521016000200E49FE
S31508003AC0086001BD0A4800210160416081607047B5
S31508003AD007480068C00303D507480168491C016008
S31508003AE0704780B5FFF7F4FF0348006802BD000081
-S31508003AF010E000E07F32020080A1FE1F00F042BC09
+S31508003AF010E000E07F320200A8A1FE1F00F042BCE1
S31508003B0000F043BC62F30F2262F31F42401810F024
S31508003B10030308D0C91A1FD3DB0748BF00F8012DD5
S31508003B2028BF20F8022D130030B414461546103964
@@ -967,7 +967,7 @@ S31508003C401EA20721284600F033FC01220721284638
S31508003C5000F08AFC1DA20121204600F029FC012261
S31508003C601146204600F080FC0B4C4FF4803120466C
S31508003C70FFF77CFF4FF480112046BDE834407CE70F
-S31508003C80B44000509C4000505482FE1F00830248F6
+S31508003C80B44000509C4000507C82FE1F00830248CE
S31508003C90008402480081024800C0014880000000F4
S31508003CA00000010001000000010000008000000083
S31508003CB00000010001000000010000008000000073
@@ -1050,7 +1050,7 @@ S31508004170F1F0401E45EA00452560206920F400302C
S31508004180206131BD5A48006800F46070B0F5607F60
S3150800419001D1012070470020704763490A686148C9
S315080041A002400A6070476048016841F4803141F076
-S315080041B00201016070470000A0A1FE1F2DE9F84327
+S315080041B00201016070470000C8A1FE1F2DE9F843FF
S315080041C08046894615461E46089CFFF7A9FE484FB5
S315080041D0B9F1010F54D1B8F1000F06D100F012FA67
S315080041E03C49B0FBF1F0800501E04FF0C060704338
@@ -1095,7 +1095,7 @@ S3150800444018E0104D284600F05AF9FFF74AFB0646D1
S315080044500A362846FFF781FFC00505D4FFF750FB4B
S31508004460FFF73FFB8642F4D24FF480712846FFF7E8
S3150800447079FF641C21780029E3D170BD008F0248BA
-S315080044801095FE1F000003402F626F6F746C6F67F4
+S315080044803895FE1F000003402F626F6F746C6F67CC
S315080044902E747874000000002F64656D6F70726F5B
S315080044A0675F786D63343730302E7372656300004A
S315080044B0F0B40E4626F00303C418CD0005F018051F
@@ -1119,13 +1119,13 @@ S315080045C0B0FBF1F0584306E001F07F01491CB0FB4F
S315080045D0F1F000E00948216801F0FF01491CB0FB31
S315080045E0F1F0616801F00101491CB0FBF1F00449E2
S315080045F0086031BD0C4600501047005000366E0169
-S31508004600A0A1FE1F00487047001BB70002FA01F17F
+S31508004600C8A1FE1F00487047001BB70002FA01F157
S315080046104160704713494880704710B5114CFFF741
S3150800462060FA6168884216D30F482178002906D1B6
S31508004630012121700A460921FFF7E8FF06E000215B
S3150800464021704FF480320921FFF7E0FFFFF749FA9E
S3150800465061884018606010BD4FF480320921024815
-S31508004660D4E7000064A1FE1F00850248806B00F0B5
+S31508004660D4E700008CA1FE1F00850248806B00F08D
S3150800467080007047C1647047F8B504460D46164673
S31508004680102700F05FF8287A002800D00746002E89
S315080046900AD02968287900283A46204602D000F030
@@ -1366,10 +1366,10 @@ S31508005530F00616D5A86920F01000A8612046FFF7E6
S31508005540EEFD6868C006F9D40C4F3878002804D0F8
S315080055502046FFF755FA00203870A86940F0100079
S31508005560A861300302D52046FFF744FE700302D532
-S315080055702046FFF7A9FEF7BD249CFE1F7CA1FE1F4F
-S3150800558050A1FE1F77FFC5FF0000544F000031559C
-S3150800559000003255163800800A30544F2C9CFE1FE6
-S315080055A054A1FE1FFCFF03000001000000000000DC
+S315080055702046FFF7A9FEF7BD4C9CFE1FA4A1FE1FFF
+S3150800558078A1FE1F77FFC5FF0000544F0000315574
+S3150800559000003255163800800A30544F549CFE1FBE
+S315080055A07CA1FE1FFCFF03000001000000000000B4
S315080055B000000000000600000000000000000000D7
S315080055C000070000000000000000000000030000C3
S315080055D00000000000000000000004506B000000FE
@@ -1377,8 +1377,8 @@ S315080055E00700000000080000DFF8601A00290FD045
S315080055F0DFF85C1A097802460B469A4207D2DFF8AA
S31508005600B41A496B00EB400201EBC2007047401A1E
S31508005610C0B2002802D100BF01A070470020704721
-S315080056202DA400086FA4000897A400080000000035
-S3150800563031A500080000000080B5DFF8840A0028BC
+S3150800562065A50008A7A50008CFA50008F168000829
+S3150800563069A600080000000080B5DFF8840A002883
S3150800564001D1002002BDDFF8740A407800F050FD51
S31508005650012002BDDFF8640A4078FF2801D0012046
S3150800566070470020704738B50446FFF7F3FF002857
@@ -1422,7 +1422,7 @@ S315080058B0324601212046EB68BDE8704018470000D3
S315080058C02DE9FC4106460D46002000F05FFF2878CA
S315080058D0C0F34111022901DD002050E00DD1DFF8A7
S315080058E0F007010001D1002049E000F04FFF2A46E9
-S315080058F001213046AFF3008041E010F01F0105D0CA
+S315080058F00121304600F0FCFF41E010F01F0105D001
S31508005900022900F0ED80C0F0B28049E1C0F34111F0
S31508005910012914D12879102801D300202FE0DFF8B7
S3150800592098170844C078FFF75FFE002801D10020C9
@@ -1466,7 +1466,7 @@ S31508005B704BFA002C3FF402AF2A4621463046FFF77F
S31508005B8090FE002000F002FE98F82400C0073FF5BA
S31508005B90F5AE2946304600F091FDEFE60020EEE628
S31508005BA00020ECE62DE9F84F0646481EC0B200F084
-S31508005BB0A1FE00286CD04178022969D1DFF8F844A3
+S31508005BB0F9FE00286CD04178022969D1DFF8F8444B
S31508005BC0C2795209217862F304112170C2799209C7
S31508005BD062F34511217000F10907418808440090D5
S31508005BE0DFF86CB40098874254D2012578780B28E0
@@ -1480,19 +1480,19 @@ S31508005C500818C0B204F1030C1CF800C0BCF1FF0F11
S31508005C6016D104F1030C0CF80030491C0846C0B2E2
S31508005C709042ECDBDBB228460246394604F11300B3
S31508005C8000F01BFE2F449BF80000401C8245A9DB50
-S31508005C90002006E0DFF83C04002801D000F076FE7C
+S31508005C90002006E0DFF83C04002801D000F0D4FE1E
S31508005CA00120BDE8F28F38B504460D4668880146DE
S31508005CB0090A0A46012A0AD0022A29D0032A44D008
S31508005CC0062A53D0072A23D00F2A0BD063E000F008
-S31508005CD00FFE024612232946204601B0BDE8304091
+S31508005CD067FE024612232946204601B0BDE8304039
S31508005CE000F021BDDFF8F003002801D1002032BD05
-S31508005CF0AFF30080002801D1002032BD811C0B883B
+S31508005CF000F0AEFE002801D1002032BD811C0B88C1
S31508005D0002462946204601B0BDE8304000F00BBDEA
-S31508005D10022903D1C0B200F0EDFD08E0DFF8BC139C
+S31508005D10022903D1C0B200F045FE08E0DFF8BC1343
S31508005D20002901D1002032BDC0B2AFF3008000289F
S31508005D3001D1002032BD811C0B8802462946204627
S31508005D4001B0BDE8304000F0EEBCA988C0B200F052
-S31508005D50D3FD002801D1002032BD0378024629462A
+S31508005D502BFE002801D1002032BD037802462946D1
S31508005D60204601B0BDE8304000F0DDBCDFF8700326
S31508005D70002801D1002032BDAFF30080002801D1F0
S31508005D80002032BD037802462946204601B0BDE808
@@ -1540,15 +1540,15 @@ S31508006010284A02EB400515EBD41090F82300C0F38C
S315080060204000002811D125484078FFF70BF815EBFA
S31508006030D4102330017841F00201017015EBD41019
S315080060402330017841F00101017031BD00000000E4
-S315080060506882FE1F38B501F07F000C46154A02EB30
+S315080060509082FE1F38B501F07F000C46154A02EB08
S31508006060400515EBD41090F82300C0F34000002833
S3150800607011D012484078FEF7E7FF15EBD41023300D
S31508006080017801F0FD01017015EBD4102330017879
S3150800609001F0FE01017031BD074801F07F0200EBF7
S315080060A0420000EBD11090F82300400800F00100F0
-S315080060B0704700007481FE1F7481FE1F6882FE1FF0
+S315080060B0704700007481FE1F7481FE1F9082FE1FC8
S315080060C0F1600008E1680008E5680008EB68000868
-S315080060D0000000008D6900080000000000000000B4
+S315080060D0F1680008496A0008516A000800000000D3
S315080060E0000000000005000000000000000000009D
S315080060F0044900010858D0F8041841F00201C0F814
S3150800610004187047D8550008044900010858D0F803
@@ -1667,7 +1667,7 @@ S3150800680080B2814201D0402C19D201203369002B75
S3150800681003D03246022128469847002806D031463A
S315080068202846FFF741FF0028D7D10DE0002128466A
S31508006830FEF708FC80212846FEF704FCCDE728462B
-S31508006840FFF74CFF0028C8D1002070BDE89FFE1F47
+S31508006840FFF74CFF0028C8D1002070BD10A0FE1F1E
S315080068500000000080B5FEF7FDFE401E8041C043E3
S31508006860C00F02BD8288C2F30A02C07800F0030096
S31508006870012804D01FD3032815D00BD31BE0022907
@@ -1678,1244 +1678,1285 @@ S315080068B040209042ECDA0020704730B40A440BE0DE
S315080068C04C78052C06D18C7804F07F0500EB45053D
S315080068D0E4092B550C7821449142F1D330BC70471A
S315080068E0FDF757BD0020FDF752BDFDF751BD00006D
-S315080068F019A070471DA0704738B5010007D1154883
-S315080069000222016C801CFDF77BF801211AE004299C
-S3150800691001D3002032BD0F4C04F1400151F820503C
-S31508006920284600F037F80146C9B21F2900DD1F21A5
-S315080069300020A31C04E02A5C23F81020401CC0B2E7
-S315080069408842F8DB03484900891C41F440710180FC
-S3150800695032BD00002481FE1F120100020000004023
-S31508006960501DAC600002010203010000090220006C
-S3150800697001010080320904000002FF00000007053B
-S315080069800102400000070581024000000120FDF7D2
-S31508006990FEBC000000F10103810704D010F8011BBA
-S315080069A0820781B1FAD10268A2F10131914311F04F
-S315080069B0803104BF50F8042FF6E709BAB1FA81F11D
-S315080069C000EBD100401CC01A70470000F0B4C27832
-S315080069D08A18874BDA710E46847814EB16249C7154
-S315080069E045785D71007818712746FFB2B7EB162F08
-S315080069F006DA6D1C5D71EDB2002D01D1401C1871CF
-S31508006A00D2B201F0FF018A420DDA641C9C71E4B22D
-S31508006A10002C08D15879401C5871C0B2002802D100
-S31508006A201879401C1871F0BC704710B40A44521EFD
-S31508006A300BE00B784C7814EB032318180446A4B221
-S31508006A409BB29C4200D2401C891C9142F1D308D1CA
-S31508006A50097810EB0120024692B2B2EB012F00D260
-S31508006A60401C80B210BC704780B51422DFF8F01ABB
-S31508006A700020FFF7DAFF010002D14FF6FF7002BDD2
-S31508006A80BDE8024000F058BD38B5DFF8D84A217C89
-S31508006A90627C12EB0121A1F11405082204F11A0106
-S31508006AA0281880B2FFF7C1FF2A4692B204F12201E4
-S31508006AB0FFF7BBFF010002D14FF6FF7032BDBDE8FC
-S31508006AC0324000F039BD0620DEE749490020487209
-S31508006AD003E00020888201204872487A0028F8D00E
-S31508006AE000204872DFF8802A03E000205076012053
-S31508006AF04872487A0028F8D04FF48060088300204E
-S31508006B004872DFF8682A03E0002090800120487266
-S31508006B10487A0028F8D07047F8B504460E46344F30
-S31508006B20388B401C388380B2B0F5FA4F02DB4FF43D
-S31508006B30805038830020787209E0DFF8300A8588AB
-S31508006B40388B00F0F9FC8542EAD001207872787A11
-S31508006B500028F2D0002528467872DFF8101A01E0DE
-S31508006B6001207872787A002803D188880028F7D11E
-S31508006B700D46002D01D10020F2BD388B0146090AC9
-S31508006B8041EA0021A980EE80002C05D100220421CB
-S31508006B902846FCF717FF03E020882880608868806D
-S31508006BA0402028722846F2BDDFF8C4290021517218
-S31508006BB001E001215172517A002903D1918A0029F5
-S31508006BC0F7D19082704738B50146DFF8A449656A5F
-S31508006BD005F10800FFF7FAFE207928726079616AE4
-S31508006BE04872A079616A8872E079616AC87231BDB3
-S31508006BF0F4A0FE1FF8B5DFF878596C6A0146042937
-S31508006C0000F03481DFF85C6906F13601E961296232
-S31508006C10014603290BD1607E00F00F00032802D13C
-S31508006C20208A002871D0002028822872F1BD022906
-S31508006C3070D1E878401CE870C0B200280ED1A87858
-S31508006C40401CA870C0B2002808D16878401C68703B
-S31508006C50C0B2002802D12878401C2870002028617C
-S31508006C60617E072901D0052908D1A07E401CA0769F
-S31508006C70C0B27828D7D100206076D4E70029D2D0D0
-S31508006C80208A00283DD0A07E411EA1760028CAD1C0
-S31508006C90E07E06F12207082806D0617E022901D087
-S31508006CA001290AD1052808D100206076802028729B
-S31508006CB000F0CAFC14207873BCE30146042900DD01
-S31508006CC00420032101FA00F0A076E07E401CE0765D
-S31508006CD0607E00F00F00401E0728A4D8DFE810F0F9
-S31508006CE02E0209000C000503080005030800050329
-S31508006CF099E70020787325E20420287200F0A4FCA6
-S31508006D0059E301F00F0103298DD10820287200F0FC
-S31508006D109BFC22E3052811D1A86A808800283FF445
-S31508006D2082AF0020686206F12A00E8612862002026
-S31508006D3028610820287200F088FF97E0B07B452874
-S31508006D407FF471AF307C717C11EB0020298A814277
-S31508006D50FFF669AF2882307D10F03F0F7FF463AFEE
-S31508006D60707D00287FF45FAFAF89002F02D1E889D4
-S31508006D70002808D0F08BB8427FF455AF308CE989EB
-S31508006D8088427FF450AF4FF6FF74FFF76DFEA042BE
-S31508006D907FF449AFF07D06280AD1FFF794FEA0429A
-S31508006DA07FF441AFDFF8C027144606F122078CE0CE
-S31508006DB0112806D1288A1C382882DFF8B037AB623A
-S31508006DC01FE001287FF42FAF06F122000178082979
-S31508006DD07FF429AF0021017041884FF6F77291427E
-S31508006DE002DB0931418001E008314180708BF08374
-S31508006DF0B08B30847783E889B0839AE302F1400048
-S31508006E00A862AA6A03F140008242BFF40CAF9088D8
-S31508006E100028F3D006F122014F888742EED1D088A8
-S31508006E20002805D00988814202D0B0F58A4FE5D1FD
-S31508006E301188002902D1508800280BD0A14202D11E
-S31508006E405088A04206D0708B8842D7D1B08B518823
-S31508006E508842D3D1002068620220287206F12A00EF
-S31508006E60E86128620020688200F0EFFE688A002840
-S31508006E703FF4D9AE00F11C022A82DFF8E816134661
-S31508006E809BB21B0A0B744A74AB6A1A7A8A7511226A
-S31508006E90CA75083001F122020446A4B2240A44EA5B
-S31508006EA0002494800020D08098881080D88850804C
-S31508006EB0A8894883E88988831888C88358880884F5
-S31508006EC001F13600E86120E3AC34A242C0F0AE809E
-S31508006ED0607E0028F8D07888A1888842F4D138885E
-S31508006EE0E1888842F0D1708B21888842ECD1B08B3A
-S31508006EF061888842E8D16C6200202872787B410755
-S31508006F0000F13381397B0909890069722A8A511A85
-S31508006F1014392982627E02F00F02022A04D102463F
-S31508006F2002F03F02122A19D089B2002902D110F0C4
-S31508006F30030F13D03979227A914240F07982797910
-S31508006F40627A914240F07482B979A27A914240F00D
-S31508006F506F82F979E27A914240F06A82C0063ED59C
-S31508006F60218A00293BD004F10C00FFF72FFD287970
-S31508006F70397A814233D1797A6A7991422FD1B97AAD
-S31508006F80AA7991422BD1F97AEA79914227D12073CD
-S31508006F9068796073A879A073E879E073E07E0028C1
-S31508006FA017D1A17D94F9180094F91A20821A084677
-S31508006FB0A2EBD00252B25118A175100000D540427A
-S31508006FC0E17D4018A0EB9100E075A17D00EBD100B2
-S31508006FD0207601202872207EA07600202082607EFE
-S31508006FE000F00F01491E07293FF61DAEDFE811F034
-S31508006FF00900C4005D01060256026F022002FB0169
-S3150800700011E6287AC0077FF50EAE03206076402089
-S31508007010287200202082288A002800F09A81297A7E
-S3150800702041F002012972FFF7CEFD92E1787B00F06C
-S315080070303F00022840F0FC80798869830020687246
-S3150800704001E001206872687A002840F0F180A88A79
-S315080070508142F6D100200AE0072906D1002803D08C
-S31508007060817E937E994200D2104601216972697A1F
-S31508007070002903D1517E0029EED1104604003FF4C1
-S31508007080D2AD6C620320A07620760020A07504207D
-S31508007090E0750020E0767888A0803888E080708BDC
-S315080070A02080B08B6080012060762878207368780D
-S315080070B06073A878A073E878E07301202082F879D5
-S315080070C0E072B879A07278796072387920720120F6
-S315080070D0FFF779FD3A7B104600F0F00051282DDBCA
-S315080070E00020687201E05B1C6B726B7A18461146C9
-S315080070F00909491FB0EB810F20DA304400F1360741
-S315080071003978A972002919D00129ECD07878022992
-S3150800711001D1042804D0002810D0C3186B72E4E704
-S31508007120B978F87840EA01206883014640F20B6294
-S31508007130914201DB40F20A606082A082102006F1CB
-S315080071402201487306F12200417B41F00201417396
-S315080071500221017504214175062181750A21C1752F
-S315080071602C212982602101736AE1002060762020A3
-S31508007170287200F069FA56E5287AC00751D5787B57
-S3150800718000F03F0012284CD13A7B104600F0F00080
-S31508007190512831DB0020687201E05B1C6B726B7A48
-S315080071A0184611460909491FB0EB810F24DA304405
-S315080071B000F1360C9CF80010A97200291CD0012990
-S315080071C0EBD09CF80100022901D1042804D000283C
-S315080071D012D0C3186B72E2E79CF802109CF8030001
-S315080071E040EA01206883014640F20B62914201DBC6
-S315080071F040F20A606082A0820320607638792072A5
-S3150800720078796072B879A072F879E0720120FFF790
-S31508007210DAFC4220287200202082286100F014FA45
-S315080072209BE02020287200F00FFA0020696A487651
-S31508007230787B40073FF5F7AC14207873282028821E
-S3150800724050203873FB796B72F87AF871FB72B8794B
-S315080072506872B97AB971B872797969727A7A7A7113
-S3150800726079723A796A723C7A3C713A725B1CFB72A3
-S31508007270DBB2002B0BD1401CB872C0B2002806D175
-S31508007280491C7972C9B2002901D1521C3A72388850
-S315080072906883798839807880708BF083B08B3084E6
-S315080072A0A8897083E889B0831FE1797BCA0721D54D
-S315080072B0C0061FD4208A00287FF4B5AC288A401C53
-S315080072C080B2FFF780FC297A41F010012972288ADA
-S315080072D0002802D041F00201297200F0B5F9012018
-S315080072E02082082060760020E076112006F122012F
-S315080072F048739FE088060DD5F87CB97CEA690B4689
-S3150800730084464CEA032C6244EA612A8A40EA012050
-S31508007310101A2882288A002808D0617EC90605D452
-S31508007320297A41F002012972FFF74DFCB87BF97BF7
-S3150800733011EB00206883A18A688B814201D300285B
-S3150800734000D16983688B6082287A10F0030F3FF4B6
-S315080073506AAC0020688200F077F9297A06F12200E3
-S315080073608A0605D50021698261761421417361E098
-S31508007370CA060AD500216982012121820421617683
-S315080073800021E1761121417354E0688A002810D063
-S31508007390C80701D500202082208A002808D1608AE3
-S315080073A02946498A884200D908466882208200E030
-S315080073B068820020E076286AE86106F12201688A78
-S315080073C0002807D0208A002804D0283028821820D0
-S315080073D0487331E0287A80077FF525AC2820288273
-S315080073E01020487328E0287AC0077FF51CAC0020D7
-S315080073F060761020287200F027F914E4288A0028FD
-S3150800740001D0FFF7E0FB287A797BC9073ED5C0078C
-S3150800741005D5072060760020A076208201E00620A8
-S3150800742060760120FFF7CFFB1020287200F00CF9D8
-S315080074301020787328202882502006F1220108732C
-S3150800744006F12200217A0172617A4172A17A81726B
-S31508007450E17AC172217B0171617B4171A17B8171E6
-S31508007460E17BC1710621F175A1880180E18841801F
-S31508007470A9897183E989B1832188F1836188318477
-S31508007480617EC9062DD50021C1812EE0C00719D518
-S315080074900520607600202082FFF7C5BB288A0028D1
-S315080074A001D0FFF790FB787BC0070BD507206076E5
-S315080074B00020A0760120FFF786FB1020287200F036
-S315080074C0C3F8B5E7288A0028B2D1FFF7ACBB287AFB
-S315080074D0C0077FF5A8AB072060760020A076FFF7E7
-S315080074E0A2BB062181730A21C1734020B075288A80
-S315080074F00146090A3174707406F12204002060827C
-S315080075002082FFF7E0FAC0432082164C4520A0737C
-S315080075100020E073A082E88A401CE882014689B20E
-S31508007520090AA174E07400202083FFF79DFAC0437E
-S31508007530208300202872F1BD0146000A40EA012096
-S3150800754080B27047012909DB094A5182136A9842B9
-S3150800755004D0528A01461846FCF752BA7047000012
-S315080075607A82FE1F6C82FE1FC49DFE1F80A0FE1F2E
-S31508007570F4A0FE1F38B5964C6078002832D100F08A
-S31508007580E7FBFCF7AEFA00F5FA70606042F2107598
-S31508007590FCF7A7FA2818A060FFF797FA8D4800218C
-S315080075A0018041808C48018041808C48018041805F
-S315080075B04EF60300FFF7F8FA00F040FC04F10C0061
-S315080075C000F078FC062104F10C0000F024FB00F022
-S315080075D03DFB00F00DFDA84202D2284600F005FD4D
-S315080075E00120207031BD7A480021417000780028BA
-S315080075F000D1BFE77047764A1278012A00D0704753
-S3150800760030B4774A12681C3213685360002304E0CA
-S31508007610C45CD5182C725B1C9BB20C46A342F7DBE4
-S3150800762002F18A00091D0180012181701068401C41
-S31508007630106030BC704780B565480078012801D1D4
-S3150800764000F049F8002002BD70B56548006800F1F1
-S315080076501C0505F18A04634E3078410606D50120DB
-S31508007660286000202080A070E07070BDC00701D59A
-S315080076700020E0703078400706D5E078012803D16D
-S315080076802188281DFFF75EFF307800070DD5A07802
-S3150800769001280AD10020A0702088002805D00120E2
-S315080076A0E0702188281DFFF74DFF3078800711D537
-S315080076B04D4801880846001F82280BDAE078002822
-S315080076C008D1091FC9B249480068001DBDE87040C5
-S315080076D000F0BABC70BD38B500F0F9FB424C002882
-S315080076E025D020804FF40060FFF726FF404DA9897A
-S315080076F081420CD10120FFF77DFA2088002816D098
-S3150800770000F080FF00F0F7FB002020800FE040F635
-S315080077100600FFF711FFA989814208D100F014FF7E
-S315080077202088002803D000F0E6FB00202080FCF724
-S31508007730D8F9274D696888422AD301F5FA71696034
-S3150800774000200FE02B48264908600220FFF752FA6E
-S315080077502088002805D000F055FF00F0CCFB00205B
-S31508007760208001200028EDD000200FE02248234980
-S3150800777008600520FFF73EFA2088002805D000F0AB
-S3150800778041FF00F0B8FB0020208001200028EDD042
-S31508007790FCF7A7F9A968884205D301F51C511031F1
-S315080077A0A96000F043FE00200FE012480C4908606B
-S315080077B00320FFF71FFA2088002805D000F022FFD3
-S315080077C000F099FB0020208001200028EDD031BD73
-S315080077D04082FE1F00A1FE1F88A1FE1F84A1FE1F76
-S315080077E018A1FE1FFCA0FE1F04A1FE1F10A1FE1F6C
-S315080077F06C82FE1FC49DFE1F80A0FE1F1CA1FE1FDB
-S3150800780035220270012242708170C01C704710B583
-S315080078103621017004214170841C0A46DFF8581489
-S315080078202046FCF7EDF8201D10BD10B53221017079
-S3150800783004214170841C0A46DFF840142046FCF7F0
-S31508007840DFF8201D10BD3721017003214170012189
-S3150800785081700321C17006210171401D7047FF2107
-S3150800786000F8011B704738B5044601202070607087
-S31508007870DFF80C54A869A0700020E07004220FF20B
-S315080078803041201DFCF7BCF8002020818020608153
-S315080078900422DFF8F01304F10C00FCF7B1F800221B
-S315080078A0042104F11000FCF72DF90022042104F14B
-S315080078B01400FCF727F90022042104F11800FCF74C
-S315080078C021F9AA69696904F11C00FCF799F8A86905
-S315080078D00022C0F1100104F11C031844FCF712F948
-S315080078E00022402104F12C00FCF70CF9002280212B
-S315080078F004F16C00FCF706F904220FF2B83104F122
-S31508007900EC00BDE83840FCF77BB838B5DFF87843BB
-S3150800791025682846FFF7A7FF012105F1F000FFF7C4
-S315080079206FFFFFF790FFFFF79AFF2268801A01465C
-S315080079301046BDE83440FFF705BE38B5DFF84843C2
-S3150800794025682846FFF78FFF032105F1F000FFF7AA
-S3150800795057FFFFF75CFFFFF768FFFFF780FF226816
-S31508007960801A01461046BDE83440FFF7EBBD70B5F6
-S315080079700446651800260EE00422A11CDFF80C0355
-S31508007980FCF73EF804E00422A11CBB48FCF738F8D3
-S31508007990A01C61784418AC4223D2207801280CD068
-S315080079A0032810D0062814D03328E5D0352816D059
-S315080079B03628E8D0FF2814D0EAE70422A11CB448E8
-S315080079C0FCF71EF8E4E70422A11CB248FCF718F8F5
-S315080079D0DEE70422A11CB048FCF712F8D8E7A6781F
-S315080079E0D6E7304670BD000038B5A7480468207849
-S315080079F002281ED15FF00402ADA1201D00F0ACFEE6
-S31508007A00002816D19E4DAA69696904F11C0000F088
-S31508007A10A3FE00280DD1042204F1100105F124006B
-S31508007A20FBF7EEFF9D48018804F1F000BDE83440FD
-S31508007A309DE7002032BD38B50120914C21880029E8
-S31508007A4016D040F20F12891A21D0491E25D01539B1
-S31508007A5050D0491E53D02F3900F08E80491E00F0B1
-S31508007A609080143900F0A780491E00F0AB80CEE064
-S31508007A70A0704FF47A702061FFF747FF216904F17F
-S31508007A80080000F09DFE002040F20F11218000281A
-S31508007A9000F093804FF488702080814D2878800705
-S31508007AA006D404F1080000F092FE002800F0948045
-S31508007AB02878800706D5FFF797FF022802D102200B
-S31508007AC0A07009E020694EF66021884201DA40007C
-S31508007AD02061A0780228CFD14FF47A702061FFF791
-S31508007AE02CFF216904F1080000F06AFE002040F22C
-S31508007AF025112180002860D04FF493702080684DAE
-S31508007B002878800705D404F1080000F060FE0028F4
-S31508007B1062D02878800703D5FFF766FF052864D06A
-S31508007B20206942F2117188426EDA00F57A70206196
-S31508007B30A0780328D3D1204600F08DF8208CFFF7D3
-S31508007B40FBFC0546608CFFF7F7FC50EA05456D0817
-S31508007B504FF47A704543B5F1004F01D2256102E032
-S31508007B606FF000402061216904F1080000F028FE4A
-S31508007B70002040F25511218000281ED04FF4AB702A
-S31508007B80208004F1080000F022FE002824D00220FC
-S31508007B90A0704FF47A70206100F058F800F086F86B
-S31508007BA0FFF7CBFE216904F1080000F009FE00206A
-S31508007BB04FF4B5712180002801D1032032BD40F26F
-S31508007BC06B102080364D2878800707D404F108000A
-S31508007BD000F0FDFD002801D1002032BD287880077D
-S31508007BE006D5FFF701FF052802D10320A070A2E7FA
-S31508007BF0206942F21171884206DA00F57A7020612E
-S31508007C00A0780328CCD196E70020208032BD00203A
-S31508007C102080022032BD1CB5194C6061A16100208C
-S31508007C20A0704FF6FF70ADF80000ADF802004FF4F3
-S31508007C3086416846FEF770FF6060002802D04FF460
-S31508007C40884181800020208013BDF4E60D4800217C
-S31508007C500180418070470B49828C0A80C28C4A8019
-S31508007C601049028D0A80428D4A800F49028E0A8089
-S31508007C70408E488070470000DCA0FE1FE4A0FE1F6F
-S31508007C80C0A0FE1F00A1FE1F10A1FE1FE0A0FE1F40
-S31508007C90E8A0FE1FF0A0FE1FECA0FE1F04A1FE1F19
-S31508007CA0FCA0FE1F88A1FE1F84A1FE1F70470000CE
-S31508007CB0ADDE122363825363AC48016070470068E7
-S31508007CC0016821F48011016070470068036823F495
-S31508007CD09043194311430160704714300168807C52
-S31508007CE040010858C00F7047016841F218028B58C6
-S31508007CF043F002038B500068016841F004010160FB
-S31508007D007047016841F218028B5843F400538B50B0
-S31508007D100068016841F008010160704702210268A5
-S31508007D2041F21403D1500021006841F20402815047
-S31508007D30704714300168807C01EB401080687047FA
-S31508007D4014300268807C02EB4010416070470000E6
-S31508007D507FB500BF8FA004684FF4803001900020E3
-S31508007D608DF80000824D6A4609212846FCF7A0FBDB
-S31508007D7000208DF800007F4E6A4604213046FCF745
-S31508007D8097FB00208DF800006A4602213046FCF772
-S31508007D908FFB00208DF800006A4603213046FCF769
-S31508007DA087FB00208DF8080088208DF800006A46B9
-S31508007DB005213046FCF77CFB00208DF8080088205A
-S31508007DC08DF800006A4608213046FCF771FB002052
-S31508007DD08DF8080088208DF800006A46092130468B
-S31508007DE0FCF766FB00208DF800006A460821284645
-S31508007DF0FCF75EFB00208DF8080088208DF800004F
-S31508007E006A4607213046FCF753FB00208DF8000030
-S31508007E106A4601463046FCF74BFB012200213046F4
-S31508007E20FCF7A2FB5448044044F0886444F42064F8
-S31508007E3021465248FFF740FF7FBD000038B54F4C3A
-S31508007E40204600F028FD2046FFF739FFFBF749FEDC
-S31508007E50054605F59855883501E0FBF751FE0021E2
-S31508007E60204600F0D5FE002803D1FBF73AFEA842CB
-S31508007E70F3D300BF45A20021204600F07BFE4FF455
-S31508007E8000624FF480412046FFF71FFF2046FFF7A8
-S31508007E9038FF2046FFF728FF3948082101700021DE
-S31508007EA04170272181706921C1705B2101714521CB
-S31508007EB0417131BD0821017000214170272181706F
-S31508007EC06921C1705B21017145214171704770B507
-S31508007ED000252A4E304600F07DFD040009D040F208
-S31508007EE0F550844205D222462649304600F046FD22
-S31508007EF02546284670BD38B5234D2888002834D035
-S31508007F0040F2F551884230D21C4C2046FFF7E5FE78
-S31508007F100028204602D0BDE83240FFE6FFF709FFF9
-S31508007F20002203E01749895C8154521C29888A4239
-S31508007F30F8D32046FFF704FF04F125004178C17005
-S31508007F4049016269535843F0004353504178491C2C
-S31508007F5041700278C9B2914201D1002141700020D6
-S31508007F6020622046BDE83240D8E631BD4040005088
-S31508007F70008F024800820248F03A3FFFF881FE1F50
-S31508007F806CA1FE1F6C82FE1F04A1FE1F01000040AB
-S31508007F90000800000000000080B501201A4908709A
-S31508007FA000F029F8BDE8014010B500F0C8FE012828
-S31508007FB01AD000F0EEFE002816D0134C20780128BF
-S31508007FC012D1FBF78EFDA26861688A1802F5FA726B
-S31508007FD0904209D30020207000F0E2FE002803D169
-S31508007FE0BDE8104001F0BEBA10BD07498860704769
-S31508007FF005488068704710B5034C2078012802D1DF
-S31508008000FBF76FFD606010BD20A1FE1FDFF80C04B2
-S3150800801000F1810100220A70C0F88820CA70A0F811
-S3150800802086201046887048707047DFF8F00390F88D
-S315080080308100401E8041C043C00F70470020DFF812
-S31508008040DC1381F88400704738B5DFF8D04304F1B3
-S3150800805081050178FF2913D100F09AF8E8780128FC
-S3150800806002D1102000F076F8B4F9861008460128E7
-S3150800807005DB0120E8702046BDE834404FE031BDFD
-S3150800808029780129FBD10178C92932D0CC293FD0DA
-S31508008090CF293AD0D0292FD0D12933D0D2292ED0E2
-S315080080A0F32917D0F4290FD0F5290AD0F6290ED0CE
-S315080080B0FA2912D0FC2913D0FD2914D0FE2915D08F
-S315080080C029E000F0CCF8C9E700F0E9F8C6E700F0C7
-S315080080D0B9F8C3E700F007F9C0E700F0A1F8BDE773
-S315080080E000F09BF8BAE700F089F8B7E700F079F8EE
-S315080080F0B4E700F023F9B1E700F040F9AEE700F085
-S315080081000CF9ABE700F069F9A8E700F07CF9A5E7F8
-S3150800811000F086F9A2E7202000F01CF89EE789B255
-S3150800812000F0CCBDF8B504460D461646002704E017
-S3150800813020783F18641CFBF7E3FC2846451E0028F8
-S31508008140F6D1FFB237600120F2BD0020B34981F8AD
-S3150800815082007047B149FE220A7048700220A1F8D1
-S3150800816086007047014608784A7840EA02208A78ED
-S3150800817040EA0240C97840EA016070470870024642
-S31508008180120A4A700246120C8A70000EC8707047AE
-S3150800819010B500F0FEFD002803D11020BDE8104000
-S315080081A0D8E7FFF7D2FF9D4C012084F88100FF2015
-S315080081B02070102060700020A07000F0A6FDE0700E
-S315080081C000F0B0FD207100F0ADFD000A60710120DD
-S315080081D0A071E0710820A4F88600BDE8104001F0FF
-S315080081E0FCB910B58D4C002084F88100FFF7ADFF6F
-S315080081F0FF2020700120A4F8860010BD8748FF21C3
-S3150800820001700021417000F182010A788270002213
-S31508008210C270828006208880704700209AE7000096
-S3150800822010B57E4CFF2020707EA0C4F88800002080
-S3150800823060706080211D0720FFF7A0FF0820A4F8C2
-S31508008240860010BD10B5754CFF212170001DFFF783
-S3150800825089FFC4F888000120A4F8860010BD38B547
-S31508008260044600F052FD6278401E1146884203DA41
-S315080082702220BDE832406DE7684DD5F88810681CA5
-S3150800828001F09AF9FF202870D5F88800617840181F
-S31508008290C5F888006078401CA5F8860031BD38B559
-S315080082A0044600F032FD401E6178884203DA222037
-S315080082B0BDE832404EE7201DFFF754FF0146574DF3
-S315080082C0C5F888106278681C01F076F9FF202870D6
-S315080082D0D5F8880061784018C5F888006078401C91
-S315080082E0A5F8860031BD1CB5002100914B4CFF2135
-S315080082F02170001DFFF736FF01466A46D4F888004C
-S31508008300FFF710FF6070211D0098FFF737FF002068
-S3150800831060800820A4F8860013BD10B53F4CFF20E6
-S31508008320207000206070A07000F0EFFCE070002064
-S31508008330A080A0710720A4F8860010BD38B50446B1
-S3150800834000F0E3FC0146354D621C491ED5F888004D
-S3150800835001F045F9002803D13120BDE83240F9E69D
-S31508008360FF20287000F0D1FCD5F88810401E401870
-S31508008370C5F888000120A5F8860031BD38B5044641
-S3150800838000F0C3FC801E6178884203DA2220BDE82B
-S315080083903240DFE6214DFF2028700120A5F886002F
-S315080083A06178002907D101F022F9002814D131207B
-S315080083B0BDE83240CEE6A21CD5F8880001F00FF9D8
-S315080083C0002803D13120BDE83240C3E6D5F888003D
-S315080083D061784018C5F8880031BD10B5001DFFF753
-S315080083E0C1FE0E4C0146D4F8880001F0FAF80028C0
-S315080083F003D13120BDE81040ACE6FF2020700120F3
-S31508008400A4F8860010BD80B501F0ACF80348FF213A
-S3150800841001700121A0F8861001BD0000FC9EFE1F18
-S31508008420312097E64F70656E424C540070B5BF4CCC
-S31508008430A5786D1CA5700020207015E000EB4001A2
-S315080084408A00BB4B981801889B1C9A5A114309D07D
-S315080084502946C9B2827A891A782903DB00220421BF
-S31508008460FBF750FB761C2670267830460828E5DB95
-S3150800847070BDF8B503460C46AD4A1646AB4D00200E
-S31508008480287001E07F1C2F702F783846082818DAE4
-S3150800849000EB400112EB810631880029F2D0708882
-S315080084A00028EFD0B3F800C08C45EBD1598881423B
-S315080084B0E8D106222146301DFBF7A2FAA878B07249
-S315080084C0F1BD0020287001E0491C2970297808466A
-S315080084D0082809DA00EB400612EB860630880028E1
-S315080084E0F2D170880028EFD1082920D10020E87041
-S315080084F06870287011E002F10A0716FB01F1795C31
-S31508008500AE78EF78B4468E46ACEB0E0C674502DAC9
-S31508008510711AE9706870401C2870287801460C2684
-S315080085200829E8DB6878287016FB00F6164404224A
-S3150800853019463046FBF764FA06222146301DFBF73A
-S315080085405FFAA878B072F1BDF8B57A4C20882A2867
-S3150800855002D200202080F1BD00202080764DA88A16
-S31508008560B0F5807F03D0B0F5007F39D0F1BD734EEA
-S31508008570E88C3188884243D1288D718888423FD15A
-S3150800858005F1160105F11C00FFF773FF4FF40070A3
-S31508008590A882062205F1160105F12000FBF730FA3C
-S315080085A0674F0622394605F11600FBF729FA062217
-S315080085B03946A81DFBF724FA062205F120012846AC
-S315080085C0FBF71EFAA88BE884E88B28853088A883F1
-S315080085D07088E8834FF4C160A8812A202080F1BD05
-S315080085E05648E98C028891420AD1298D40888142F1
-S315080085F006D105F1160105F11C00BDE8F44038E77F
-S31508008600F1BD00002DE9F041494908464FF6FF72D1
-S31508008610494CE38B934208D1238C934205D1062219
-S315080086204BA12046FBF7ECF972E0464A1388434D06
-S315080086302E883E4FB4F81EC003EA0C0CB64603EA71
-S315080086400E039C4508D15288238C1340B5F802C006
-S3150800865002EA0C02934205D03B4A1388BB80528833
-S31508008660FA8003E0E28BBA80228CFA8000223A7004
-S3150800867001E0521C3A703A781346082B0DDA03EBE0
-S31508008680430001EB8000BB88B0F800C06345F0D119
-S31508008690FB88B0F802C06345EBD1082A33D1FF2224
-S315080086A006212046FBF72EFA0022062104F12000B7
-S315080086B0FBF728FADFF8888006224146A01DFBF75B
-S315080086C09FF90622414604F11600FBF799F9B88886
-S315080086D0E084F8882085A6836888E0834FF4807054
-S315080086E0A082E081082020820620A0740420E0747D
-S315080086F04FF4C160A08104F13600144908602A20AD
-S315080087000C4908800FE00622011D2046FBF778F980
-S3150800871006220B49A01DFBF773F90820A08105481E
-S3150800872001880E310180BDE8F081000074A1FE1FAA
-S31508008730889FFE1F04A1FE1F6C82FE1F00A1FE1F5C
-S315080087406CA1FE1F88A1FE1F84A1FE1F10A1FE1F9B
-S31508008750FFFFFFFFFFFF00000300002013F0030FD9
-S3150800876009D0521E22BF13F8010B11F801CBB0EB4A
-S315080087700C00F3D0704711F0030F14D1121F22BF5B
-S3150800878053F8040B51F804CB6045F7D0121D0AD2F2
-S3150800879000BA9CFA8CFCB0EB0C0038BF6FF00000F6
-S315080087A088BF01207047521E22BF13F8010B11F82B
-S315080087B001CBB0EB0C00F6D0521C08BF1046704730
-S315080087C010B50446616000F01DFF206010BD10B5AD
-S315080087D0044600F017FF2168401A6168884201DBE9
-S315080087E0012010BD002010BD02684FF48051535877
-S315080087F043F00103535002685258D207FBD470471E
-S3150800880001680B64006842647047DFF8F00200688C
-S31508008810DFF8EC12096801F001018840704780B55D
-S31508008820FFF7F3FF400802BD10B50446FFF7DCFF6B
-S315080088304FF4806021680860802021688861DFF82D
-S31508008840C402216841F218028850DFF8BC02216888
-S3150800885001F580510860204600F02FF8204600F008
-S315080088605FF84FF0FF30216841F2140288506FF02C
-S315080088707C402168C1F810012168C1F80C016FF02D
-S31508008880C0202168C1F800024FF402702168C8634D
-S315080088900020206210BD38B5044600F0E4F82046F2
-S315080088A000F0ADF805462046FFF7BEFFD4E90223DF
-S315080088B02046FFF7A5FF284632BD70B401460023BF
-S315080088C020E00020A86012E05A014FF000458550CC
-S315080088D044F2F4500D69154468600869851888697A
-S315080088E00028EED040F2F4565E433044A8605B1C84
-S315080088F018462478A04200D100200C6904EB4010E9
-S315080089002244D060086901F1240422789342DBD31B
-S31508008910096841F20C0288500020E07070BC70476C
-S3150800892070B4014600231BE00020A8600DE05A0140
-S31508008930DFF8D851855048698518C8690028F3D0EA
-S3150800894040F2F4565E433044A8605B1C184624780F
-S31508008950A04200D100204C6904EB40102244D060AC
-S31508008960486901F1250422789342E0D3096841F267
-S31508008970100288500020607070BC704770B50446BD
-S315080089800846154604F124062169F27801EB4211DE
-S3150800899089682A46FBF734F82069F17849014FF0CF
-S315080089A000424250F078401CF0703178C0B28842DC
-S315080089B001D10020F070206841F2140142581206D5
-S315080089C006D5802242500020216841F208028850CC
-S315080089D0284670BD0146002010310A68C97D490144
-S315080089E0515800290AD401F40340B0F5407F02D05B
-S315080089F04FF0FF307047C1F30D40001F704710B5A8
-S31508008A000446FFF70CFF0146002022681032DFF803
-S31508008A100031994202D20821116010BDDFF8F43006
-S31508008A20994202D20C21116010BDDFF8EC30994250
-S31508008A3002D20146116010BDDFF8E030994202D239
-S31508008A400421116010BDDFF8D830994202D21021F6
-S31508008A50116010BDDFF8CC30994202D214211160A2
-S31508008A6010BD022010BD10B50420FBF7AFFADFF8E1
-S31508008A70B8402046FBF7B8FA2046BDE81040FBF799
-S31508008A801BBA30B40468256905F03C0545EAC125DA
-S31508008A9045EA821545F00105256100210268146939
-S31508008AA0E40705D5491C4FF6FF729142F6D304E058
-S31508008AB050691880002030BC70470220FBE710B4CC
-S31508008AC00468636103681C6904F03C0444EAC12431
-S31508008AD044EA821444F003041C6100210268126906
-S31508008AE0D20705D5491C4FF6FF729142F6D302E02C
-S31508008AF0002010BC70470220FBE70000A0A1FE1F63
-S31508008B001046005004002002802001020000107068
-S31508008B10C10E16020187930301E1F50581D1F0081C
-S31508008B2001C2EB0B81B2E60E0400002038B50446FC
-S31508008B300D460DF102030222FFF7A3FF002817D105
-S31508008B406B46032229462046FFF79BFF00280FD1D4
-S31508008B50BDF80200222809D1BDF800104FF6F070C2
-S31508008B600140B1F5AB5F01D1002032BD032032BD13
-S31508008B70042032BDF8B505460E4617464FF0FF34B9
-S31508008B8031462846FFF7D2FF002801D0641EF7D1E8
-S31508008B90002827D13146284600F025F8002821D19B
-S31508008BA00020B7F90210B1F5804F01D14FF40050FB
-S31508008BB0B7F90410B1F5006F01D140F48070B979A6
-S31508008BC0012901D140F48050F979012901D140F4F5
-S31508008BD08040034600223146284601B0BDE8F040F1
-S31508008BE0FFF76DBFF2BD38B504460D464FF4004396
-S31508008BF00022FFF764FF002809D16B4600222946A8
-S31508008C002046FFF73EFFBDF800100904F5D432BD33
-S31508008C1080B56B460122FFF734FFBDF80000C0B2ED
-S31508008C20800800F0010002BD10B5FFF7EFF900F06B
-S31508008C300FFD4C4C0120207000F018FE002020701B
-S31508008C4000F0F2FE0220207010BD1CB5454C6946A6
-S31508008C50201D00F0B9FD012806D1012020709DF8DD
-S31508008C600010201DFFF7F0F96946201D00F04EFEA2
-S31508008C70012806D1002020709DF80010201DFFF75E
-S31508008C80E3F96946201D00F004FF012806D10220F9
-S31508008C9020709DF80010201DFFF7D6F96946201DA3
-S31508008CA0FEF7C9FC012806D1032020709DF80010A4
-S31508008CB0201DFFF7C9F913BD00F0C6BE70B50446FE
-S31508008CC00D46284E3078012803D1C9B2204600F057
-S31508008CD054FD3078002804D12946C9B2204600F050
-S31508008CE0ECFD3078022804D12946C9B2204600F0A6
-S31508008CF0ADFE3078032804D12946C9B22046FEF7CE
-S31508008D007AFCBDE87040FFF799B916480078012843
-S31508008D1002D0022802D003E0082070473F2070479F
-S31508008D20812070470F480078012802D0022802D017
-S31508008D3003E0082070473F2070478120704710B530
-S31508008D400024FFF772F9002800D00124204610BD40
-S31508008D5080B5FEF748FC032002490870BDE80140CB
-S31508008D60FFF749B94080FE1F80B50020DFF86C1672
-S31508008D700870024616A1DFF86806F8F7B1FB002866
-S31508008D8006D07721DFF85C06BDE8044000F0CEBEC9
-S31508008D9001BDDFF848060078401E8041C00F7047C5
-S31508008DA010B5FFF7CCFF012801D1002010BDDFF870
-S31508008DB02C462078002801D0002010BDFBF7EAFADF
-S31508008DC0012802D10120207010BD002010BD00002E
-S31508008DD0303A00002DE9F84F0026DFF800562878CB
-S31508008DE0002800F00A82012835D100F0F6FBFBF7CF
-S31508008DF0EFFADFF8F4452046FBF70FFB04F12400F1
-S31508008E00FBF70BFBFBF7E2FA01460122DFF8DC056C
-S31508008E10F8F791FB00280AD0304628700FF2AC60AC
-S31508008E20FBF7FBFA0120BDE8F24FFBF7EEBA0FF2AB
-S31508008E30A460FBF7F2FA04F14C00FBF7EEFA04F132
-S31508008E407000FBF7EAFADFF8A80531464160816051
-S31508008E5002202870D1E1022840F00E81DFF8804513
-S31508008E6004F50C78DFF88C7542464FF48071384665
-S31508008E70F8F734FF04F50F71497900290DD030460B
-S31508008E8028700FF24860FBF7C8FA0220FBF7BDFA14
-S31508008E904046BDE8F24FF8F7E7BD002817D032463E
-S31508008EA007F5C071384600F0E7F9064616F1010FD6
-S31508008EB00DD1002028700FF21460FBF7AEFA0320DC
-S31508008EC0FBF7A3FA4046BDE8F24FF8F7CDBD002EF2
-S31508008ED063DD07F5C079D9F80840D9F80000002CF9
-S31508008EE004D1C9F80400C9F8086056E0D9F8041096
-S31508008EF06118884203D13619C9F808604DE00FF2A7
-S31508008F00D45A5046FBF789FA0FF2D050FBF785FA88
-S31508008F1007F5C67B5946204600F099FA5846FBF7EE
-S31508008F207CFA0FF2C450FBF778FA5946D9F80400D0
-S31508008F30000E00F07BFA07F5C771D9F80400000C9B
-S31508008F40C0B200F073FA07F5C871D9F80400000A30
-S31508008F50C0B200F06BFA07F5C971D9F80400C0B2BF
-S31508008F6000F064FA5846FBF758FAA5A0FBF755FA3D
-S31508008F70D9F80810D9F8040000F033FB002867D0A8
-S31508008F805046FBF74AFADFF87004FBF746FAD9F8B9
-S31508008F900000C9F80400C9F80860DFF860048168B1
-S31508008FA00068814240F0298100214046F8F76BFDB0
-S31508008FB000280DD0002028700FF21050FBF72DFA6C
-S31508008FC00420FBF722FA4046BDE8F24FF8F74CBDFD
-S31508008FD007F5C076B4680FF2FC49002C46D048461F
-S31508008FE0FBF71BFA0FF2F440FBF717FA07F5C67AF8
-S31508008FF05146204600F02BFA5046FBF70EFA0FF2C0
-S31508009000E840FBF70AFA51467068000E00F00EFABF
-S3150800901007F5C7717068000CC0B200F007FA07F5CB
-S31508009020C8717068000AC0B200F000FA07F5C97185
-S315080090307068C0B200F0FAF95046FBF7EEF970A076
-S31508009040FBF7EBF9B168706800F0CBFA00280DD190
-S31508009050002028700FF27440FBF7DFF90520FBF7B4
-S31508009060D4F94046BDE8F24FF8F7FEBC4846FBF790
-S31508009070D4F903202870C0E0032840F0BE80DFF84A
-S31508009080608308F50C77DFF86C433A464FF4807135
-S315080090902046F8F723FE08F50F7898F805100029FA
-S315080090A00CD030462870D648FBF7B7F90220FBF7F4
-S315080090B0ACF93846BDE8F24FF8F7D6BC002817D009
-S315080090C004F5807204F5C071204600F0D5F806460E
-S315080090D016F1010F0CD100202870CA48FBF79DF93C
-S315080090E00320FBF792F93846BDE8F24FF8F7BCBC07
-S315080090F0002E50DD0FF20C40FBF78FF904F5C67A07
-S315080091005146304600F0A3F95046FBF786F90FF2B0
-S315080091100440FBF782F904F5C0795146D9F80000F6
-S31508009120000E00F083F904F5C771D9F80000000CA9
-S31508009130C0B200F07BF904F5C871D9F80000000A3E
-S31508009140C0B200F073F904F5C971D9F80000C0B2CD
-S3150800915000F06CF95046FBF760F929A0FBF75DF9BA
-S3150800916004F580723146D9F8000000F038FA002874
-S315080091700DD1002028700FF25430FBF74EF9062067
-S31508009180FBF743F93846BDE8F24FF8F76DBC0FF226
-S315080091904430FBF742F9D8F80800D8F8001088429E
-S315080091A02BD10FF28830FBF738F900F020FA0028A7
-S315080091B00DD10020287000BFC4A0FBF72EF90720A8
-S315080091C0FBF723F93846BDE8F24FF8F74DBC00BF68
-S315080091D0C0A0FBF722F90FF27030FBF71EF93846EC
-S315080091E0F8F742FC8848FBF718F900202870FBF7C7
-S315080091F0FFF8BDE8F14F00F0B5B9BDE8F18F000002
-S315080092002E2E2E0010B50446207800F093FC532825
-S3150800921005D16478204600F093FC002801D103208C
-S3150800922010BD312C01D1002010BD322C01D10120F6
-S3150800923010BD332C01D1022010BD032010BD70B51E
-S31508009240841C204600F01DF905462E46A41C20461F
-S3150800925000F017F936186D1EA41C284680B202289D
-S31508009260F5DAF643204600F00CF9F6B2864201D04C
-S31508009270002070BD012070BD2DE9F04106460D465F
-S3150800928014460027002D01D0002E04D140F2632198
-S31508009290544800F04BFC3046FFF7B4FF8046B8F15F
-S315080092A0030F01D1384697E03046FFF7C8FF00287C
-S315080092B002D14FF0FF308FE0B8F1000F04D0B8F1BB
-S315080092C0020F53D025D386E0B71C384600F0D9F8EC
-S315080092D00646BF1C384600F0D4F800022860BF1CBA
-S315080092E0384600F0CEF8296808182860BD1CF71E15
-S315080092F03FB2002C6FD00026B0461FFA88F8B84552
-S3150800930069DA284600F0BDF804F80800AD1C761C9A
-S31508009310F2E7B71C384600F0B4F80646BF1C3846D4
-S3150800932000F0AFF800042860BF1C384600F0A9F822
-S31508009330296801EB00212960BF1C384600F0A1F816
-S31508009340296808182860BD1C371F3FB2002C42D078
-S315080093500026B0461FFA88F8B8453CDA284600F0D9
-S3150800936090F804F80800AD1C761CF2E7B71C3846DE
-S3150800937000F087F80646BF1C384600F082F800065B
-S315080093802860BF1C384600F07CF8296801EB0041CC
-S315080093902960BF1C384600F074F8296801EB0021E3
-S315080093A02960BF1C384600F06CF829680818286040
-S315080093B0BD1C771F3FB2002C0DD0002606E02846BC
-S315080093C000F05FF804F80800AD1C761CB0461FFADA
-S315080093D088F8B845F3DB3846BDE8F0818CA1FE1F56
-S315080093E0B088FE1F88B200085CAD0008E08AFE1F40
-S315080093F0BC9AFE1F3C99FE1FCCAD0008EC8AFE1FE6
-S31508009400FCAD000820AE000844AE000880B500F0A8
-S315080094100F0130310A2801DBC91D04E0C9B208462C
-S3150800942000F088FB01460846C0B202BD38B50446BE
-S315080094300D460009FFF7EAFF287004F00F042046DE
-S31508009440FFF7E4FF68700020A870284632BD10B404
-S3150800945002460A23491CB2FBF3F2002AFAD100227B
-S315080094600A700A22B0FBF2F2134603EB8304A0EB60
-S315080094704400303001F8010D1000F2D1084610BC46
-S31508009480704770B5044600252E460AE03038014676
-S31508009490C9B20A2900DBC01F2946054605EB011596
-S315080094A0761C3046C0B202280DDA205C00F042FB7A
-S315080094B0C0B2A0F13001172903D2A0F13A01072959
-S315080094C0E4D2002070BD2846C0B270BD4552524F46
-S315080094D0520A0D004F4B0A0D0000000045726173D9
-S315080094E0696E672000000000206279746573206643
-S315080094F0726F6D206D656D6F72792061742030789A
-S315080095000000000050726F6772616D6D696E6720AA
-S315080095100000000020627974657320746F206D6501
-S315080095206D6F727920617420307800005772697403
-S31508009530696E672070726F6772616D206368656314
-S315080095406B73756D2E2E2E00436C6F73696E6720D4
-S315080095506669726D776172652066696C650A0D00C9
-S3150800956000F0F3BA10B500F03EF8002803D1BDE8C4
-S315080095701040FFF7EDBBFAF7F8FE002803D1BDE867
-S315080095801040FFF7E5BBFFF797FBFAF79BFA00F0E9
-S315080095902CF8074908400749086000F026F8001D1E
-S315080095A0046800F0D4FAA047BDE81040FFF7D0BB26
-S315080095B080FFFF1F08ED00E070B504460D4616460D
-S315080095C005E015F8010B04F8010BFAF799FA30468D
-S315080095D0461E80B20028F4D170BD00F0C1BA00F072
-S315080095E0C8BA00F0F2BA00F02DBB00F059BB80B53E
-S315080095F000F00BFB002801D1002002BDBDE80140A8
-S3150800960000F037BBFAF76DBA016841F04001016016
-S315080096107047016821F0400101607047016841F018
-S3150800962001010160704701684908490001607047F7
-S315080096300068C06970470068C1617047816841F079
-S31508009640005181600068C16841F00051C1607047EF
-S31508009650FEB56E4C204600F0FFFCFAF747FC0546BF
-S3150800966002E06D00FAF74CFA69488542F9D3694871
-S31508009670854203D36D08FAF743FAF8E72A4601212B
-S31508009680204600F008FD0095634801904FF4FA5013
-S31508009690ADF808000120ADF80A00604D6946686A11
-S315080096A000F053FC686AFFF7AFFF686AFFF7B6FF7A
-S315080096B05B4E2E60696801F000515A4801436960A3
-S315080096C0AA6802F0604240F2E1700243AA6021F003
-S315080096D0005169602846FFF7B1FF0820287300206B
-S315080096E005E000210246D2B22A441174401C014604
-S315080096F02A7BC9B29142F4D301202876284600F085
-S3150800970031FD00220121204600F094FC464F06F167
-S3150800971020003860796801F00051444801437960B7
-S31508009720BA6802F0604240F267600243BA6021F00C
-S31508009730005179603846FFF781FF0820387300200A
-S3150800974005E000210246D2B23A441174401C014693
-S315080097503A7BC9B29142F4D300203876384600F0F5
-S3150800976001FD01221146204600F064FC686AFFF7F5
-S3150800977050FF686AFFF757FFF7BD38B5274C2173C6
-S31508009780002104E0425C63181A74491CC9B2227BA2
-S315080097909142F7DB204600F030FD02212046FFF714
-S315080097A04AFF204600F046FDFAF79BF90546323592
-S315080097B02046FFF73DFF800705D5FAF7A1F9FAF726
-S315080097C090F98542F4D231BDF8B505460E46002714
-S315080097D0154C2046FFF72CFFC00715D5204600F08C
-S315080097E03DFD00280CD1207B3070384605E0211855
-S315080097F0097C29540127401CC0B2217B8842F6DB2C
-S3150800980001212046FFF717FF3846F2BD0040014800
-S31508009810001BB700010E270720A10700C081FE1F05
-S3150800982000500148E107008030A1FE1F670600804E
-S31508009830D0F81401000B00F001007047D0F81401AD
-S3150800984000F440707047C0F818117047D0F814013A
-S31508009850C00800F0010070470122FAF70DBF016C3D
-S315080098600909090141F00201016470471FB54FF467
-S315080098706140009008208DF805008DF8060001204B
-S315080098808DF8070010208DF808000020ADF80A00B2
-S315080098905A4C69462068FFF7DFFF0123042210218E
-S315080098A02068FBF707F80123042200212068FBF74C
-S315080098B015F82068FFF7D3FF1FBD70B504460D469F
-S315080098C02846822803DB7A214D4800F02FF92846DE
-S315080098D000F06CF8012803D07E21494800F026F9EB
-S315080098E000260DE0FAF70CF9304680B2205C00F04D
-S315080098F05DF8012803D08721414800F017F9761C46
-S315080099003046294680B28842ECD370BDF8B5054684
-S315080099100E463C4C6078002812D1201D00F035F820
-S31508009920012830D1207900282DD082282BDAFAF7A1
-S31508009930D8F8C4F88800002020700120607022E062
-S31508009940601D2178084400F020F8012812D12778F4
-S315080099507F1C277038462179C0B2884213D13A460F
-S31508009960D2B2611D2846FFF727FE002060703770C7
-S315080099700120F2BDFAF7B5F8D4F8881064318142AF
-S3150800998001D2002060700020F2BD38B504461B489D
-S3150800999005682846FFF75AFF002805D12846FAF732
-S315080099A0C6FE2070012032BD002032BDF8B504463F
-S315080099B00125124E37683846FFF73AFF002801D0CE
-S315080099C00020F2BD21463846FAF799FEFAF789F8DB
-S315080099D004460A343068FFF731FFC00506D4FAF7A3
-S315080099E08FF8FAF77EF88442F4D200254FF4807196
-S315080099F03068FFF728FF2846F2BD00002882FE1FC0
-S31508009A00D8B10008709EFE1F002000F0A1BC0A46CF
-S31508009A100146002000F0BCBC0A460146002000F0C2
-S31508009A20E6BC002000F0FBBC80B50020FBF71BFE5F
-S31508009A30FEF7DEFAB0F5FA6F05D24FF4FA60BDE824
-S31508009A400240FEF7D2BA01BDFBF7F6BD13B50446D0
-S31508009A500846402803DB75212A4800F067F80121EB
-S31508009A6001A8FFF7D9FF012803D07921254800F07E
-S31508009A705DF89DF804102046FFF7CEFF9DF8041008
-S31508009A80884203D07C211F4800F050F8FFF7C9FF31
-S31508009A9013BDF8B505460E460020FBF7B5FC0021B8
-S31508009AA04FF0FF30FBF74EFE174C607800280FD1B9
-S31508009AB0201D00F02BF8012808D12079002805D0B0
-S31508009AC0402803DA01206070002020700020F2BDD3
-S31508009AD0601D2178084400F019F80128F6D1277886
-S31508009AE07F1C277038462179C0B28842EED13A46A3
-S31508009AF0D2B2611D2846FFF75FFD002060703770FF
-S31508009B000120F2BD14B200083CA0FE1F38B5044679
-S31508009B100025FFF779FF002806D001212046FFF728
-S31508009B2076FF012800D10125284632BD80B5F9F710
-S31508009B30E7FFFCE7A0F161011A2938BF2038704712
-S31508009B4030380A288041C00F704772B6704762B62F
-S31508009B507047000080B500F04FFD00F0010002BD1F
-S31508009B604FF0FF30DFF878130860DFF878130860E5
-S31508009B70704770B50D46164600F0BEF90446DFF884
-S31508009B806803001B691E88420AD3204600F072F952
-S31508009B90FF2805D02819401E00F06CF9FF2801D1CE
-S31508009BA0002070BDA00A8002DFF8401388422B46C9
-S31508009BB03246214604D1DFF82C03BDE87040A0E008
-S31508009BC0DFF81C03BDE870409BE070B50D4600F059
-S31508009BD093F90446DFF81003001B691E88420ED36A
-S31508009BE0204600F047F906462C19641E204600F068
-S31508009BF041F93146FF2902D00146FF2901D100204B
-S31508009C0070BD3046BDE87040F9E080B5B5490868D2
-S31508009C1010F1010F01D1012002BD4A688868821837
-S31508009C20C86882180869821848698218886982187B
-S31508009C30C8698218D24300926A460421AC48FFF7E5
-S31508009C4098FF02BDA9490A68486882188868821878
-S31508009C50C86882180869821848698218886982184B
-S31508009C60D243A3480068824201D1012070470020F0
-S31508009C70704780B59B48016811F1010F03D000F0C9
-S31508009C8080F8002808D09648016811F1010F05D020
-S31508009C9000F077F8002801D1002002BD012002BD9E
-S31508009CA09248704780B58A0501D0002002BD026837
-S31508009CB08A4201D1012002BD01604FF48062001D75
-S31508009CC0FFF77AFC012002BD38B504460D468548E3
-S31508009CD0844208D1824C29462046FFF7E3FF002834
-S31508009CE00DD1002032BD81498D4201D10446F2E7EB
-S31508009CF0204600F046F80028EDD1002032BD204667
-S31508009D0032BD2DE9F0410446884616461D464FEAFF
-S31508009D109827BF02206810F1010F05D13946204661
-S31508009D20FFF7C0FF002827D02068B84205D039467B
-S31508009D302046FFF7C9FF04001ED02068A8EB0008DC
-S31508009D4004EB080000F10408F9F7DAFE201DA8EB79
-S31508009D500000B0F5806F08D307F580612046FFF74D
-S31508009D60B3FF040008D004F1040816F8010B08F83C
-S31508009D70010B6D1EE8D101E0002000E00120BDE8DE
-S31508009D80F0812DE9F0410446206800F073F8FF28B9
-S31508009D9030D0002500E06D1C042D2DD2F9F7B0FE59
-S31508009DA0266816EB052604EB0520071DF9F799FE2C
-S31508009DB0804608F10D083946304600F020FC05E0DB
-S31508009DC0F9F78FFE804515D3F9F79AFEFFF7C2FE1D
-S31508009DD00128F5D000F010FC30F010000AD1002060
-S31508009DE000E0401CB0F5807FD5D2811909783A5C2D
-S31508009DF09142F6D0002000E00120BDE8F081F8B5D8
-S31508009E0005460C462046294688422FD3284603286D
-S31508009E102CD32046102829D20BE0F9F771FEFFF75C
-S31508009E2099FE01281ED000F0E7FB30F020001DD176
-S31508009E306D1C20462946C9B2884219D3F9F760FE37
-S31508009E402846C0B200F030F8064616F1010F0DD0CC
-S31508009E50F9F747FE074607F5C857C837304600F0F2
-S31508009E60E9FBDCE7F9F73DFE8742D6D20020F2BDD2
-S31508009E700120F2BD38B50446002501E06D1CEDB29F
-S31508009E800D2D0FD2F9F73CFE1A4805EB450100EBFC
-S31508009E90810001688C42F1D3426851188C42EDD298
-S31508009EA0007A32BDFF2032BD70B504464FF0FF354B
-S31508009EB0002600E0761C3046C0B20D280DD2F9F710
-S31508009EC01FFE3046C0B200EB4001880009490A1857
-S31508009ED0127A23469A42EDD10D58284670BD0000E5
-S31508009EE0088DFE1F0C91FE1FFFFF1F0C00C0000C03
-S31508009EF000C2000C2CB000080146090E082901D141
-S31508009F0000F1806070470000D0F8C40100F440708A
-S31508009F10401E8041C00F704741EA024141EA036191
-S31508009F20C0F8C4117047016841F0400101607047EC
-S31508009F30016821F0400101607047884200D2084656
-S31508009F407047884200D9084670472DE9F04702460F
-S31508009F500D464FF0000C0127664642F2107EF04689
-S31508009F60B94601E009F10109B9F1400F29D80A21DA
-S31508009F7028684843B0FBF9F46B68B4FBF3FA084663
-S31508009F80BAFBF0F001FB10AABAF1060F00D3401C89
-S31508009F90002803D04143B4FBF1F103E00846B4FBC3
-S31508009FA0F0F13846994201D3CB1A00E05B1A15281E
-S31508009FB0D8D24345D6D2CC4606469846B3F57A7FDC
-S31508009FC0D0D2644670464021B5F808C000E0491E64
-S31508009FD0032911D34B1C0EFB03F3B3FBF6F36345BE
-S31508009FE002D3A3EB0C0801E0ACEB0308804501D2D1
-S31508009FF00F4640466345EAD290464046FFF793FF30
-S3150800A000F61BB61E360306F4E0466889401E800134
-S3150800A01000F0C00006437F1E3F0207F4706737430F
-S3150800A020641E04F03F043C43C8F810404046BDE8AF
-S3150800A030F0477DE770B504460D4616462046FFF7FD
-S3150800A04063FF0028FAD06D1C2B46DBB2324602218C
-S3150800A0502046BDE870405FE710B501210160DFF8D2
-S3150800A060D8422046F9F71EFF2046BDE81040F9F70A
-S3150800A070B1BF38B50446DFF8C0522846F9F7B4FF31
-S3150800A0802846F9F719FF2068400840002060206834
-S3150800A0908007FCD431BD2DE9F84305460C46164623
-S3150800A0A0FFF7E7FF2146284600F03DF8284600F06E
-S3150800A0B047F80746B7FBF6F1C1F580610020FFF7C0
-S3150800A0C03CFF40F2FF394946FFF73BFF0446B846D6
-S3150800A0D04FEA98184946304680098002B0FBF8F0E6
-S3150800A0E0FFF72FFFC4F58061B7FBF1F1711A00FB8A
-S3150800A0F008F84FEA9828A6EB88168E428941C94384
-S3150800A100C90F03D0204601D0012200E00222EB68E5
-S3150800A110DFF828120B40EB60E96841EA8231084310
-S3150800A120E860BDE8F183D0F8C821120951EA0211A6
-S3150800A130C0F8C8117047D0F8C80100F00F00704782
-S3150800A14010B50024FFF7F7FF012802D0022804D033
-S3150800A15006E0F9F7CBFE044602E0FAF753FA04469E
-S3150800A160204610BD10B504462068754909184909E6
-S3150800A170826822F47F428260206882680B465B0907
-S3150800A18042EA4332090201F4F85111438160207E04
-S3150800A190002801D001282FD120202168C8616168D4
-S3150800A1A0C1F3407000280DD101F0604040EA8140BB
-S3150800A1B021688861A06800F0604141EA8041206812
-S3150800A1C0C16004E020688161A0682168C860207EBB
-S3150800A1D001280AD1204600F010F84FF000602168E7
-S3150800A1E0C86158482168C86110BD4FF400602168ED
-S3150800A1F0C86155482168C86110BD014603200A7E1A
-S3150800A200012A16D120200A68D0610868026822F05F
-S3150800A21070620B7B1B0603F070631A4302600869C1
-S3150800A2200A68106148690A68506148480968C8613F
-S3150800A230002070470168C869C0F34010CA69C2F3B4
-S3150800A2400022002801D104207047012A01D10220EA
-S3150800A25070474FF0E060C861002070470268D16916
-S3150800A260C1F3C021D269C2F38002002901D00320BC
-S3150800A2707047012A01D10220704708210268D1617E
-S3150800A28001688969C1F340710029416824D121F028
-S3150800A2900051416001F0604102689269C2F38A4246
-S3150800A2A0114341600168C968490F826861F35D72AC
-S3150800A2B08260C2F34071002908D002F0604201684A
-S3150800A2C0C968C1F38A410A43826019E00168C9680E
-S3150800A2D061F31C02826013E041F00051416002689C
-S3150800A2E0926962F31C0141600168CA68816862F379
-S3150800A2F01C0181600268D268520F62F35D71816049
-S3150800A30001680968090E01F00F01017301680969FE
-S3150800A31001610168496941610168CA69C2F380023D
-S3150800A320C969C1F3C001002A01D00029A5D10021BD
-S3150800A330017608467047000010000010003CFFFF39
-S3150800A34000B0FEB7C00020064006A0004000280066
-S3150800A350934A4FF48E7111FB00F01044001DFCF770
-S3150800A36024B910B50446A1780020FBF741FE002861
-S3150800A3700DD1201DFCF741F9402808DB402304F1E4
-S3150800A3809C02A1780020BDE81040FBF701BE10BD75
-S3150800A39038B5834C4FF48E7313FB00F0044492B225
-S3150800A3A0201DFCF751F905462046FFF7DAFF284637
-S3150800A3B032BD70B5044661780020FBF719FE002807
-S3150800A3C011D104F1DC054022294604F11000FCF7FE
-S3150800A3D03BF9060009D033462A4661780020FBF788
-S3150800A3E0D7FD002801D1002070BD304670BD38B5B4
-S3150800A3F06B4C4FF48E7313FB00F0044492B204F1D5
-S3150800A4001000FCF748F9054604F11000FCF7CDF8F2
-S3150800A410402802DB2046FFF7CCFF284632BD604ABB
-S3150800A4204FF48E7111FB00F01044C2E71CB55C4C6A
-S3150800A43000224FF48E712046F9F7C4FA002013E083
-S3150800A440002000900123402204F11C01201DFBF787
-S3150800A45067FE002000900123402204F15C0104F10C
-S3150800A4601000FBF75DFE01200028E9D013BD10B5EA
-S3150800A47000204B4C0CE0002204212046F9F7A2FAF2
-S3150800A480201DFCF70CF904F11000FCF708F901206F
-S3150800A4900028F0D010BDFEB505460E467079FF2897
-S3150800A4A03AD130783718B918002420463C4A00E0DB
-S3150800A4B00120002806D150780028F9D19078002884
-S3150800A4C0F6D11446002C27D0B078207030790028B1
-S3150800A4D002D129E0387807447878052801D08F42D8
-S3150800A4E0F8D3601C0190A01C0090022332793946EB
-S3150800A4F02846FBF706FD00280ED03079C0EBC000D1
-S3150800A5000744A178002909D0402304F19C02284673
-S3150800A510FBF73EFD002801D10020FEBD607800282B
-S3150800A52002D02046FFF745FFBE1B304680B2FEBD6F
-S3150800A53038B51A4600201A4C0B4609E0A07805469D
-S3150800A540AB4209D06578AB4206D0012004F58E747B
-S3150800A5500028F3D0002032BD83420FD192B204F115
-S3150800A5609C01201DFCF797F80E48002802D0002011
-S3150800A570AFF300802046FFF7F4FE0DE060788142D5
-S3150800A5800AD10948002804D092B211460020AFF338
-S3150800A59000802046FFF70DFF012032BD00000000B5
-S3150800A5A0089BFE1F000000000000000050202749FD
-S3150800A5B008607047264A1060516070472349AA22EE
-S3150800A5C00A605522234B1A60A0220A60AA2101605C
-S3150800A5D070471E49AA220A601E4A55231360802323
-S3150800A5E00B60AA230B60552111603021016070476A
-S3150800A5F0F52016490860704717480068704770B517
-S3150800A60004460D46FFF7F4FFFFF7D0FF002607E0E4
-S3150800A61005EB8600416855F82600FFF7CBFFB61C08
-S3150800A620402EF5D32046FFF7C9FF0B480068C00740
-S3150800A630FBD470BD10B50446FFF7DAFF2046FFF7D6
-S3150800A640C8FF05480068C007FBD410BD5455000C68
-S3150800A650F055000CA8AA000C1020005861001A0337
-S3150800A660E0001703F8000703FF0001007801000166
-S3150800A670300132010601390110014A012E01790122
-S3150800A680060180014D004302810182018201840195
-S3150800A690840186018701870189018A018B018B0163
-S3150800A6A08D018E018F019001910191019301940111
-S3150800A6B0F60196019701980198013D029B019C01BC
-S3150800A6C09D0120029F01A001A001A201A201A401EF
-S3150800A6D0A401A601A701A701A901AA01AB01AC0122
-S3150800A6E0AC01AE01AF01AF01B101B201B301B301D3
-S3150800A6F0B501B501B701B801B801BA01BB01BC0182
-S3150800A700BC01BE01F701C001C101C201C301C401F8
-S3150800A710C501C401C701C801C701CA01CB01CA01E5
-S3150800A720CD011001DD0101008E01DE011201F301E8
-S3150800A7300300F101F401F401F801280122021201D3
-S3150800A7403A020900652C3B023B023D02662C3F0299
-S3150800A75040024102410246020A01530240008101B9
-S3150800A7608601550289018A0158028F015A02900111
-S3150800A7705C025D025E025F0293016102620294015D
-S3150800A7806402650266026702970196016A02622CF4
-S3150800A7906C026D026E029C01700271029D017302C9
-S3150800A7A074029F0176027702780279027A027B02A6
-S3150800A7B07C02642C7E027F02A60181028202A90124
-S3150800A7C08402850286028702AE014402B101B20103
-S3150800A7D045028D028E028F0290029102B7017B0319
-S3150800A7E00300FD03FE03FF03AC030400860388038E
-S3150800A7F089038A03B1031103C2030200A303A30357
-S3150800A800C4030803CC0303008C038E038F03D80309
-S3150800A8101801F2030A00F903F303F403F503F60338
-S3150800A820F703F703F903FA03FA0330042003500485
-S3150800A8301007600422018A043601C1040E01CF0400
-S3150800A8400100C004D004440161052604000000008C
-S3150800A8507D1D0100632C001E9601A01E5A01001FD3
-S3150800A8600806101F0606201F0806301F0806401F88
-S3150800A8700606511F0700591F521F5B1F541F5D1FF5
-S3150800A880561F5F1F601F0806701F0E00BA1FBB1FEA
-S3150800A890C81FC91FCA1FCB1FDA1FDB1FF81FF91FE6
-S3150800A8A0EA1FEB1FFA1FFB1F801F0806901F0806EA
-S3150800A8B0A01F0806B01F0400B81FB91FB21FBC1F8F
-S3150800A8C0CC1F0100C31FD01F0206E01F0206E51FAA
-S3150800A8D00100EC1FF21F0100FC1F4E21010032216E
-S3150800A8E070211002842101008321D0241A05302CFE
-S3150800A8F02F04602C0201672C0601752C0201802C9E
-S3150800A9006401002D260841FF1A03000038B5574890
-S3150800A9100168C90706D4416841F001014160016830
-S3150800A920C907FCD552480168890507D5816841F4ED
-S3150800A9300071816041F64C5000F0B8F84D4C206922
-S3150800A94040F40020206140F6C41000F0AFF82169F9
-S3150800A950494801402161206810F0300F19D021685C
-S3150800A960464801402160F9F74DFE2168444AB0FB8C
-S3150800A970F2F0401E41EA004121600020A0612069F2
-S3150800A98020F400302061E06800F46070B0F5607F64
-S3150800A990F9D1206940F001002061E068C007FCD5C4
-S3150800A9A0206940F01000206136486061206940F057
-S3150800A9B040002061206920F010002061206940F4E1
-S3150800A9C080202061E0684007FCD5206940084000E7
-S3150800A9D02061E068C007FCD42B4D4FF00110A86039
-S3150800A9E000202861E860E86128620320A8612748FA
-S3150800A9F0686127486862206920F040002061254880
-S3150800AA006061E0688006FCD54FF4166000F04EF8E9
-S3150800AA1021486061E0688006FCD54FF4616000F06B
-S3150800AA2045F81E486061E0688006FCD54FF49650EC
-S3150800AA3000F03CF81A486061E0688006FCD541F2EF
-S3150800AA40707000F033F817486061E0688006FCD53E
-S3150800AA504FF4E15000F02AF8052013490860002059
-S3150800AA602860BDE83140F9F78DBD00BF00420050AF
-S3150800AA700044005004470050FDFFFEFFCFFFF0FFE3
-S3150800AA80A0252600002F0B010446005005000100F2
-S3150800AA9003002001002F0501002F0301002F0201EA
-S3150800AAA0002F0101002F00016C41005081B00021E8
-S3150800AAB0009103E000BF0099491C0091009981426A
-S3150800AAC0F8D301B070470000026E012303FA01F1C2
-S3150800AAD022EA01010166704700EB8100C169C908D5
-S3150800AAE052EAC102C2617047C268D20801F0070182
-S3150800AAF051EAC201C1607047016841F04001016036
-S3150800AB007047016821F040010160704780B5002058
-S3150800AB108DF8000000F014F800F09CF800F000F939
-S3150800AB206946002000F0AAF89DF80000012801D126
-S3150800AB30FEF70EF900F033F800F003F9FCE7000021
-S3150800AB4010B500BF3EA0F9F75EF90020F9F7F7F94E
-S3150800AB500020F9F7DDF90420F9F72FFAF9F75EFA7C
-S3150800AB6020210120F9F762FA0120F9F72FFAF9F7FF
-S3150800AB7009FD802209212C48F9F7E2FC2B4C00221A
-S3150800AB800D212046F9F7DCFC0D212046FFF79CFF36
-S3150800AB902748F9F791F9BDE81040F9F791BA10B5C9
-S3150800ABA08CB000208DF818000120079002208DF83F
-S3150800ABB02000204C06AA04212046F9F779FC9020AB
-S3150800ABC08DF80C000120049002208DF8140003AAC9
-S3150800ABD005212046F9F76CFC012200211648FFF7EB
-S3150800ABE07BFF00208DF8240009AA0D212046F9F7DD
-S3150800ABF05FFC90208DF800000120019002208DF85E
-S3150800AC0008006A460C212046F9F752FC0B4C2046F0
-S3150800AC10FFF772FF02212046FFF766FF2046FFF77F
-S3150800AC2070FF0CB010BD000000850248008F024876
-S3150800AC3080000020008102480000034000430148CC
-S3150800AC4030020101000001000000000000000100C0
-S3150800AC500201010180B500F024F800280DD12E4824
-S3150800AC602E49016000210A4602E043181A71491C60
-S3150800AC703829FAD3BDE8014021E001BD70B5054683
-S3150800AC800C46002600F00DF8002808D0382D06D20C
-S3150800AC90002C04D02048284400792070012630462C
-S3150800ACA070BD10B500241C4800681C49884204D1B0
-S3150800ACB000F00BF8002800D00124204610BD80B50E
-S3150800ACC000F00EF81449888701BD10B5002400F07D
-S3150800ACD007F81149898F884200D10124204610BD02
-S3150800ACE00D490868024603461B0ADBB253FA82F28C
-S3150800ACF003461B0C52FA83F212EB106080B2002254
-S3150800AD0003E08B181B79C018521C382AF9D3C043A4
-S3150800AD10401C80B2704700000080FE1FA2E742CEAA
-S3150800AD2080B5FEF71DFCF8F7E9FEF8F7BDFEFEF75D
-S3150800AD3054FCFEF719F8FDF777FFBDE80140FDF76B
-S3150800AD402BB980B5F8F7DCFEF8F7C2FEFEF742F835
-S3150800AD50FDF77BFFBDE80140FDF726B94669726D30
-S3150800AD6077617265207570646174652072657175A6
-S3150800AD706573742064657465637465640A0D000000
-S3150800AD804F70656E696E67206669726D7761726568
-S3150800AD902066696C6520666F722072656164696EEB
-S3150800ADA0672E2E2E000000005374617274696E6758
-S3150800ADB0207468652070726F6772616D6D696E6761
-S3150800ADC02073657175656E63650A0D00506172734F
-S3150800ADD0696E67206669726D776172652066696C4F
-S3150800ADE06520746F20646574656374206572617389
-S3150800ADF06520626C6F636B732E2E2E00526561643C
-S3150800AE00696E67206C696E652066726F6D2066696B
-S3150800AE106C652E2E2E4552524F520A0D0000000028
-S3150800AE20496E76616C696420636865636B73756DDA
-S3150800AE3020666F756E642E2E2E4552524F520A0D9D
-S3150800AE40000000004669726D77617265207570644E
-S3150800AE50617465207375636365737366756C6C7965
-S3150800AE6020636F6D706C657465640A0D00000000E0
-S3150800AE70C700FC00E900E200E400E000E500E700A6
-S3150800AE80EA00EB00E800EF00EE00EC00C400C500A5
-S3150800AE90C900E600C600F400F600F200FB00F9005F
-S3150800AEA0FF00D600DC00A200A300A500A72092019F
-S3150800AEB0E100ED00F300FA00F100D100AA00BA00A3
-S3150800AEC0BF001023AC00BD00BC00A100AB00BB0056
-S3150800AED09125922593250225242561256225562547
-S3150800AEE055256325512557255D255C255B251025A8
-S3150800AEF0142534252C251C2500253C255E255F2593
-S3150800AF005A25542569256625602550256C2567250B
-S3150800AF1068256425652559255825522553256B2509
-S3150800AF206A2518250C25882584258C2590258025B5
-S3150800AF30B103DF009303C003A303C303B500C4032F
-S3150800AF40A6039803A903B4031E22C603B503292240
-S3150800AF506122B1006522642220232123F7004822BA
-S3150800AF60B0001922B7001A227F20B200A025A0003F
-S3150800AF702DE9FC4D016800F10805490805EBC102F9
-S3150800AF80019200F10803406800F0010A03EBC108CA
-S3150800AF90400808EBC00B0020002105E0009A964205
-S3150800AFA018BF16F9014B0CD1019A954206D02B68A9
-S3150800AFB06A68EE18324400920835EFE75846BDE84D
-S3150800AFC0F68D009A964205D12B686A68EE183244C7
-S3150800AFD00092083516F8017B884210D1D84508BF7B
-S3150800AFE000F017F8D8F80000D8F80410BAF1000FE6
-S3150800AFF018BF48440144884208F10808EED0002CDE
-S3150800B00000F8017B02D5641CE6D1C7E7641ED8D5D3
-S3150800B010C4E7012000F000B880B5AFF30080024A0B
-S3150800B02011001820ABBEFBE72600020000C0000C8A
-S3150800B03000400000030000000000010C0040000072
-S3150800B040040000000040010C00400000050000005C
-S3150800B0500080010C004000000600000000C0010C42
-S3150800B06000400000070000000000020C000002007B
-S3150800B070080000000000040C00000400090000009D
-S3150800B0800000080C000004000A00000000000C0C78
-S3150800B090000004000B0000000000100C0000040073
-S3150800B0A00C0000000000140C000004000D00000055
-S3150800B0B00000180C000004000E00000000001C0C24
-S3150800B0C0000004000F000000809A45418E418F80E1
-S3150800B0D04545454949498E8F9092924F994F555506
-S3150800B0E059999A9B9C9D9E9F41494F55A5A5A6A7F0
-S3150800B0F0A8A9AAABACADAEAFB0B1B2B3B4B5B6B74A
-S3150800B100B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C739
-S3150800B110C8C9CACBCCCDCECFD0D1D2D3D4D5D6D729
-S3150800B120D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E719
-S3150800B130E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F709
-S3150800B140F8F9FAFBFCFDFEFF000009021A030004E9
-S3150800B1503A061B071A080909090A1B0C1A0D000FDB
-S3150800B1601A103A113A123A183A193A1B1A1C1A1DA9
-S3150800B1703A1E1A201A211B263A2A1A373A381A066C
-S3150800B1803A0D3A161A1702291A2A3A3312011B05DA
-S3150800B1901B063A081A231A2472B60B480B49016093
-S3150800B1A0BFF34F8F62B60A490A6842F470020A6012
-S3150800B1B0C16821F00801C16006480168090909014A
-S3150800B1C041F004010160704708ED00E00000000846
-S3150800B1D088ED00E014200058433A5C576F726B5CA8
-S3150800B1E0736F6674776172655C4F70656E424C5416
-S3150800B1F05C5461726765745C536F757263655C4114
-S3150800B200524D434D345F584D43345C72733233327A
-S3150800B2102E630000433A5C576F726B5C736F6674FB
-S3150800B220776172655C4F70656E424C545C5461720E
-S3150800B2306765745C536F757263655C41524D434D27
-S3150800B240345F584D43345C7573622E63000000000A
-S3150800B25030B4002512E050F8042BD30744BF4A4403
-S3150800B260521E091F042942F8045BFAD213468C07BA
-S3150800B27044BF15809B1CC90748BF1D7050F8041BA6
-S3150800B2800029E8D130BC7047433A5C576F726B5C53
-S3150800B290736F6674776172655C4F70656E424C5465
-S3150800B2A05C5461726765745C536F757263655C663E
-S3150800B2B0696C652E63000000000000002000000095
-S3150800B2C040000000800000000001000000020000AD
-S3150800B2D00004000000080000001000000020000024
-S3150800B2E010B5074979441831064C7C44163404E0F5
-S3150800B2F00A68081D114488470146A142F8D110BDC5
-S3150800B3002C0000005C0000004EF68851CEF20001C9
-S3150800B310086840F470000860BFF34F8FBFF36F8F63
-S3150800B3204FF00070E1EE100A7047000025FFFFFF9E
-S3150800B330241F00006C82FE1FA030000000000020C1
-S3150800B340000000002DFCFFFF0200000002000000C4
-S3150800B35080020000990000004080FE1F2A020000BB
-S3150800B36080B510224FF000510448F8F759FBFFF753
-S3150800B37013FFBDE80140FFF7C9BA00BF90A1FE1F41
-S3150800B38000F00DF8002801D0FFF7AAFFAFF3008000
-S3150800B3900020AFF30080FFF7B9FB00F002F80120A8
-S3150800B3A0704700F001B8000007463846FFF734FE3C
-S3150800B3B0FBE700000548014603B4684680F30988A0
-S3150800B3C0AFF30080FFF7A0FFFFF7DAFFA5EDF5FE64
-S3150800B3D0DFF808D00248804702480047A8A9FE1FA0
-S3150800B3E061B30008B5B3000857696E555342204249
-S3150800B3F0756C6B2044657669636500004F70656EF1
-S3150800B400424C5420557365720000000031323334C3
-S3150800B410353637383930313200000000FFF7FEBFC5
-S3150800B420FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF42
-S3150800B430FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF32
-S3150800B440FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF22
-S3150800B450FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF12
-S3150800B460FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF02
-S3150800B470FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF2
-S3150800B480FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE2
-S3150800B490FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD2
-S3150800B4A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC2
-S3150800B4B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB2
-S3150800B4C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA2
-S3150800B4D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF92
-S3150800B4E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF82
-S3150800B4F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF72
-S3150800B500FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF61
-S3150800B510FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF51
-S3150800B520FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF41
-S3150800B530FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF31
-S3150800B540FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF21
-S3150800B550FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF11
-S3150800B560FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF01
-S3150800B570FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF1
-S3150800B580FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE1
-S3150800B590FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD1
-S3150800B5A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC1
-S3150800B5B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB1
-S3150800B5C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA1
-S3150800B5D000048100F70002C00148F800003F81001E
-S3150800B5E0F0000FFE390008FCB30008E8B300080CA9
-S3150800B5F0B40008C4000AF15E0008049DFE1F10008E
-S3150800B6000CDA001A42014800430148004401480088
-S3150800B610450148004601480047014800C00050FC63
-S3150800B620000F080027695B450000A02F0020203086
-S3150800B6300020FD000420D0170020FC00FE04F400C2
-S3150800B64017034000020340000002480002024800B7
-S3150800B650400248004202480001EA0008C880FE1F6E
-S30E0800B660D93B000803F80000FFBD
-S7050800B3B58A
+S315080068F07CB504461546012901D0012076BD2878C5
+S31508006900C0F34110022816D16878012813D1A88847
+S3150800691007280ED1094E022206F108016846FDF73E
+S315080069206FF8BDF80030324629462046FFF7FBFED1
+S3150800693076BD002076BD002076BD00BF50B20008A7
+S31508006940002231490878002800D07047F8B40120A1
+S315080069500870104600E0401C10281BD22B4B1C5C0C
+S3150800696023461B098DF800306B4604F00F045C7053
+S31508006970002401E0373506E0022CECD21D5D2E46D8
+S315080069800A2EF7D230350E1D1746FFB2F555521CA2
+S31508006990641CF1E70020091DD2B28854F1BC704787
+S315080069A01CA0704720A0704738B50446FFF7C8FFFB
+S315080069B0200007D116480222016C801CFDF720F83A
+S315080069C001211AE0042801D3002032BD104D05F13B
+S315080069D0400050F82440204600F03EF80146C9B26F
+S315080069E01F2900DD1F210020AB1C04E0225C23F8D0
+S315080069F01020401CC0B28842F8DB05484900891CB3
+S31508006A0041F44071018032BD2882FE1FB8A1FE1FE5
+S31508006A102481FE1F1201010200000040501DAC60D7
+S31508006A2000010102030100000902200001010080A3
+S31508006A304B0904000002FF000000070501024000A0
+S31508006A4000070581024000000120FDF7A0BC0000F8
+S31508006A50004870476CB5000800F10103810704D0AF
+S31508006A6010F8011B820781B1FAD10268A2F101313F
+S31508006A70914311F0803104BF50F8042FF6E709BAA4
+S31508006A80B1FA81F100EBD100401CC01A7047000032
+S31508006A90F0B4C2788A18874BDA710E46847814EBFC
+S31508006AA016249C7145785D71007818712746FFB2E7
+S31508006AB0B7EB162F06DA6D1C5D71EDB2002D01D10C
+S31508006AC0401C1871D2B201F0FF018A420DDA641C2B
+S31508006AD09C71E4B2002C08D15879401C5871C0B298
+S31508006AE0002802D11879401C1871F0BC704710B400
+S31508006AF00A44521E0BE00B784C7814EB0323181843
+S31508006B000446A4B29BB29C4200D2401C891C914206
+S31508006B10F1D308D1097810EB0120024692B2B2EB04
+S31508006B20012F00D2401C80B210BC704780B51422D9
+S31508006B30DFF8F01A0020FFF7DAFF010002D14FF65E
+S31508006B40FF7002BDBDE8024000F058BD38B5DFF859
+S31508006B50D84A217C627C12EB0121A1F11405082296
+S31508006B6004F11A01281880B2FFF7C1FF2A4692B22B
+S31508006B7004F12201FFF7BBFF010002D14FF6FF70B7
+S31508006B8032BDBDE8324000F039BD0620DEE749498E
+S31508006B900020487203E00020888201204872487A63
+S31508006BA00028F8D000204872DFF8802A03E0002089
+S31508006BB0507601204872487A0028F8D04FF4806051
+S31508006BC0088300204872DFF8682A03E000209080D6
+S31508006BD001204872487A0028F8D07047F8B504466C
+S31508006BE00E46344F388B401C388380B2B0F5FA4FC6
+S31508006BF002DB4FF4805038830020787209E0DFF812
+S31508006C00300A8588388B00F0F9FC8542EAD00120E5
+S31508006C107872787A0028F2D0002528467872DFF84C
+S31508006C20101A01E001207872787A002803D1888842
+S31508006C300028F7D10D46002D01D10020F2BD388B72
+S31508006C400146090A41EA0021A980EE80002C05D1F7
+S31508006C50002204212846FCF7B5FE03E02088288098
+S31508006C6060886880402028722846F2BDDFF8C4296B
+S31508006C700021517201E001215172517A002903D194
+S31508006C80918A0029F7D19082704738B50146DFF816
+S31508006C90A449656A05F10800FFF7FAFE207928720B
+S31508006CA06079616A4872A079616A8872E079616A76
+S31508006CB0C87231BD1CA1FE1FF8B5DFF878596C6A99
+S31508006CC00146042900F03481DFF85C6906F13601D3
+S31508006CD0E9612962014603290BD1607E00F00F00A5
+S31508006CE0032802D1208A002871D000202882287221
+S31508006CF0F1BD022970D1E878401CE870C0B20028BE
+S31508006D000ED1A878401CA870C0B2002808D16878AF
+S31508006D10401C6870C0B2002802D12878401C287030
+S31508006D2000202861617E072901D0052908D1A07EA7
+S31508006D30401CA076C0B27828D7D100206076D4E768
+S31508006D400029D2D0208A00283DD0A07E411EA176F7
+S31508006D500028CAD1E07E06F12207082806D0617EFF
+S31508006D60022901D001290AD1052808D10020607618
+S31508006D708020287200F0CAFC14207873BCE3014610
+S31508006D80042900DD0420032101FA00F0A076E07E44
+S31508006D90401CE076607E00F00F00401E0728A4D84D
+S31508006DA0DFE810F02E0209000C00050308000503B1
+S31508006DB00800050399E70020787325E20420287265
+S31508006DC000F0A4FC59E301F00F0103298DD1082036
+S31508006DD0287200F09BFC22E3052811D1A86A808856
+S31508006DE000283FF482AF0020686206F12A00E861B5
+S31508006DF02862002028610820287200F088FF97E0A2
+S31508006E00B07B45287FF471AF307C717C11EB002094
+S31508006E10298A8142FFF669AF2882307D10F03F0F3C
+S31508006E207FF463AF707D00287FF45FAFAF89002FD2
+S31508006E3002D1E889002808D0F08BB8427FF455AF14
+S31508006E40308CE98988427FF450AF4FF6FF74FFF71C
+S31508006E506DFEA0427FF449AFF07D06280AD1FFF700
+S31508006E6094FEA0427FF441AFDFF8C027144606F12E
+S31508006E7022078CE0112806D1288A1C382882DFF8D8
+S31508006E80B037AB621FE001287FF42FAF06F122006E
+S31508006E90017808297FF429AF0021017041884FF64F
+S31508006EA0F772914202DB0931418001E008314180E5
+S31508006EB0708BF083B08B30847783E889B0839AE34C
+S31508006EC002F14000A862AA6A03F140008242BFF4B8
+S31508006ED00CAF90880028F3D006F122014F8887422C
+S31508006EE0EED1D088002805D00988814202D0B0F5B5
+S31508006EF08A4FE5D11188002902D1508800280BD085
+S31508006F00A14202D15088A04206D0708B8842D7D1C0
+S31508006F10B08B51888842D3D100206862022028723B
+S31508006F2006F12A00E86128620020688200F0EFFE78
+S31508006F30688A00283FF4D9AE00F11C022A82DFF8DD
+S31508006F40E81613469BB21B0A0B744A74AB6A1A7A84
+S31508006F508A751122CA75083001F122020446A4B2C4
+S31508006F60240A44EA002494800020D080988810805F
+S31508006F70D8885080A8894883E88988831888C88370
+S31508006F805888088401F13600E86120E3AC34A2424F
+S31508006F90C0F0AE80607E0028F8D07888A188884244
+S31508006FA0F4D13888E1888842F0D1708B21888842EC
+S31508006FB0ECD1B08B61888842E8D16C6200202872D7
+S31508006FC0787B410700F13381397B090989006972A9
+S31508006FD02A8A511A14392982627E02F00F02022A7D
+S31508006FE004D1024602F03F02122A19D089B20029BA
+S31508006FF002D110F0030F13D03979227A914240F06A
+S3150800700079827979627A914240F07482B979A27A62
+S31508007010914240F06F82F979E27A914240F06A82B1
+S31508007020C0063ED5218A00293BD004F10C00FFF7A3
+S315080070302FFD2879397A814233D1797A6A79914252
+S315080070402FD1B97AAA7991422BD1F97AEA79914264
+S3150800705027D1207368796073A879A073E879E073FB
+S31508007060E07E002817D1A17D94F9180094F91A201A
+S31508007070821A0846A2EBD00252B25118A175100026
+S3150800708000D54042E17D4018A0EB9100E075A17D56
+S3150800709000EBD100207601202872207EA076002001
+S315080070A02082607E00F00F01491E07293FF61DAEBB
+S315080070B0DFE811F00900C4005D01060256026F02FE
+S315080070C02002FB0111E6287AC0077FF50EAE0320E1
+S315080070D060764020287200202082288A002800F046
+S315080070E09A81297A41F002012972FFF7CEFD92E1D1
+S315080070F0787B00F03F00022840F0FC80798869839D
+S315080071000020687201E001206872687A002840F061
+S31508007110F180A88A8142F6D100200AE0072906D123
+S31508007120002803D0817E937E994200D21046012121
+S315080071306972697A002903D1517E0029EED1104679
+S3150800714004003FF4D2AD6C620320A07620760020BE
+S31508007150A0750420E0750020E0767888A08038883D
+S31508007160E080708B2080B08B608001206076287864
+S31508007170207368786073A878A073E878E0730120B4
+S315080071802082F879E072B879A072787960723879D5
+S3150800719020720120FFF779FD3A7B104600F0F000D7
+S315080071A051282DDB0020687201E05B1C6B726B7A3C
+S315080071B0184611460909491FB0EB810F20DA3044F9
+S315080071C000F136073978A972002919D00129ECD0BF
+S315080071D07878022901D1042804D0002810D0C318D1
+S315080071E06B72E4E7B978F87840EA012068830146CB
+S315080071F040F20B62914201DB40F20A606082A08293
+S31508007200102006F12201487306F12200417B41F065
+S315080072100201417302210175042141750621817518
+S315080072200A21C1752C212982602101736AE1002097
+S3150800723060762020287200F069FA56E5287AC00799
+S3150800724051D5787B00F03F0012284CD13A7B104686
+S3150800725000F0F000512831DB0020687201E05B1C69
+S315080072606B726B7A184611460909491FB0EB810FF4
+S3150800727024DA304400F1360C9CF80010A972002973
+S315080072801CD00129EBD09CF80100022901D1042861
+S3150800729004D0002812D0C3186B72E2E79CF80210DB
+S315080072A09CF8030040EA01206883014640F20B621D
+S315080072B0914201DB40F20A606082A0820320607678
+S315080072C03879207278796072B879A072F879E072A4
+S315080072D00120FFF7DAFC422028720020208228616C
+S315080072E000F014FA9BE02020287200F00FFA002024
+S315080072F0696A4876787B40073FF5F7AC14207873BF
+S315080073002820288250203873FB796B72F87AF87136
+S31508007310FB72B8796872B97AB971B8727979697293
+S315080073207A7A7A7179723A796A723C7A3C713A72E7
+S315080073305B1CFB72DBB2002B0BD1401CB872C0B2CF
+S31508007340002806D1491C7972C9B2002901D1521CFC
+S315080073503A7238886883798839807880708BF083A8
+S31508007360B08B3084A8897083E889B0831FE1797B64
+S31508007370CA0721D5C0061FD4208A00287FF4B5ACD9
+S31508007380288A401C80B2FFF780FC297A41F0100158
+S315080073902972288A002802D041F00201297200F0D9
+S315080073A0B5F901202082082060760020E0761120B9
+S315080073B006F1220148739FE088060DD5F87CB97C52
+S315080073C0EA690B4684464CEA032C6244EA612A8A37
+S315080073D040EA0120101A2882288A002808D0617EEF
+S315080073E0C90605D4297A41F002012972FFF74DFC36
+S315080073F0B87BF97B11EB00206883A18A688B8142F0
+S3150800740001D3002800D16983688B6082287A10F03E
+S31508007410030F3FF46AAC0020688200F077F9297AF6
+S3150800742006F122008A0605D50021698261761421B3
+S31508007430417361E0CA060AD50021698201212182C9
+S31508007440042161760021E1761121417354E0688AAE
+S31508007450002810D0C80701D500202082208A0028DD
+S3150800746008D1608A2946498A884200D9084668822E
+S31508007470208200E068820020E076286AE86106F14A
+S315080074802201688A002807D0208A002804D02830DC
+S3150800749028821820487331E0287A80077FF525ACC2
+S315080074A0282028821020487328E0287AC0077FF50C
+S315080074B01CAC002060761020287200F027F914E42E
+S315080074C0288A002801D0FFF7E0FB287A797BC907CC
+S315080074D03ED5C00705D5072060760020A076208215
+S315080074E001E0062060760120FFF7CFFB1020287206
+S315080074F000F00CF91020787328202882502006F115
+S315080075002201087306F12200217A0172617A41721A
+S31508007510A17A8172E17AC172217B0171617B417125
+S31508007520A17B8171E17BC1710621F175A18801807A
+S31508007530E1884180A9897183E989B1832188F1832A
+S3150800754061883184617EC9062DD50021C1812EE06E
+S31508007550C00719D50520607600202082FFF7C5BB35
+S31508007560288A002801D0FFF790FB787BC0070BD547
+S31508007570072060760020A0760120FFF786FB102002
+S31508007580287200F0C3F8B5E7288A0028B2D1FFF7B9
+S31508007590ACBB287AC0077FF5A8AB07206076002029
+S315080075A0A076FFF7A2BB062181730A21C17340208A
+S315080075B0B075288A0146090A3174707406F12204E6
+S315080075C0002060822082FFF7E0FAC0432082164C32
+S315080075D04520A0730020E073A082E88A401CE88258
+S315080075E0014689B2090AA174E07400202083FFF7D6
+S315080075F09DFAC043208300202872F1BD0146000A87
+S3150800760040EA012080B27047012909DB094A518204
+S31508007610136A984204D0528A01461846FCF7F0B914
+S3150800762070470000A282FE1F9482FE1FEC9DFE1F7B
+S31508007630A8A0FE1F1CA1FE1F38B5964C607800282E
+S3150800764032D100F0E7FBFCF74CFA00F5FA706060FF
+S3150800765042F21075FCF745FA2818A060FFF797FA6A
+S315080076608D480021018041808C48018041808C48EA
+S31508007670018041804EF60300FFF7F8FA00F040FC5F
+S3150800768004F10C0000F078FC062104F10C0000F06F
+S3150800769024FB00F03DFB00F00DFDA84202D228466F
+S315080076A000F005FD0120207031BD7A4800214170A7
+S315080076B00078002800D1BFE77047764A1278012A79
+S315080076C000D0704730B4774A12681C32136853608A
+S315080076D0002304E0C45CD5182C725B1C9BB20C46D4
+S315080076E0A342F7DB02F18A00091D0180012181709E
+S315080076F01068401C106030BC704780B5654800783B
+S31508007700012801D100F049F8002002BD70B565488E
+S31508007710006800F11C0505F18A04634E30784106BD
+S3150800772006D50120286000202080A070E07070BD7A
+S31508007730C00701D50020E0703078400706D5E0780C
+S31508007740012803D12188281DFFF75EFF307800073E
+S315080077500DD5A07801280AD10020A070208800281D
+S3150800776005D00120E0702188281DFFF74DFF3078ED
+S31508007770800711D54D4801880846001F82280BDA74
+S31508007780E078002808D1091FC9B249480068001DD9
+S31508007790BDE8704000F0BABC70BD38B500F0F9FB22
+S315080077A0424C002825D020804FF40060FFF726FFC2
+S315080077B0404DA98981420CD10120FFF77DFA208826
+S315080077C0002816D000F080FF00F0F7FB002020808C
+S315080077D00FE040F60600FFF711FFA989814208D19C
+S315080077E000F014FF2088002803D000F0E6FB0020F4
+S315080077F02080FCF776F9274D696888422AD301F577
+S31508007800FA71696000200FE02B48264908600220BB
+S31508007810FFF752FA2088002805D000F055FF00F03F
+S31508007820CCFB0020208001200028EDD000200FE0AE
+S315080078302248234908600520FFF73EFA20880028D9
+S3150800784005D000F041FF00F0B8FB002020800120A1
+S315080078500028EDD0FCF745F9A968884205D301F55B
+S315080078601C511031A96000F043FE00200FE01248B9
+S315080078700C4908600320FFF71FFA2088002805D066
+S3150800788000F022FF00F099FB00202080012000284C
+S31508007890EDD031BD6882FE1F28A1FE1FB0A1FE1FD4
+S315080078A0ACA1FE1F40A1FE1F24A1FE1F2CA1FE1F96
+S315080078B038A1FE1F9482FE1FEC9DFE1FA8A0FE1F86
+S315080078C044A1FE1F35220270012242708170C01C3D
+S315080078D0704710B53621017004214170841C0A4690
+S315080078E0DFF858142046FCF78BF8201D10BD10B59C
+S315080078F03221017004214170841C0A46DFF84014C5
+S315080079002046FCF77DF8201D10BD372101700321A4
+S315080079104170012181700321C17006210171401D4A
+S315080079207047FF2100F8011B704738B5044601204F
+S3150800793020706070DFF80C54A869A0700020E07011
+S3150800794004220FF23041201DFCF75AF8002020814E
+S31508007950802060810422DFF8F01304F10C00FCF7A4
+S315080079604FF80022042104F11000FCF7CBF800229E
+S31508007970042104F11400FCF7C5F80022042104F1DF
+S315080079801800FCF7BFF8AA69696904F11C00FCF73E
+S3150800799037F8A8690022C0F1100104F11C03184445
+S315080079A0FCF7B0F80022402104F12C00FCF7AAF8F5
+S315080079B00022802104F16C00FCF7A4F804220FF2DF
+S315080079C0B83104F1EC00BDE83840FCF719B838B511
+S315080079D0DFF8784325682846FFF7A7FF012105F158
+S315080079E0F000FFF76FFFFFF790FFFFF79AFF226897
+S315080079F0801A01461046BDE83440FFF705BE38B583
+S31508007A00DFF8484325682846FFF78FFF032105F16D
+S31508007A10F000FFF757FFFFF75CFFFFF768FFFFF778
+S31508007A2080FF2268801A01461046BDE83440FFF7F9
+S31508007A30EBBD70B50446651800260EE00422A11CAD
+S31508007A40DFF80C03FBF7DCFF04E00422A11CBB48AB
+S31508007A50FBF7D6FFA01C61784418AC4223D22078E5
+S31508007A6001280CD0032810D0062814D03328E5D0D6
+S31508007A70352816D03628E8D0FF2814D0EAE704229D
+S31508007A80A11CB448FBF7BCFFE4E70422A11CB248DA
+S31508007A90FBF7B6FFDEE70422A11CB048FBF7B0FFF0
+S31508007AA0D8E7A678D6E7304670BD000038B5A748AF
+S31508007AB00468207802281ED15FF00402ADA1201DBB
+S31508007AC000F0ACFE002816D19E4DAA69696904F13A
+S31508007AD01C0000F0A3FE00280DD1042204F11001B9
+S31508007AE005F12400FBF78CFF9D48018804F1F0009E
+S31508007AF0BDE834409DE7002032BD38B50120914CE1
+S31508007B002188002916D040F20F12891A21D0491E61
+S31508007B1025D0153950D0491E53D02F3900F08E8004
+S31508007B20491E00F09080143900F0A780491E00F025
+S31508007B30AB80CEE0A0704FF47A702061FFF747FF64
+S31508007B40216904F1080000F09DFE002040F20F11A3
+S31508007B502180002800F093804FF488702080814DA2
+S31508007B602878800706D404F1080000F092FE002861
+S31508007B7000F094802878800706D5FFF797FF02283B
+S31508007B8002D10220A07009E020694EF660218842E1
+S31508007B9001DA40002061A0780228CFD14FF47A702C
+S31508007BA02061FFF72CFF216904F1080000F06AFE46
+S31508007BB0002040F225112180002860D04FF49370F0
+S31508007BC02080684D2878800705D404F1080000F065
+S31508007BD060FE002862D02878800703D5FFF766FF85
+S31508007BE0052864D0206942F2117188426EDA00F5E0
+S31508007BF07A702061A0780328D3D1204600F08DF84A
+S31508007C00208CFFF7FBFC0546608CFFF7F7FC50EA73
+S31508007C1005456D084FF47A704543B5F1004F01D21A
+S31508007C20256102E06FF000402061216904F1080037
+S31508007C3000F028FE002040F25511218000281ED0B1
+S31508007C404FF4AB70208004F1080000F022FE0028F3
+S31508007C5024D00220A0704FF47A70206100F058F802
+S31508007C6000F086F8FFF7CBFE216904F1080000F062
+S31508007C7009FE00204FF4B5712180002801D10320A8
+S31508007C8032BD40F26B102080364D2878800707D425
+S31508007C9004F1080000F0FDFD002801D1002032BDE6
+S31508007CA02878800706D5FFF701FF052802D10320AB
+S31508007CB0A070A2E7206942F21171884206DA00F53F
+S31508007CC07A702061A0780328CCD196E7002020801E
+S31508007CD032BD00202080022032BD1CB5194C6061DF
+S31508007CE0A1610020A0704FF6FF70ADF80000ADF856
+S31508007CF002004FF486416846FEF770FF6060002870
+S31508007D0002D04FF4884181800020208013BDF4E61C
+S31508007D100D4800210180418070470B49828C0A80FA
+S31508007D20C28C4A801049028D0A80428D4A800F49CA
+S31508007D30028E0A80408E48807047000004A1FE1F0C
+S31508007D400CA1FE1FE8A0FE1F28A1FE1F38A1FE1FDA
+S31508007D5008A1FE1F10A1FE1F18A1FE1F14A1FE1FD9
+S31508007D602CA1FE1F24A1FE1FB0A1FE1FACA1FE1F61
+S31508007D7070470000ADDE122363825363AC4801608E
+S31508007D8070470068016821F4801101607047006837
+S31508007D90036823F490431943114301607047143074
+S31508007DA00168807C40010858C00F7047016841F29D
+S31508007DB018028B5843F002038B500068016841F0A3
+S31508007DC0040101607047016841F218028B5843F4B8
+S31508007DD000538B500068016841F008010160704744
+S31508007DE00221026841F21403D1500021006841F2D1
+S31508007DF004028150704714300168807C01EB401002
+S31508007E008068704714300268807C02EB401041603D
+S31508007E10704700007FB500BF8FA004684FF480301C
+S31508007E20019000208DF80000824D6A4609212846F7
+S31508007E30FCF73EFB00208DF800007F4E6A460421C1
+S31508007E403046FCF735FB00208DF800006A46022113
+S31508007E503046FCF72DFB00208DF800006A4603210A
+S31508007E603046FCF725FB00208DF8080088208DF8A1
+S31508007E7000006A4605213046FCF71AFB00208DF8FB
+S31508007E80080088208DF800006A4608213046FCF76D
+S31508007E900FFB00208DF8080088208DF800006A4640
+S31508007EA009213046FCF704FB00208DF800006A46DD
+S31508007EB008212846FCF7FCFA00208DF808008820DF
+S31508007EC08DF800006A4607213046FCF7F1FA0020D3
+S31508007ED08DF800006A4601463046FCF7E9FA0122A9
+S31508007EE000213046FCF740FB5448044044F08864BF
+S31508007EF044F4206421465248FFF740FF7FBD000046
+S31508007F0038B54F4C204600F028FD2046FFF739FFCC
+S31508007F10FBF7E7FD054605F59855883501E0FBF7BB
+S31508007F20EFFD0021204600F0D5FE002803D1FBF71F
+S31508007F30D8FDA842F3D300BF45A20021204600F091
+S31508007F407BFE4FF400624FF480412046FFF71FFF87
+S31508007F502046FFF738FF2046FFF728FF3948082153
+S31508007F60017000214170272181706921C1705B2150
+S31508007F7001714521417131BD08210170002141700F
+S31508007F80272181706921C1705B21017145214171E9
+S31508007F90704770B500252A4E304600F07DFD040076
+S31508007FA009D040F2F550844205D222462649304689
+S31508007FB000F046FD2546284670BD38B5234D28886D
+S31508007FC0002834D040F2F551884230D21C4C204665
+S31508007FD0FFF7E5FE0028204602D0BDE83240FFE65E
+S31508007FE0FFF709FF002203E01749895C8154521CF8
+S31508007FF029888A42F8D32046FFF704FF04F12500B2
+S315080080004178C17049016269535843F0004353509F
+S315080080104178491C41700278C9B2914201D10021C8
+S315080080204170002020622046BDE83240D8E631BDC6
+S3150800803040400050008F024800820248F03A3FFF55
+S31508008040F881FE1F94A1FE1F9482FE1F2CA1FE1F1D
+S3150800805001000040000800000000000080B5012073
+S315080080601A49087000F029F8BDE8014010B500F07B
+S31508008070C8FE01281AD000F0EEFE002816D0134CD0
+S315080080802078012812D1FBF72CFDA26861688A18AE
+S3150800809002F5FA72904209D30020207000F0E2FE41
+S315080080A0002803D1BDE8104001F0BEBA10BD07494B
+S315080080B08860704705488068704710B5034C20787B
+S315080080C0012802D1FBF70DFD606010BD48A1FE1F17
+S315080080D0DFF80C0400F1810100220A70C0F888203C
+S315080080E0CA70A0F886201046887048707047DFF876
+S315080080F0F00390F88100401E8041C043C00F7047CE
+S315080081000020DFF8DC1381F88400704738B5DFF803
+S31508008110D04304F181050178FF2913D100F09AF8BC
+S31508008120E878012802D1102000F076F8B4F9861014
+S315080081300846012805DB0120E8702046BDE83440E2
+S315080081404FE031BD29780129FBD10178C92932D000
+S31508008150CC293FD0CF293AD0D0292FD0D12933D016
+S31508008160D2292ED0F32917D0F4290FD0F5290AD011
+S31508008170F6290ED0FA2912D0FC2913D0FD2914D0DD
+S31508008180FE2915D029E000F0CCF8C9E700F0E9F897
+S31508008190C6E700F0B9F8C3E700F007F9C0E700F052
+S315080081A0A1F8BDE700F09BF8BAE700F089F8B7E751
+S315080081B000F079F8B4E700F023F9B1E700F040F9E8
+S315080081C0AEE700F00CF9ABE700F069F9A8E700F0B4
+S315080081D07CF9A5E700F086F9A2E7202000F01CF854
+S315080081E09EE789B200F0CCBDF8B504460D461646A2
+S315080081F0002704E020783F18641CFBF781FC28461A
+S31508008200451E0028F6D1FFB237600120F2BD0020D6
+S31508008210B34981F882007047B149FE220A70487056
+S315080082200220A1F886007047014608784A7840EA95
+S3150800823002208A7840EA0240C97840EA016070471D
+S3150800824008700246120A4A700246120C8A70000E1C
+S31508008250C870704710B500F0FEFD002803D1102045
+S31508008260BDE81040D8E7FFF7D2FF9D4C012084F8FF
+S315080082708100FF202070102060700020A07000F0A0
+S31508008280A6FDE07000F0B0FD207100F0ADFD000A1B
+S3150800829060710120A071E0710820A4F88600BDE88D
+S315080082A0104001F0FCB910B58D4C002084F881000F
+S315080082B0FFF7ADFFFF2020700120A4F8860010BD4F
+S315080082C08748FF2101700021417000F182010A7878
+S315080082D082700022C2708280062088807047002043
+S315080082E09AE7000010B57E4CFF2020707EA0C4F8E7
+S315080082F08800002060706080211D0720FFF7A0FF1E
+S315080083000820A4F8860010BD10B5754CFF21217011
+S31508008310001DFFF789FFC4F888000120A4F886002D
+S3150800832010BD38B5044600F052FD6278401E11466D
+S31508008330884203DA2220BDE832406DE7684DD5F859
+S315080083408810681C01F09AF9FF202870D5F8880073
+S3150800835061784018C5F888006078401CA5F8860042
+S3150800836031BD38B5044600F032FD401E61788842BA
+S3150800837003DA2220BDE832404EE7201DFFF754FFFE
+S315080083800146574DC5F888106278681C01F076F9E1
+S31508008390FF202870D5F8880061784018C5F888004D
+S315080083A06078401CA5F8860031BD1CB500210091F7
+S315080083B04B4CFF212170001DFFF736FF01466A4628
+S315080083C0D4F88800FFF710FF6070211D0098FFF7AA
+S315080083D037FF002060800820A4F8860013BD10B57A
+S315080083E03F4CFF20207000206070A07000F0EFFC6A
+S315080083F0E0700020A080A0710720A4F8860010BDB8
+S3150800840038B5044600F0E3FC0146354D621C491EAA
+S31508008410D5F8880001F045F9002803D13120BDE8D8
+S315080084203240F9E6FF20287000F0D1FCD5F8881014
+S31508008430401E4018C5F888000120A5F8860031BD01
+S3150800844038B5044600F0C3FC801E6178884203DA1A
+S315080084502220BDE83240DFE6214DFF2028700120AA
+S31508008460A5F886006178002907D101F022F90028CD
+S3150800847014D13120BDE83240CEE6A21CD5F88800DA
+S3150800848001F00FF9002803D13120BDE83240C3E6D8
+S31508008490D5F8880061784018C5F8880031BD10B550
+S315080084A0001DFFF7C1FE0E4C0146D4F8880001F006
+S315080084B0FAF8002803D13120BDE81040ACE6FF20C9
+S315080084C020700120A4F8860010BD80B501F0ACF834
+S315080084D00348FF2101700121A0F8861001BD0000A4
+S315080084E0249FFE1F312097E64F70656E424C54005C
+S315080084F070B5BF4CA5786D1CA5700020207015E0DE
+S3150800850000EB40018A00BB4B981801889B1C9A5ABD
+S31508008510114309D02946C9B2827A891A782903DB18
+S3150800852000220421FBF7EEFA761C267026783046E0
+S315080085300828E5DB70BDF8B503460C46AD4A164675
+S31508008540AB4D0020287001E07F1C2F702F7838462D
+S31508008550082818DA00EB400112EB81063188002959
+S31508008560F2D070880028EFD0B3F800C08C45EBD164
+S3150800857059888142E8D106222146301DFBF740FA88
+S31508008580A878B072F1BD0020287001E0491C297056
+S3150800859029780846082809DA00EB400612EB860611
+S315080085A030880028F2D170880028EFD1082920D118
+S315080085B00020E8706870287011E002F10A0716FBBF
+S315080085C001F1795CAE78EF78B4468E46ACEB0E0CCA
+S315080085D0674502DA711AE9706870401C28702878B5
+S315080085E001460C260829E8DB6878287016FB00F691
+S315080085F01644042219463046FBF702FA062221469B
+S31508008600301DFBF7FDF9A878B072F1BDF8B57A4CC4
+S3150800861020882A2802D200202080F1BD0020208050
+S31508008620764DA88AB0F5807F03D0B0F5007F39D0A3
+S31508008630F1BD734EE88C3188884243D1288D718804
+S3150800864088423FD105F1160105F11C00FFF773FFBB
+S315080086504FF40070A882062205F1160105F12000E4
+S31508008660FBF7CEF9674F0622394605F11600FBF7E8
+S31508008670C7F906223946A81DFBF7C2F9062205F1F5
+S3150800868020012846FBF7BCF9A88BE884E88B2885E7
+S315080086903088A8837088E8834FF4C160A8812A20AF
+S315080086A02080F1BD5648E98C028891420AD1298D6D
+S315080086B04088814206D105F1160105F11C00BDE886
+S315080086C0F44038E7F1BD00002DE9F0414949084674
+S315080086D04FF6FF72494CE38B934208D1238C9342A1
+S315080086E005D106224BA12046FBF78AF972E0464AD5
+S315080086F01388434D2E883E4FB4F81EC003EA0C0C6F
+S31508008700B64603EA0E039C4508D15288238C1340CB
+S31508008710B5F802C002EA0C02934205D03B4A138818
+S31508008720BB805288FA8003E0E28BBA80228CFA80FA
+S3150800873000223A7001E0521C3A703A781346082B28
+S315080087400DDA03EB430001EB8000BB88B0F800C0EC
+S315080087506345F0D1FB88B0F802C06345EBD1082A1F
+S3150800876033D1FF2206212046FBF7CCF90022062149
+S3150800877004F12000FBF7C6F9DFF888800622414697
+S31508008780A01DFBF73DF90622414604F11600FBF74A
+S3150800879037F9B888E084F8882085A6836888E08356
+S315080087A04FF48070A082E081082020820620A07401
+S315080087B00420E0744FF4C160A08104F13600144926
+S315080087C008602A200C4908800FE00622011D204671
+S315080087D0FBF716F906220B49A01DFBF711F908202D
+S315080087E0A081054801880E310180BDE8F0810000AE
+S315080087F09CA1FE1FB09FFE1F2CA1FE1F9482FE1F88
+S3150800880028A1FE1F94A1FE1FB0A1FE1FACA1FE1F4A
+S3150800881038A1FE1FFFFFFFFFFFFF00000300002037
+S3150800882013F0030F09D0521E22BF13F8010B11F8DB
+S3150800883001CBB0EB0C00F3D0704711F0030F14D145
+S31508008840121F22BF53F8040B51F804CB6045F7D02A
+S31508008850121D0AD200BA9CFA8CFCB0EB0C0038BF89
+S315080088606FF0000088BF01207047521E22BF13F820
+S31508008870010B11F801CBB0EB0C00F6D0521C08BF67
+S315080088801046704710B50446616000F01DFF206071
+S3150800889010BD10B5044600F017FF2168401A61683C
+S315080088A0884201DB012010BD002010BD02684FF48C
+S315080088B08051535843F00103535002685258D20767
+S315080088C0FBD4704701680B64006842647047DFF8A0
+S315080088D0F0020068DFF8EC12096801F0010188402F
+S315080088E0704780B5FFF7F3FF400802BD10B5044690
+S315080088F0FFF7DCFF4FF4806021680860802021685C
+S315080089008861DFF8C402216841F218028850DFF84E
+S31508008910BC02216801F580510860204600F02FF856
+S31508008920204600F05FF84FF0FF30216841F214024C
+S3150800893088506FF07C402168C1F810012168C1F8A1
+S315080089400C016FF0C0202168C1F800024FF40270D4
+S315080089502168C8630020206210BD38B5044600F0BF
+S31508008960E4F8204600F0ADF805462046FFF7BEFFBE
+S31508008970D4E902232046FFF7A5FF284632BD70B486
+S315080089800146002320E00020A86012E05A014FF0BB
+S315080089900045855044F2F4500D691544686008692D
+S315080089A0851888690028EED040F2F4565E433044B4
+S315080089B0A8605B1C18462478A04200D100200C69E8
+S315080089C004EB40102244D060086901F1240422789F
+S315080089D09342DBD3096841F20C0288500020E0700C
+S315080089E070BC704770B4014600231BE00020A860E5
+S315080089F00DE05A01DFF8D851855048698518C869CD
+S31508008A000028F3D040F2F4565E433044A8605B1C5D
+S31508008A1018462478A04200D100204C6904EB401087
+S31508008A202244D060486901F1250422789342E0D3B4
+S31508008A30096841F2100288500020607070BC7047C7
+S31508008A4070B504460846154604F124062169F278ED
+S31508008A5001EB421189682A46FAF7D2FF2069F178B4
+S31508008A6049014FF000424250F078401CF0703178CE
+S31508008A70C0B2884201D10020F070206841F214018A
+S31508008A804258120606D5802242500020216841F23B
+S31508008A9008028850284670BD0146002010310A6831
+S31508008AA0C97D4901515800290AD401F40340B0F59B
+S31508008AB0407F02D04FF0FF307047C1F30D40001FD2
+S31508008AC0704710B50446FFF70CFF014600202268E0
+S31508008AD01032DFF80031994202D20821116010BD28
+S31508008AE0DFF8F430994202D20C21116010BDDFF88C
+S31508008AF0EC30994202D20146116010BDDFF8E03031
+S31508008B00994202D20421116010BDDFF8D83099428B
+S31508008B1002D21021116010BDDFF8CC30994202D282
+S31508008B201421116010BD022010BD10B50420FBF7FA
+S31508008B304DFADFF8B8402046FBF756FA2046BDE85E
+S31508008B401040FBF7B9B930B40468256905F03C054F
+S31508008B5045EAC12545EA821545F00105256100214A
+S31508008B6002681469E40705D5491C4FF6FF7291425D
+S31508008B70F6D304E050691880002030BC7047022004
+S31508008B80FBE710B40468636103681C6904F03C04DD
+S31508008B9044EAC12444EA821444F003041C61002117
+S31508008BA002681269D20705D5491C4FF6FF72914231
+S31508008BB0F6D302E0002010BC70470220FBE7000055
+S31508008BC0C8A1FE1F104600500400200280200102A2
+S31508008BD000001070C10E16020187930301E1F50526
+S31508008BE081D1F00801C2EB0B81B2E60E0400002029
+S31508008BF038B504460D460DF102030222FFF7A3FF1E
+S31508008C00002817D16B46032229462046FFF79BFF0B
+S31508008C1000280FD1BDF80200222809D1BDF800109E
+S31508008C204FF6F0700140B1F5AB5F01D1002032BDBF
+S31508008C30032032BD042032BDF8B505460E46174658
+S31508008C404FF0FF3431462846FFF7D2FF002801D0FF
+S31508008C50641EF7D1002827D13146284600F025F8AA
+S31508008C60002821D10020B7F90210B1F5804F01D1B3
+S31508008C704FF40050B7F90410B1F5006F01D140F474
+S31508008C808070B979012901D140F48050F979012918
+S31508008C9001D140F48040034600223146284601B0FF
+S31508008CA0BDE8F040FFF76DBFF2BD38B504460D4686
+S31508008CB04FF400430022FFF764FF002809D16B46F2
+S31508008CC0002229462046FFF73EFFBDF8001009049A
+S31508008CD0F5D432BD80B56B460122FFF734FFBDF8E7
+S31508008CE00000C0B2800800F0010002BD10B5FFF711
+S31508008CF0EFF900F00FFD4C4C0120207000F018FE33
+S31508008D000020207000F0F2FE0220207010BD1CB575
+S31508008D10454C6946201D00F0B9FD012806D1012001
+S31508008D2020709DF80010201DFFF7F0F96946201DF8
+S31508008D3000F04EFE012806D1002020709DF8001094
+S31508008D40201DFFF7E3F96946201D00F004FF0128FE
+S31508008D5006D1022020709DF80010201DFFF7D6F9D5
+S31508008D606946201DFEF7C9FC012806D1032020709C
+S31508008D709DF80010201DFFF7C9F913BD00F0C6BE07
+S31508008D8070B504460D46284E3078012803D1C9B27D
+S31508008D90204600F054FD3078002804D12946C9B28F
+S31508008DA0204600F0ECFD3078022804D12946C9B2E5
+S31508008DB0204600F0ADFE3078032804D12946C9B212
+S31508008DC02046FEF77AFCBDE87040FFF799B91648C9
+S31508008DD00078012802D0022802D003E00820704754
+S31508008DE03F207047812070470F480078012802D03D
+S31508008DF0022802D003E0082070473F2070478120F0
+S31508008E00704710B50024FFF772F9002800D0012436
+S31508008E10204610BD80B5FEF748FC032002490870BD
+S31508008E20BDE80140FFF749B94080FE1F80B5002024
+S31508008E30DFF86C160870024616A1DFF86806F8F720
+S31508008E404FFB002806D07721DFF85C06BDE8044012
+S31508008E5000F0CEBE01BDDFF848060078401E80410E
+S31508008E60C00F704710B5FFF7CCFF012801D10020CD
+S31508008E7010BDDFF82C462078002801D0002010BD50
+S31508008E80FBF788FA012802D10120207010BD0020C6
+S31508008E9010BD0000303A00002DE9F84F0026DFF833
+S31508008EA000562878002800F00A82012835D100F0FB
+S31508008EB0F6FBFBF78DFADFF8F4452046FBF7ADFA2B
+S31508008EC004F12400FBF7A9FAFBF780FA0146012210
+S31508008ED0DFF8DC05F8F72FFB00280AD030462870A3
+S31508008EE00FF2AC60FBF799FA0120BDE8F24FFBF7E9
+S31508008EF08CBA0FF2A460FBF790FA04F14C00FBF76A
+S31508008F008CFA04F17000FBF788FADFF8A8053146F9
+S31508008F104160816002202870D1E1022840F00E816C
+S31508008F20DFF8804504F50C78DFF88C7542464FF477
+S31508008F3080713846F8F7D2FE04F50F714979002991
+S31508008F400DD0304628700FF24860FBF766FA02200B
+S31508008F50FBF75BFA4046BDE8F24FF8F785BD0028F7
+S31508008F6017D0324607F5C071384600F0E7F90646CD
+S31508008F7016F1010F0DD1002028700FF21460FBF7CF
+S31508008F804CFA0320FBF741FA4046BDE8F24FF8F7E2
+S31508008F906BBD002E63DD07F5C079D9F80840D9F80E
+S31508008FA00000002C04D1C9F80400C9F8086056E08E
+S31508008FB0D9F804106118884203D13619C9F808602F
+S31508008FC04DE00FF2D45A5046FBF727FA0FF2D0506D
+S31508008FD0FBF723FA07F5C67B5946204600F099FAAF
+S31508008FE05846FBF71AFA0FF2C450FBF716FA594619
+S31508008FF0D9F80400000E00F07BFA07F5C771D9F816
+S315080090000400000CC0B200F073FA07F5C871D9F86D
+S315080090100400000AC0B200F06BFA07F5C971D9F866
+S315080090200400C0B200F064FA5846FBF7F6F9A5A0AA
+S31508009030FBF7F3F9D9F80810D9F8040000F033FB68
+S31508009040002867D05046FBF7E8F9DFF87004FBF70D
+S31508009050E4F9D9F80000C9F80400C9F80860DFF88F
+S31508009060600481680068814240F0298100214046F9
+S31508009070F8F709FD00280DD0002028700FF21050CF
+S31508009080FBF7CBF90420FBF7C0F94046BDE8F24FE1
+S31508009090F8F7EABC07F5C076B4680FF2FC49002C6D
+S315080090A046D04846FBF7B9F90FF2F440FBF7B5F995
+S315080090B007F5C67A5146204600F02BFA5046FBF7CC
+S315080090C0ACF90FF2E840FBF7A8F951467068000EB4
+S315080090D000F00EFA07F5C7717068000CC0B200F010
+S315080090E007FA07F5C8717068000AC0B200F000FAFE
+S315080090F007F5C9717068C0B200F0FAF95046FBF777
+S315080091008CF970A0FBF789F9B168706800F0CBFAA2
+S3150800911000280DD1002028700FF27440FBF77DF966
+S315080091200520FBF772F94046BDE8F24FF8F79CBCFC
+S315080091304846FBF772F903202870C0E0032840F080
+S31508009140BE80DFF8608308F50C77DFF86C433A4693
+S315080091504FF480712046F8F7C1FD08F50F7898F8A6
+S31508009160051000290CD030462870D648FBF755F96B
+S315080091700220FBF74AF93846BDE8F24FF8F774BC07
+S31508009180002817D004F5807204F5C071204600F057
+S31508009190D5F8064616F1010F0CD100202870CA48EA
+S315080091A0FBF73BF90320FBF730F93846BDE8F24FE9
+S315080091B0F8F75ABC002E50DD0FF20C40FBF72DF9DC
+S315080091C004F5C67A5146304600F0A3F95046FBF737
+S315080091D024F90FF20440FBF720F904F5C07951464B
+S315080091E0D9F80000000E00F083F904F5C771D9F824
+S315080091F00000000CC0B200F07BF904F5C871D9F87C
+S315080092000000000AC0B200F073F904F5C971D9F874
+S315080092100000C0B200F06CF95046FBF7FEF829A032
+S31508009220FBF7FBF804F580723146D9F8000000F028
+S3150800923038FA00280DD1002028700FF25430FBF7B9
+S31508009240ECF80620FBF7E1F83846BDE8F24FF8F7E8
+S315080092500BBC0FF24430FBF7E0F8D8F80800D8F852
+S31508009260001088422BD10FF28830FBF7D6F800F0B1
+S3150800927020FA00280DD10020287000BFC4A0FBF7F3
+S31508009280CCF80720FBF7C1F83846BDE8F24FF8F7E7
+S31508009290EBBB00BFC0A0FBF7C0F80FF27030FBF7BE
+S315080092A0BCF83846F8F7E0FB8848FBF7B6F8002024
+S315080092B02870FBF79DF8BDE8F14F00F0B5B9BDE899
+S315080092C0F18F00002E2E2E0010B50446207800F0EF
+S315080092D093FC532805D16478204600F093FC0028B7
+S315080092E001D1032010BD312C01D1002010BD322C34
+S315080092F001D1012010BD332C01D1022010BD03205D
+S3150800930010BD70B5841C204600F01DF905462E4692
+S31508009310A41C204600F017F936186D1EA41C284612
+S3150800932080B20228F5DAF643204600F00CF9F6B2C8
+S31508009330864201D0002070BD012070BD2DE9F041A4
+S3150800934006460D4614460027002D01D0002E04D1EE
+S3150800935040F26321544800F04BFC3046FFF7B4FF57
+S315080093608046B8F1030F01D1384697E03046FFF73B
+S31508009370C8FF002802D14FF0FF308FE0B8F1000F88
+S3150800938004D0B8F1020F53D025D386E0B71C38466F
+S3150800939000F0D9F80646BF1C384600F0D4F800029B
+S315080093A02860BF1C384600F0CEF8296808182860DF
+S315080093B0BD1CF71E3FB2002C6FD00026B0461FFA20
+S315080093C088F8B84569DA284600F0BDF804F80800B8
+S315080093D0AD1C761CF2E7B71C384600F0B4F8064612
+S315080093E0BF1C384600F0AFF800042860BF1C38469A
+S315080093F000F0A9F8296801EB00212960BF1C38464E
+S3150800940000F0A1F8296808182860BD1C371F3FB26C
+S31508009410002C42D00026B0461FFA88F8B8453CDA38
+S31508009420284600F090F804F80800AD1C761CF2E710
+S31508009430B71C384600F087F80646BF1C384600F0C9
+S3150800944082F800062860BF1C384600F07CF82968B8
+S3150800945001EB00412960BF1C384600F074F8296802
+S3150800946001EB00212960BF1C384600F06CF829681A
+S3150800947008182860BD1C771F3FB2002C0DD00026A7
+S3150800948006E0284600F05FF804F80800AD1C761CD4
+S31508009490B0461FFA88F8B845F3DB3846BDE8F081D0
+S315080094A0B4A1FE1FD888FE1F60B4000894AE000859
+S315080094B0088BFE1FE49AFE1F6499FE1F04AF00087E
+S315080094C0148BFE1F34AF000858AF00087CAF0008A5
+S315080094D080B500F00F0130310A2801DBC91D04E010
+S315080094E0C9B2084600F088FB01460846C0B202BD6C
+S315080094F038B504460D460009FFF7EAFF287004F060
+S315080095000F042046FFF7E4FF68700020A87028467D
+S3150800951032BD10B402460A23491CB2FBF3F2002AF4
+S31508009520FAD100220A700A22B0FBF2F2134603EBC4
+S315080095308304A0EB4400303001F8010D1000F2D18D
+S31508009540084610BC704770B5044600252E460AE04A
+S3150800955030380146C9B20A2900DBC01F294605462C
+S3150800956005EB0115761C3046C0B202280DDA205CE0
+S3150800957000F042FBC0B2A0F13001172903D2A0F1D6
+S315080095803A010729E4D2002070BD2846C0B270BD52
+S315080095904552524F520A0D004F4B0A0D000000006B
+S315080095A045726173696E6720000000002062797455
+S315080095B065732066726F6D206D656D6F72792061B7
+S315080095C0742030780000000050726F6772616D6D0C
+S315080095D0696E672000000000206279746573207444
+S315080095E06F206D656D6F7279206174203078000088
+S315080095F057726974696E672070726F6772616D2041
+S31508009600636865636B73756D2E2E2E00436C6F73DE
+S31508009610696E67206669726D776172652066696C26
+S31508009620650A0D0000F0F3BA10B500F03EF8002800
+S3150800963003D1BDE81040FFF7EDBBFAF796FE002808
+S3150800964003D1BDE81040FFF7E5BBFFF797FBFAF734
+S3150800965039FA00F02CF8074908400749086000F075
+S3150800966026F8001D046800F0D4FAA047BDE81040AB
+S31508009670FFF7D0BB80FFFF1F08ED00E070B504467A
+S315080096800D46164605E015F8010B04F8010BFAF726
+S3150800969037FA3046461E80B20028F4D170BD00F075
+S315080096A0C1BA00F0C8BA00F0F2BA00F02FBB00F059
+S315080096B05CBB80B500F00BFB002801D1002002BD81
+S315080096C0BDE8014000F03ABBFAF70BBA016841F071
+S315080096D0400101607047016821F040010160704750
+S315080096E0016841F0010101607047016849084900B5
+S315080096F0016070470068C06970470068C1617047BB
+S31508009700816841F0005181600068C16841F00051EC
+S31508009710C1607047FEB56E4C204600F039FDFAF779
+S31508009720E5FB054602E06D00FAF7EAF96948854265
+S31508009730F9D36948854203D36D08FAF7E1F9F8E7E2
+S315080097402A460121204600F042FD00956348019013
+S315080097504FF4FA50ADF808000120ADF80A00604D44
+S315080097606946686A00F08DFC686AFFF7AFFF686AA9
+S31508009770FFF7B6FF5B4E2E60696801F000515A4844
+S3150800978001436960AA6802F0604240F2E170024350
+S31508009790AA6021F0005169602846FFF7B1FF08204A
+S315080097A02873002005E000210246D2B22A4411742B
+S315080097B0401C01462A7BC9B29142F4D3012028767F
+S315080097C0284600F06BFD00220121204600F0CEFC61
+S315080097D0464F06F120003860796801F00051444888
+S315080097E001437960BA6802F0604240F2676002435A
+S315080097F0BA6021F0005179603846FFF781FF0820EA
+S315080098003873002005E000210246D2B23A441174AA
+S31508009810401C01463A7BC9B29142F4D300203876FF
+S31508009820384600F03BFD01221146204600F09EFC1A
+S31508009830686AFFF750FF686AFFF757FFF7BD38B544
+S31508009840274C2173002104E0425C63181A74491CF2
+S31508009850C9B2227B9142F7DB204600F06AFD02215D
+S315080098602046FFF74AFF204600F080FDFAF739F94F
+S31508009870054632352046FFF73DFF800705D5FAF73E
+S315080098803FF9FAF72EF98542F4D231BDF8B5054607
+S315080098900E460027154C2046FFF72CFFC00715D5A6
+S315080098A0204600F077FD00280CD1207B3070384622
+S315080098B005E02118097C29540127401CC0B2217BE8
+S315080098C08842F6DB01212046FFF717FF3846F2BD2E
+S315080098D000400148001BB700010E270720A107001A
+S315080098E0C081FE1F00500148E107008058A1FE1FF5
+S315080098F067060080D0F81401000B00F001007047DD
+S31508009900D0F8140100F440707047C0F81811704779
+S31508009910D0F81401C00800F0010070470122FAF7D8
+S31508009920ABBE016C0909090141F0020101647047E7
+S315080099301FB54FF46140009008208DF805008DF89A
+S31508009940060001208DF8070010208DF80800002079
+S31508009950ADF80A005A4C69462068FFF7DFFF012375
+S31508009960042210212068FAF7A5FF0123042200210A
+S315080099702068FAF7B3FF2068FFF7D3FF1FBD70B55D
+S3150800998004460D462846822803DB7A214D4800F016
+S315080099902FF9284600F06CF8012803D07E214948A3
+S315080099A000F026F900260DE0FAF7AAF8304680B24C
+S315080099B0205C00F05DF8012803D08721414800F0BB
+S315080099C017F9761C3046294680B28842ECD370BD1A
+S315080099D0F8B505460E463C4C6078002812D1201D85
+S315080099E000F035F8012830D1207900282DD08228BA
+S315080099F02BDAFAF776F8C4F88800002020700120E0
+S31508009A00607022E0601D2178084400F020F80128E3
+S31508009A1012D127787F1C277038462179C0B2884230
+S31508009A2013D13A46D2B2611D2846FFF727FE002019
+S31508009A30607037700120F2BDFAF753F8D4F8881031
+S31508009A40C831814201D2002060700020F2BD38B5CD
+S31508009A5004461B4805682846FFF75AFF002805D123
+S31508009A602846FAF764FE2070012032BD002032BD78
+S31508009A70F8B504460125124E37683846FFF73AFF0F
+S31508009A80002801D00020F2BD21463846FAF737FEF5
+S31508009A90FAF727F804460A343068FFF731FFC0059D
+S31508009AA006D4FAF72DF8FAF71CF88442F4D2002502
+S31508009AB04FF480713068FFF728FF2846F2BD000092
+S31508009AC05082FE1F70B30008989EFE1F002000F00B
+S31508009AD0DBBC0A460146002000F0F6BC0A460146F1
+S31508009AE0002000F020BD002000F035BD80B5002024
+S31508009AF0FBF7B9FDFEF7DEFAB0F5FA6F05D24FF4BB
+S31508009B00FA60BDE80240FEF7D2BA01BDFBF794BD84
+S31508009B1013B504460846402803DB75212A4800F099
+S31508009B2067F8012101A8FFF7D9FF012803D0792199
+S31508009B30254800F05DF89DF804102046FFF7CEFF93
+S31508009B409DF80410884203D07C211F4800F050F885
+S31508009B50FFF7C9FF13BDF8B505460E460020FBF70B
+S31508009B6053FC00214FF0FF30FBF7ECFD174C6078F3
+S31508009B7000280FD1201D00F02BF8012808D12079E4
+S31508009B80002805D0402803DA0120607000202070E4
+S31508009B900020F2BD601D2178084400F019F801285C
+S31508009BA0F6D127787F1C277038462179C0B28842BB
+S31508009BB0EED13A46D2B2611D2846FFF75FFD002076
+S31508009BC0607037700120F2BD10B4000864A0FE1F53
+S31508009BD038B504460025FFF779FF002806D001218D
+S31508009BE02046FFF776FF012800D10125284632BD19
+S31508009BF080B5F9F785FFFCE7A0F161011A2938BF9E
+S31508009C002038704730380A288041C00F704772B62E
+S31508009C10704762B67047000080B500F089FD00F015
+S31508009C20010002BD4FF0FF30DFF8EC130860DFF8E3
+S31508009C30EC130860704770B50D46164600F0F8F943
+S31508009C400446DFF8DC03001B691E88420AD3204657
+S31508009C5000F0ACF9FF2805D02819401E00F0A6F937
+S31508009C60FF2801D1002070BDA00A8002DFF8B413D6
+S31508009C7088422B463246214604D1DFF8A003BDE8C8
+S31508009C807040A3E0DFF89003BDE870409EE070B531
+S31508009C900D4600F0CDF90446DFF88403001B691E63
+S31508009CA088420ED3204600F081F906462C19641E18
+S31508009CB0204600F07BF93146FF2902D00146FF29EC
+S31508009CC001D1002070BD3046BDE87040FCE080B58B
+S31508009CD0DFF84813086810F1010F01D1012002BD11
+S31508009CE04A6888688218C8688218086982184869A4
+S31508009CF0821888698218C8698218D24300926A460F
+S31508009D000421DFF82403FFF796FF02BDDFF81413DA
+S31508009D100A684868821888688218C86882180869B4
+S31508009D2082184869821888698218D243BE48006832
+S31508009D30824201D1012070470020704780B5B7489C
+S31508009D40016811F1010F03D000F080F8002808D04F
+S31508009D50B148016811F1010F05D000F077F8002825
+S31508009D6001D1002002BD012002BDAE48704780B572
+S31508009D708A0501D0002002BD02688A4201D101206D
+S31508009D8002BD01604FF48062001DFFF777FC0120D9
+S31508009D9002BD38B504460D46A048844208D19E4CFB
+S31508009DA029462046FFF7E3FF00280DD1002032BDE3
+S31508009DB09C498D4201D10446F2E7204600F046F858
+S31508009DC00028EDD1002032BD204632BD2DE9F041F4
+S31508009DD00446884616461D464FEA9827BF0220685D
+S31508009DE010F1010F05D139462046FFF7C0FF0028BC
+S31508009DF027D02068B84205D039462046FFF7C9FF64
+S31508009E0004001ED02068A8EB000804EB080000F147
+S31508009E100408F9F775FE201DA8EB0000B0F5806F61
+S31508009E2008D307F580612046FFF7B3FF040008D082
+S31508009E3004F1040816F8010B08F8010B6D1EE8D1A9
+S31508009E4001E0002000E00120BDE8F0812DE9F041A5
+S31508009E500446206800F0AAF8FF2830D0002500E064
+S31508009E606D1C042D2DD2F9F74BFE266816EB052638
+S31508009E7004EB0520071DF9F734FE804608F10D08A6
+S31508009E803946304600F057FC05E0F9F72AFE8045CA
+S31508009E9015D3F9F735FEFFF7BFFE0128F5D000F018
+S31508009EA047FC30F010000AD1002000E0401CB0F555
+S31508009EB0807FD5D2811909783A5C9142F6D0002084
+S31508009EC000E00120BDE8F081F8B505460C462046BD
+S31508009ED02946884235D32846032832D320461028F7
+S31508009EE02FD20BE0F9F70CFEFFF796FE012824D0D7
+S31508009EF000F01EFC30F0200023D16D1C20462946B8
+S31508009F00C9B288421FD3F9F7FBFD2846C0B200F054
+S31508009F1067F8064616F1010F13D02846C0B200F0BE
+S31508009F2014F80028E9D1F9F7DCFD074607F5C85704
+S31508009F30C837304600F01AFCD6E7F9F7D2FD874253
+S31508009F40D0D20020F2BD0120F2BDF8B5002421468A
+S31508009F50364A064601E0491CC9B20D2924D201EB4E
+S31508009F60410302EB83031D7AB542F4D11D685E688E
+S31508009F7015F0030F02D116F0030F05D040F24F314A
+S31508009F8002F19C00FFF734FE0124002701E02D1D95
+S31508009F907F1CB7EB960F07D2380601D1F9F7B0FD4B
+S31508009FA028680028F3D000242046F2BD38B50446B8
+S31508009FB0002501E06D1CEDB20D2D0FD2F9F7A0FDBD
+S31508009FC01A4805EB450100EB810001688C42F1D384
+S31508009FD0426851188C42EDD2007A32BDFF2032BD5C
+S31508009FE070B504464FF0FF35002600E0761C304673
+S31508009FF0C0B20D280DD2F9F783FD3046C0B200EB8A
+S3150800A0004001880009490A18127A23469A42EDD176
+S3150800A0100D58284670BD0000308DFE1F3491FE1F76
+S3150800A020FFFF1F0C00C0000C00C2000CA8B00008FF
+S3150800A0300146090E082901D100F180607047000029
+S3150800A040D0F8C40100F44070401E8041C00F70472C
+S3150800A05041EA024141EA0361C0F8C4117047016848
+S3150800A06041F0400101607047016821F0400101603C
+S3150800A0707047884200D208467047884200D9084689
+S3150800A08070472DE9F04702460D464FF0000C0127B0
+S3150800A090664642F2107EF046B94601E009F101092A
+S3150800A0A0B9F1400F29D80A2128684843B0FBF9F4CA
+S3150800A0B06B68B4FBF3FA0846BAFBF0F001FB10AA8A
+S3150800A0C0BAF1060F00D3401C002803D04143B4FB65
+S3150800A0D0F1F103E00846B4FBF0F13846994201D3A2
+S3150800A0E0CB1A00E05B1A1528D8D24345D6D2CC46FF
+S3150800A0F006469846B3F57A7FD0D264467046402124
+S3150800A100B5F808C000E0491E032911D34B1C0EFB05
+S3150800A11003F3B3FBF6F3634502D3A3EB0C0801E0A4
+S3150800A120ACEB0308804501D20F4640466345EAD2A8
+S3150800A13090464046FFF793FFF61BB61E360306F415
+S3150800A140E0466889401E800100F0C00006437F1E75
+S3150800A1503F0207F470673743641E04F03F043C432C
+S3150800A160C8F810404046BDE8F0477DE770B504469C
+S3150800A1700D4616462046FFF763FF0028FAD06D1CE9
+S3150800A1802B46DBB2324602212046BDE870405FE727
+S3150800A19010B501210160DFF8D8422046F9F782FEA2
+S3150800A1A02046BDE81040F9F715BF38B50446DFF874
+S3150800A1B0C0522846F9F718FF2846F9F77DFE2068A9
+S3150800A1C040084000206020688007FCD431BD2DE996
+S3150800A1D0F84305460C461646FFF7E7FF214628468C
+S3150800A1E000F03DF8284600F047F80746B7FBF6F1B9
+S3150800A1F0C1F580610020FFF73CFF40F2FF39494670
+S3150800A200FFF73BFF0446B8464FEA981849463046DA
+S3150800A21080098002B0FBF8F0FFF72FFFC4F58061D4
+S3150800A220B7FBF1F1711A00FB08F84FEA9828A6EB7C
+S3150800A23088168E428941C943C90F03D0204601D0EA
+S3150800A240012200E00222EB68DFF828120B40EB60DF
+S3150800A250E96841EA82310843E860BDE8F183D0F84D
+S3150800A260C821120951EA0211C0F8C8117047D0F87E
+S3150800A270C80100F00F00704710B50024FFF7F7FF7C
+S3150800A280012802D0022804D006E0F9F72FFE04467A
+S3150800A29002E0FAF7B7F90446204610BD10B50446A1
+S3150800A2A02068754909184909826822F47F42826044
+S3150800A2B0206882680B465B0942EA4332090201F4C8
+S3150800A2C0F85111438160207E002801D001282FD142
+S3150800A2D020202168C8616168C1F3407000280DD14B
+S3150800A2E001F0604040EA814021688861A06800F07A
+S3150800A2F0604141EA80412068C16004E020688161CC
+S3150800A300A0682168C860207E01280AD1204600F08E
+S3150800A31010F84FF000602168C86158482168C86184
+S3150800A32010BD4FF400602168C86155482168C861AE
+S3150800A33010BD014603200A7E012A16D120200A688C
+S3150800A340D0610868026822F070620B7B1B0603F076
+S3150800A35070631A43026008690A68106148690A68E6
+S3150800A360506148480968C861002070470168C86993
+S3150800A370C0F34010CA69C2F30022002801D10420A4
+S3150800A3807047012A01D1022070474FF0E060C8618A
+S3150800A390002070470268D169C1F3C021D269C2F3AF
+S3150800A3A08002002901D003207047012A01D102202A
+S3150800A3B0704708210268D16101688969C1F3407153
+S3150800A3C00029416824D121F00051416001F0604123
+S3150800A3D002689269C2F38A42114341600168C968FA
+S3150800A3E0490F826861F35D728260C2F34071002989
+S3150800A3F008D002F060420168C968C1F38A410A437D
+S3150800A400826019E00168C96861F31C02826013E082
+S3150800A41041F0005141600268926962F31C01416093
+S3150800A4200168CA68816862F31C0181600268D268A3
+S3150800A430520F62F35D71816001680968090E01F0C7
+S3150800A4400F01017301680969016101684969416180
+S3150800A4500168CA69C2F38002C969C1F3C001002A4A
+S3150800A46001D00029A5D100210176084670470000D1
+S3150800A47010000010003CFFFF00B0FEB7C000200629
+S3150800A4804006A00040002800934A4FF48E7111FB45
+S3150800A49000F01044001DFCF788B810B50446A178F2
+S3150800A4A00020FBF7A5FD00280DD1201DFCF7A5F817
+S3150800A4B0402808DB402304F19C02A1780020BDE86F
+S3150800A4C01040FBF765BD10BD38B5834C4FF48E734D
+S3150800A4D013FB00F0044492B2201DFCF7B5F80546BC
+S3150800A4E02046FFF7DAFF284632BD70B50446617884
+S3150800A4F00020FBF77DFD002811D104F1DC05402280
+S3150800A500294604F11000FCF79FF8060009D03346E7
+S3150800A5102A4661780020FBF73BFD002801D1002080
+S3150800A52070BD304670BD38B56B4C4FF48E7313FB57
+S3150800A53000F0044492B204F11000FCF7ACF80546AA
+S3150800A54004F11000FCF731F8402802DB2046FFF73B
+S3150800A550CCFF284632BD604A4FF48E7111FB00F0DD
+S3150800A5601044C2E71CB55C4C00224FF48E7120469D
+S3150800A570F9F728FA002013E0002000900123402272
+S3150800A58004F11C01201DFBF7CBFD002000900123E0
+S3150800A590402204F15C0104F11000FBF7C1FD012023
+S3150800A5A00028E9D013BD10B500204B4C0CE0002262
+S3150800A5B004212046F9F706FA201DFCF770F804F185
+S3150800A5C01000FCF76CF801200028F0D010BDFEB58D
+S3150800A5D005460E467079FF283AD130783718B918EB
+S3150800A5E0002420463C4A00E00120002806D1507885
+S3150800A5F00028F9D190780028F6D11446002C27D0E7
+S3150800A600B07820703079002802D129E038780744DC
+S3150800A6107878052801D08F42F8D3601C0190A01CD9
+S3150800A62000900223327939462846FBF76AFC00284F
+S3150800A6300ED03079C0EBC0000744A178002909D0B4
+S3150800A640402304F19C022846FBF7A2FC002801D10E
+S3150800A6500020FEBD6078002802D02046FFF745FF9F
+S3150800A660BE1B304680B2FEBD38B51A4600201A4CCD
+S3150800A6700B4609E0A0780546AB4209D06578AB429F
+S3150800A68006D0012004F58E740028F3D0002032BDD0
+S3150800A69083420FD192B204F19C01201DFBF7FBFF08
+S3150800A6A00E48002802D00020AFF300802046FFF7AE
+S3150800A6B0F4FE0DE0607881420AD10948002804D0EA
+S3150800A6C092B211460020AFF300802046FFF70DFF37
+S3150800A6D0012032BD00000000309BFE1F0000000074
+S3150800A6E0000000005020274908607047264A10607D
+S3150800A6F0516070472349AA220A605522234B1A60E3
+S3150800A700A0220A60AA21016070471E49AA220A608F
+S3150800A7101E4A5523136080230B60AA230B6055211C
+S3150800A7201160302101607047F520164908607047AE
+S3150800A73017480068704770B504460D46FFF7F4FFE2
+S3150800A740FFF7D0FF002607E005EB8600416855F8BD
+S3150800A7502600FFF7CBFFB61C402EF5D32046FFF7A1
+S3150800A760C9FF0B480068C007FBD470BD10B5044686
+S3150800A770FFF7DAFF2046FFF7C8FF05480068C0075D
+S3150800A780FBD410BD5455000CF055000CA8AA000CBB
+S3150800A7901020005861001A03E0001703F8000703A9
+S3150800A7A0FF0001007801000130013201060139017C
+S3150800A7B010014A012E017901060180014D0043026C
+S3150800A7C08101820182018401840186018701870152
+S3150800A7D089018A018B018B018D018E018F01900100
+S3150800A7E09101910193019401F6019601970198014F
+S3150800A7F098013D029B019C019D0120029F01A00139
+S3150800A800A001A201A201A401A401A601A701A70112
+S3150800A810A901AA01AB01AC01AC01AE01AF01AF01C0
+S3150800A820B101B201B301B301B501B501B701B80170
+S3150800A830B801BA01BB01BC01BC01BE01F701C001E8
+S3150800A840C101C201C301C401C501C401C701C801D0
+S3150800A850C701CA01CB01CA01CD011001DD01010002
+S3150800A8608E01DE011201F3010300F101F401F40186
+S3150800A870F8012801220212013A020900652C3B025E
+S3150800A8803B023D02662C3F0240024102410246025B
+S3150800A8900A015302400081018601550289018A0195
+S3150800A8A058028F015A0290015C025D025E025F0245
+S3150800A8B093016102620294016402650266026702FC
+S3150800A8C0970196016A02622C6C026D026E029C0167
+S3150800A8D0700271029D01730274029F01760277026B
+S3150800A8E0780279027A027B027C02642C7E027F025D
+S3150800A8F0A60181028202A9018402850286028702D4
+S3150800A900AE014402B101B20145028D028E028F02E8
+S3150800A91090029102B7017B030300FD03FE03FF03C8
+S3150800A920AC0304008603880389038A03B103110371
+S3150800A930C2030200A303A303C4030803CC03030052
+S3150800A9408C038E038F03D8031801F2030A00F90358
+S3150800A950F303F403F503F603F703F703F903FA031E
+S3150800A960FA033004200350041007600422018A0405
+S3150800A9703601C1040E01CF040100C004D00444010D
+S3150800A98061052604000000007D1D0100632C001EE1
+S3150800A9909601A01E5A01001F0806101F0606201F52
+S3150800A9A00806301F0806401F0606511F0700591FD4
+S3150800A9B0521F5B1F541F5D1F561F5F1F601F08062F
+S3150800A9C0701F0E00BA1FBB1FC81FC91FCA1FCB1F87
+S3150800A9D0DA1FDB1FF81FF91FEA1FEB1FFA1FFB1F01
+S3150800A9E0801F0806901F0806A01F0806B01F04004F
+S3150800A9F0B81FB91FB21FBC1FCC1F0100C31FD01F31
+S3150800AA000206E01F0206E51F0100EC1FF21F010007
+S3150800AA10FC1F4E2101003221702110028421010001
+S3150800AA208321D0241A05302C2F04602C0201672CB0
+S3150800AA300601752C0201802C6401002D260841FFB1
+S3150800AA401A03000038B557480168C90706D4416893
+S3150800AA5041F0010141600168C907FCD55248016807
+S3150800AA60890507D5816841F40071816041F64C502B
+S3150800AA7000F0B8F84D4C206940F40020206140F6FB
+S3150800AA80C41000F0AFF821694948014021612068E7
+S3150800AA9010F0300F19D02168464801402160F9F7B7
+S3150800AAA0B1FD2168444AB0FBF2F0401E41EA00417C
+S3150800AAB021600020A061206920F400302061E06850
+S3150800AAC000F46070B0F5607FF9D1206940F00100AC
+S3150800AAD02061E068C007FCD5206940F010002061BD
+S3150800AAE036486061206940F040002061206920F006
+S3150800AAF010002061206940F480202061E06840074A
+S3150800AB00FCD52069400840002061E068C007FCD4F5
+S3150800AB102B4D4FF00110A86000202861E860E8611D
+S3150800AB2028620320A8612748686127486862206967
+S3150800AB3020F04000206125486061E0688006FCD569
+S3150800AB404FF4166000F04EF821486061E068800610
+S3150800AB50FCD54FF4616000F045F81E486061E06876
+S3150800AB608006FCD54FF4965000F03CF81A48606110
+S3150800AB70E0688006FCD541F2707000F033F817489B
+S3150800AB806061E0688006FCD54FF4E15000F02AF8D1
+S3150800AB9005201349086000202860BDE83140F9F710
+S3150800ABA0F1BC00BF0042005000440050044700506A
+S3150800ABB0FDFFFEFFCFFFF0FFA0252600002F0B01AB
+S3150800ABC0044600500500010003002001002F05017E
+S3150800ABD0002F0301002F0201002F0101002F0001A1
+S3150800ABE06C41005081B00021009103E000BF00993C
+S3150800ABF0491C009100998142F8D301B070470000C2
+S3150800AC00026E012303FA01F122EA01010166704787
+S3150800AC1000EB8100C169C90852EAC102C2617047E6
+S3150800AC20C268D20801F0070151EAC201C160704743
+S3150800AC30016841F0400101607047016821F0400158
+S3150800AC400160704780B500208DF8000000F014F808
+S3150800AC5000F09CF800F000F96946002000F0AAF818
+S3150800AC609DF80000012801D1FEF7D4F800F033F86A
+S3150800AC7000F003F9FCE7000010B500BF3EA0F9F7A5
+S3150800AC80C2F80020F9F75BF90020F9F741F904202A
+S3150800AC90F9F793F9F9F7C2F920210120F9F7C6F96E
+S3150800ACA00120F9F793F9F9F76DFC802209212C4860
+S3150800ACB0F9F746FC2B4C00220D212046F9F740FCFB
+S3150800ACC00D212046FFF79CFF2748F9F7F5F8BDE860
+S3150800ACD01040F9F7F5B910B58CB000208DF81800BA
+S3150800ACE00120079002208DF82000204C06AA042196
+S3150800ACF02046F9F7DDFB90208DF80C000120049022
+S3150800AD0002208DF8140003AA05212046F9F7D0FB86
+S3150800AD10012200211648FFF77BFF00208DF824004A
+S3150800AD2009AA0D212046F9F7C3FB90208DF80000EB
+S3150800AD300120019002208DF808006A460C21204661
+S3150800AD40F9F7B6FB0B4C2046FFF772FF02212046A7
+S3150800AD50FFF766FF2046FFF770FF0CB010BD000036
+S3150800AD6000850248008F02488000002000810248C2
+S3150800AD7000000340004301483002010100000100C1
+S3150800AD8000000000000001000201010180B500F08A
+S3150800AD9024F800280DD12E482E49016000210A46C4
+S3150800ADA002E043181A71491C3829FAD3BDE8014054
+S3150800ADB021E001BD70B505460C46002600F00DF8E9
+S3150800ADC0002808D0382D06D2002C04D02048284464
+S3150800ADD0007920700126304670BD10B500241C4845
+S3150800ADE000681C49884204D100F00BF8002800D0FE
+S3150800ADF00124204610BD80B500F00EF81449888756
+S3150800AE0001BD10B5002400F007F81149898F884262
+S3150800AE1000D10124204610BD0D49086802460346A4
+S3150800AE201B0ADBB253FA82F203461B0C52FA83F270
+S3150800AE3012EB106080B2002203E08B181B79C01851
+S3150800AE40521C382AF9D3C043401C80B27047000010
+S3150800AE500080FE1FA2E742CE80B5FEF7E3FBF8F7B7
+S3150800AE604DFEF8F721FEFEF71AFCFDF7DFFFFDF7AA
+S3150800AE703DFFBDE80140FDF7F1B880B5F8F740FEA3
+S3150800AE80F8F726FEFEF708F8FDF741FFBDE8014092
+S3150800AE90FDF7ECB84669726D776172652075706466
+S3150800AEA0617465207265717565737420646574656F
+S3150800AEB0637465640A0D00004F70656E696E6720DD
+S3150800AEC06669726D776172652066696C6520666F62
+S3150800AED0722072656164696E672E2E2E000000006E
+S3150800AEE05374617274696E67207468652070726F36
+S3150800AEF06772616D6D696E672073657175656E63DE
+S3150800AF00650A0D0050617273696E67206669726D15
+S3150800AF10776172652066696C6520746F2064657454
+S3150800AF2065637420657261736520626C6F636B7309
+S3150800AF302E2E2E0052656164696E67206C696E65F7
+S3150800AF402066726F6D2066696C652E2E2E455252EC
+S3150800AF504F520A0D00000000496E76616C69642044
+S3150800AF60636865636B73756D20666F756E642E2EE8
+S3150800AF702E4552524F520A0D000000004669726D66
+S3150800AF807761726520757064617465207375636393
+S3150800AF9065737366756C6C7920636F6D706C657418
+S3150800AFA065640A0D00000000C700FC00E900E20025
+S3150800AFB0E400E000E500E700EA00EB00E800EF0047
+S3150800AFC0EE00EC00C400C500C900E600C600F400A7
+S3150800AFD0F600F200FB00F900FF00D600DC00A20034
+S3150800AFE0A300A500A7209201E100ED00F300FA00F6
+S3150800AFF0F100D100AA00BA00BF001023AC00BD00C2
+S3150800B000BC00A100AB00BB00912592259325022523
+S3150800B010242561256225562555256325512557255D
+S3150800B0205D255C255B251025142534252C251C2536
+S3150800B03000253C255E255F255A2554256925662564
+S3150800B040602550256C2567256825642565255925BD
+S3150800B0505825522553256B256A2518250C2588253C
+S3150800B06084258C2590258025B103DF009303C00332
+S3150800B070A303C303B500C403A6039803A903B40333
+S3150800B0801E22C603B50329226122B1006522642265
+S3150800B09020232123F7004822B0001922B7001A22DC
+S3150800B0A07F20B200A025A00000C0000C00400000D0
+S3150800B0B0030000000000010C00400000040000002E
+S3150800B0C00040010C00400000050000000080010C53
+S3150800B0D0004000000600000000C0010C004000000F
+S3150800B0E0070000000000020C000002000800000033
+S3150800B0F00000040C00000400090000000000080C11
+S3150800B100000004000A00000000000C0C0000040007
+S3150800B1100B0000000000100C000004000C000000EA
+S3150800B1200000140C000004000D0000000000180CBC
+S3150800B130000004000E00000000001C0C00000400C3
+S3150800B1400F000000433A5C576F726B5C736F66744E
+S3150800B150776172655C4F70656E424C545F57696ED5
+S3150800B1605553425F4175746F5F496E7374616C6CB9
+S3150800B1705C5461726765745C536F757263655C4194
+S3150800B180524D434D345F584D43345C666C61736869
+S3150800B1902E6300002DE9FC4D016800F108054908F9
+S3150800B1A005EBC102019200F10803406800F0010AAC
+S3150800B1B003EBC108400808EBC00B0020002105E09E
+S3150800B1C0009A964218BF16F9014B0CD1019A95427E
+S3150800B1D006D02B686A68EE18324400920835EFE705
+S3150800B1E05846BDE8F68D009A964205D12B686A68DE
+S3150800B1F0EE1832440092083516F8017B884210D1C1
+S3150800B200D84508BF00F017F8D8F80000D8F8041099
+S3150800B210BAF1000F18BF48440144884208F10808EB
+S3150800B220EED0002C00F8017B02D5641CE6D1C7E7F6
+S3150800B230641ED8D5C4E7012000F000B880B5AFF386
+S3150800B2400080024A11001820ABBEFBE72600020068
+S3150800B2500A000000000003069E0014000300574978
+S3150800B2604E55534200000000000000000000800018
+S3150800B27004000100280044006500760069006300A8
+S3150800B280650049006E007400650072006600610082
+S3150800B29063006500470055004900440000004E0061
+S3150800B2A07B00380030003700390039003900430088
+S3150800B2B033002D0045003400450030002D003400D1
+S3150800B2C03000450041002D003800310038003800B4
+S3150800B2D02D003400380045003800350032004200A1
+S3150800B2E0350034004600320042007D0000000000B0
+S3150800B2F0809A45418E418F804545454949498E8FFB
+S3150800B3009092924F994F555559999A9B9C9D9E9FFD
+S3150800B31041494F55A5A5A6A7A8A9AAABACADAEAFFE
+S3150800B320B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF97
+S3150800B330C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF87
+S3150800B340D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF77
+S3150800B350E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF67
+S3150800B360F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF57
+S3150800B370433A5C576F726B5C736F6674776172657C
+S3150800B3805C4F70656E424C545F57696E5553425F09
+S3150800B3904175746F5F496E7374616C6C5C5461724D
+S3150800B3A06765745C536F757263655C41524D434DB6
+S3150800B3B0345F584D43345C72733233322E63000067
+S3150800B3C0000009021A0300043A061B071A080909AD
+S3150800B3D0090A1B0C1A0D000F1A103A113A123A18DC
+S3150800B3E03A193A1B1A1C1A1D3A1E1A201A211B262C
+S3150800B3F03A2A1A373A381A063A0D3A161A17022905
+S3150800B4001A2A3A3312011B051B063A081A231A246C
+S3150800B410433A5C576F726B5C736F667477617265DB
+S3150800B4205C4F70656E424C545F57696E5553425F68
+S3150800B4304175746F5F496E7374616C6C5C546172AC
+S3150800B4406765745C536F757263655C41524D434D15
+S3150800B450345F584D43345C7573622E6300000000F8
+S3150800B460433A5C576F726B5C736F6674776172658B
+S3150800B4705C4F70656E424C545F57696E5553425F18
+S3150800B4804175746F5F496E7374616C6C5C5461725C
+S3150800B4906765745C536F757263655C66696C652E67
+S3150800B4A06300000072B60B480B490160BFF34F8F6B
+S3150800B4B062B60A490A6842F470020A60C16821F055
+S3150800B4C00801C160064801680909090141F004013B
+S3150800B4D00160704708ED00E00000000888ED00E014
+S3150800B4E01420005830B4002512E050F8042BD30776
+S3150800B4F044BF4A44521E091F042942F8045BFAD283
+S3150800B50013468C0744BF15809B1CC90748BF1D708E
+S3150800B51050F8041B0029E8D130BC70470000000031
+S3150800B520200000004000000080000000000100002C
+S3150800B53000020000000400000008000000100000DF
+S3150800B5400020000010B5074979441831064C7C44A0
+S3150800B550163404E00A68081D114488470146A142CA
+S3150800B560F8D110BD5000000080000000050F210032
+S3150800B570011C100500DF60DDD88945C74C9CD265E3
+S3150800B5809D9E648A9F000003069E0001000000003D
+S3150800B5904EF68851CEF20001086840F47000086043
+S3150800B5A0BFF34F8FBFF36F8F4FF00070E1EE100AB5
+S3150800B5B07047000031FFFFFF241F00009482FE1F22
+S3150800B5C0A03000000000002000000000C9FBFFFFBB
+S3150800B5D0020000000200000070020000AC0000003B
+S3150800B5E04080FE1F5202000080B510224FF0005125
+S3150800B5F00448F8F715FAFFF755FFBDE80140FFF7CD
+S3150800B60021BA00BFB8A1FE1F00F00DF8002801D02E
+S3150800B610FFF798FFAFF300800020AFF30080FFF735
+S3150800B62011FB00F002F80120704700F001B8000095
+S3150800B63007463846FFF702FEFBE7000005480146C5
+S3150800B64003B4684680F30988AFF30080FFF7A0FFCC
+S3150800B650FFF7DAFFA5EDF5FEDFF808D002488047C8
+S3150800B66002480047D0A9FE1FE9B500083DB6000804
+S3150800B67057696E5553422042756C6B20446576694E
+S3150800B680636500004F70656E424C542055736572B1
+S3150800B69000000000FFF7FEBFFFF7FEBFFFF7FEBF83
+S3150800B6A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC0
+S3150800B6B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB0
+S3150800B6C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA0
+S3150800B6D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF90
+S3150800B6E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF80
+S3150800B6F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF70
+S3150800B700FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF5F
+S3150800B710FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF4F
+S3150800B720FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF3F
+S3150800B730FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF2F
+S3150800B740FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF1F
+S3150800B750FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF0F
+S3150800B760FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFFF
+S3150800B770FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFEF
+S3150800B780FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFDF
+S3150800B790FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFCF
+S3150800B7A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFBF
+S3150800B7B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFAF
+S3150800B7C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF9F
+S3150800B7D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF8F
+S3150800B7E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF7F
+S3150800B7F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF6F
+S3150800B800FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF5E
+S3150800B810FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF4E
+S3150800B820FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF3E
+S3150800B830FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF2E
+S3150800B840FFF7FEBFFFF7FEBF00048100F70002C046
+S3150800B8500148F800003F8100F0000FFE3900088417
+S3150800B860B6000870B600082C82FE1FC4000AF15EF6
+S3150800B87000082C9DFE1F10000CDA001A4201480031
+S3150800B8804301480044014800450148004601480074
+S3150800B89047014800C00050FC000F080027695B45B7
+S3150800B8A00000A02F002020300020FD000420D01723
+S3150800B8B00020FC00FE04F2000F30313233343536F6
+S3150800B8C0373839414243444546EA001703400002E7
+S3150800B8D003400000024800020248004002480042B5
+S3150800B8E002480001EA0008C880FE1FD93B00080389
+S3090800B8F0F80000FF4F
+S7050800B63DFF
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/tusb_config.h b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/tusb_config.h
index 0dc157b03..7f727684e 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/tusb_config.h
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/tusb_config.h
@@ -71,6 +71,11 @@
// require tud_int_handler() to be called continuously in the program's infinite loop.
#define CFG_TUSB_POLLING_ENABLED 1
+// Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+// makes it possible to automatically install WinUSB devices without having to provide
+// a device specific INF file.
+#define CFG_TUD_WINUSB_ENABLED 1
+
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
* Tinyusb use follows macros to declare transferring memory so that they can be put
* into those specific section.
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/usb_descriptors.c b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/usb_descriptors.c
index f90e1e7a2..dc44939b8 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/usb_descriptors.c
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_IAR/Boot/lib/TinyUSB/cfg/usb_descriptors.c
@@ -24,33 +24,88 @@
*/
#include "tusb.h"
+#include "xmc_common.h"
-/* USB Vendor and Product identifiers. */
-#define USB_VID (0x1d50)
-#define USB_PID (0x60ac)
+
+#define USB_VID 0x1D50 // OpenMoko
+#define USB_PID 0x60AC // OpenBLT Bootloader
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+#define USB_BCD 0x0201 // Needs to be >= 2.01 for BOS
+#else
+#define USB_BCD 0x0200
+#endif
+
+//--------------------------------------------------------------------+
+// Unique ID string
+//--------------------------------------------------------------------+
+// Length of the unique ID in bytes. On the XMC4xxx, the unique chip
+// identifier is 16 bytes.
+#define UID_STR_BYTE_LEN (16U)
+
+// NUL terminated character array for storing the device's unique
+// identifier. Callback function tud_descriptor_string_cb() overwrites
+// its default value with the actual device's unique identifier.
+static char uniqueIdStr[(UID_STR_BYTE_LEN * 2U) + 1U] = "0123456789ABCDEF";
+
+
+// Initializes the string that holds the ASCII representation of the device's
+// unique identifier.
+static void UniqueIdStrInit(void)
+{
+ uint8_t charIdx = 0U;
+ static uint8_t initialized = 0U;
+
+ // Only initialize once.
+ if (initialized == 0U)
+ {
+ // Update flag.
+ initialized = 1U;
+ // Loop through all unique identifier bytes.
+ for (uint8_t idx = 0U; idx < UID_STR_BYTE_LEN; idx++)
+ {
+ // Convert byte value to nibbles.
+ uint8_t nibbles[2];
+ nibbles[0] = (g_chipid[idx] >> 4U) & 0x0F;
+ nibbles[1] = g_chipid[idx] & 0x0F;
+ // Loop through the nibbles.
+ for (uint8_t n = 0U; n < sizeof(nibbles); n++)
+ {
+ // Convert the nibble to an ASCII character.
+ char nibbleChr = (nibbles[n] < 10U) ? nibbles[n] + '0' : nibbles[n] - 10 + 'A';
+ // Store the ASCII character in the string.
+ uniqueIdStr[charIdx] = nibbleChr;
+ // Update indexer for the next character.
+ charIdx++;
+ }
+ }
+ // Add NUL termination.
+ uniqueIdStr[charIdx] = '\0';
+ }
+}
//--------------------------------------------------------------------+
// Device Descriptors
//--------------------------------------------------------------------+
tusb_desc_device_t const desc_device =
{
- .bLength = sizeof(tusb_desc_device_t),
- .bDescriptorType = TUSB_DESC_DEVICE,
- .bcdUSB = 0x0200,
- .bDeviceClass = 0x00,
- .bDeviceSubClass = 0x00,
- .bDeviceProtocol = 0x00,
- .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
-
- .idVendor = USB_VID,
- .idProduct = USB_PID,
- .bcdDevice = 0x0200,
-
- .iManufacturer = 0x01,
- .iProduct = 0x02,
- .iSerialNumber = 0x03,
-
- .bNumConfigurations = 0x01
+ .bLength = sizeof(tusb_desc_device_t),
+ .bDescriptorType = TUSB_DESC_DEVICE,
+ .bcdUSB = USB_BCD,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+
+ .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
+
+ .idVendor = USB_VID,
+ .idProduct = USB_PID,
+ .bcdDevice = 0x0100,
+
+ .iManufacturer = 0x01,
+ .iProduct = 0x02,
+ .iSerialNumber = 0x03,
+
+ .bNumConfigurations = 0x01
};
// Invoked when received GET DEVICE DESCRIPTOR
@@ -78,7 +133,7 @@ enum
uint8_t const desc_fs_configuration[] =
{
// Config number, interface count, string index, total length, attribute, power in mA
- TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
+ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 150),
// Interface number, string index, EP Out & EP In address, EP size
TUD_VENDOR_DESCRIPTOR(ITF_NUM_VENDOR, 0, EPNUM_VENDOR_OUT, EPNUM_VENDOR_IN, 64),
@@ -94,6 +149,103 @@ uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
return desc_fs_configuration;
}
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+//--------------------------------------------------------------------+
+// BOS Descriptor
+//--------------------------------------------------------------------+
+
+/* Microsoft OS 2.0 registry property descriptor per MS requirements:
+ * https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx
+ * device should create DeviceInterfaceGUID. It can be done by driver and
+ * in case of real PnP solution device should expose MS "Microsoft OS 2.0
+ * registry property descriptor". Such descriptor can insert any record
+ * into Windows registry per device/configuration/interface. In our case it
+ * will insert "DeviceInterfaceGUID" string property.
+ */
+
+#define BOS_TOTAL_LEN (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)
+
+#define MS_OS_20_DESC_LEN 0x9E
+
+#define VENDOR_REQUEST_MICROSOFT 1
+
+// BOS Descriptor is required for MS OS 2.0.
+uint8_t const desc_bos[] =
+{
+ // total length, number of device caps
+ TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),
+
+ // Microsoft OS 2.0 descriptor
+ TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, VENDOR_REQUEST_MICROSOFT)
+};
+
+uint8_t const * tud_descriptor_bos_cb(void)
+{
+ return desc_bos;
+}
+
+uint8_t const desc_ms_os_20[] =
+{
+ // Set header: length, type, windows version, total length
+ U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),
+
+ // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID
+ U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible
+
+ // MS OS 2.0 Registry property descriptor: length, type
+ U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),
+ U16_TO_U8S_LE(0x0001), U16_TO_U8S_LE(0x0028), // wPropertyDataType, wPropertyNameLength and PropertyName "DeviceInterfaceGUID\0" in UTF-16
+ 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,
+ 'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00,
+
+ U16_TO_U8S_LE(0x004E), // wPropertyDataLength
+ //bPropertyData: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0"
+ '{', 0x00, '8', 0x00, '0', 0x00, '7', 0x00, '9', 0x00, '9', 0x00, '9', 0x00, 'C', 0x00, '3', 0x00, '-', 0x00,
+ 'E', 0x00, '4', 0x00, 'E', 0x00, '0', 0x00, '-', 0x00, '4', 0x00, '0', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00,
+ '8', 0x00, '1', 0x00, '8', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '8', 0x00, 'E', 0x00, '8', 0x00, '5', 0x00,
+ '2', 0x00, 'B', 0x00, '5', 0x00, '4', 0x00, 'F', 0x00, '2', 0x00, 'B', 0x00, '}', 0x00, 0x00, 0x00
+};
+
+TU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, "Incorrect size");
+
+bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
+{
+ // nothing to with DATA & ACK stage
+ if (stage != CONTROL_STAGE_SETUP) return true;
+
+ switch (request->bmRequestType_bit.type)
+ {
+ case TUSB_REQ_TYPE_VENDOR:
+ switch (request->bRequest)
+ {
+ case VENDOR_REQUEST_MICROSOFT:
+ if ( request->wIndex == 7 )
+ {
+ // Get Microsoft OS 2.0 compatible descriptor
+ uint16_t total_len;
+ memcpy(&total_len, desc_ms_os_20+8, 2);
+
+ return tud_control_xfer(rhport, request, (void*)(uintptr_t) desc_ms_os_20, total_len);
+ }else
+ {
+ return false;
+ }
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // stall unknown request
+ return false;
+}
+#endif /* (CFG_TUD_WINUSB_ENABLED == 1) */
+
//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+
@@ -104,7 +256,7 @@ char const* string_desc_arr [] =
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"OpenBLT User", // 1: Manufacturer
"WinUSB Bulk Device", // 2: Product
- "123456789012", // 3: Serials, should use chip ID
+ uniqueIdStr, // 3: Serials, use chip ID
};
static uint16_t _desc_str[32];
@@ -117,6 +269,9 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
uint8_t chr_count;
+ // Make sure the unique identifier string is initialized.
+ UniqueIdStrInit();
+
if ( index == 0)
{
memcpy(&_desc_str[1], string_desc_arr[0], 2);
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/bin/openblt_xmc4700.srec b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/bin/openblt_xmc4700.srec
index 0cb26c972..6d1bb4843 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/bin/openblt_xmc4700.srec
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/bin/openblt_xmc4700.srec
@@ -1,1696 +1,1082 @@
-S315080000000088FE1FB5020008C1020008C1020008E8
-S31508000010C1020008C1020008C10200080000000071
-S31508000020000000000000000000000000C1020008F7
-S31508000030C102000800000000C1020008C102000851
-S31508000040C1020008C1020008C1020008C102000876
-S31508000050C1020008C1020008C1020008C102000866
-S31508000060C1020008000000000000000000000000B7
-S31508000070C102000800000000C1020008C102000811
-S31508000080C1020008C1020008C1020008C102000836
-S31508000090C1020008C1020008C1020008C102000826
-S315080000A0C1020008C1020008C1020008C102000816
-S315080000B0C1020008C1020008C1020008C102000806
-S315080000C0C1020008C1020008C1020008C1020008F6
-S315080000D0C1020008C1020008C1020008C1020008E6
-S315080000E0C1020008C1020008C1020008C1020008D6
-S315080000F0C1020008C1020008C1020008C1020008C6
-S31508000100C1020008C1020008C1020008C1020008B5
-S31508000110C1020008C1020008C1020008C1020008A5
-S31508000120C1020008C1020008C1020008C102000895
-S31508000130C1020008C1020008C1020008C102000885
-S31508000140C1020008C1020008C1020008C102000875
-S31508000150C1020008C1020008C1020008C102000865
+S315080000000088FE1FA1020008AD020008AD02000824
+S31508000010AD020008AD020008AD02000800000000AD
+S31508000020000000000000000000000000AD0200080B
+S31508000030AD02000800000000AD020008AD0200088D
+S31508000040AD020008AD020008AD020008AD020008C6
+S31508000050AD020008AD020008AD020008AD020008B6
+S31508000060AD020008000000000000000000000000CB
+S31508000070AD02000800000000AD020008AD0200084D
+S31508000080AD020008AD020008AD020008AD02000886
+S31508000090AD020008AD020008AD020008AD02000876
+S315080000A0AD020008AD020008AD020008AD02000866
+S315080000B0AD020008AD020008AD020008AD02000856
+S315080000C0AD020008AD020008AD020008AD02000846
+S315080000D0AD020008AD020008AD020008AD02000836
+S315080000E0AD020008AD020008AD020008AD02000826
+S315080000F0AD020008AD020008AD020008AD02000816
+S31508000100AD020008AD020008AD020008AD02000805
+S31508000110AD020008AD020008AD020008AD020008F5
+S31508000120AD020008AD020008AD020008AD020008E5
+S31508000130AD020008AD020008AD020008AD020008D5
+S31508000140AD020008AD020008AD020008AD020008C5
+S31508000150AD020008AD020008AD020008AD020008B5
S315080001600000000000000000000000000000000081
-S31508000170C1020008C1020008C1020008C102000845
-S31508000180C1020008C1020008C1020008C102000835
-S31508000190C1020008C1020008C1020008C102000825
-S315080001A0C1020008C1020008C1020008C102000815
-S315080001B0C1020008C1020008C1020008C102000805
-S315080001C0C1020008C1020008C1020008C1020008F5
-S315080001D0C1020008C1020008C102000800000000B0
-S315080001E0C1020008C102000815190008C10200086A
-S315080001F0C102000800000000C1020008000000005B
-S3150800020000F002F800F045F80AA090E8000C8244D5
-S315080002108344AAF10107DA4501D100F03AF8AFF2B2
+S31508000170AD020008AD020008AD020008AD02000895
+S31508000180AD020008AD020008AD020008AD02000885
+S31508000190AD020008AD020008AD020008AD02000875
+S315080001A0AD020008AD020008AD020008AD02000865
+S315080001B0AD020008AD020008AD020008AD02000855
+S315080001C0AD020008AD020008AD020008AD02000845
+S315080001D0AD020008AD020008AD02000800000000EC
+S315080001E0AD020008AD0200089D0E0008AD02000829
+S315080001F0AD02000800000000AD0200080000000083
+S3150800020000F002F800F03CF80AA090E8000C8244DE
+S315080002108344AAF10107DA4501D100F031F8AFF2BB
S31508000220090EBAE80F0013F0010F18BFFB1A43F0C6
-S3150800023001031847A8650000C8650000103A24BFE6
+S31508000230010318474440000064400000103A24BFF8
S3150800024078C878C1FAD8520724BF30C830C144BF2D
S3150800025004680C607047000000230024002500266F
S31508000260103A28BF78C1FBD8520728BF30C148BF0B
-S315080002700B6070471FB505F0B3FF00F0DFF8040008
-S315080002800020002105F096FF401C60601FBD10B5D8
-S3150800029010BDDFF810D0FFF7EDFF05F08EFD00F07A
-S315080002A011F900000088FE1F03B4FFF7F0FF03BC36
-S315080002B000F012F9DFF80CD00348804703480047DE
-S315080002C0FEE700000088FE1FCD3300080102000883
-S315080002D010B500F0B3F8001D10BD00BFD95E0000D0
-S315080002E010B50446FFF7F4FF0068005D000704D563
-S315080002F0DF2C02D0A4F1200010BD204610BD032A31
-S3150800030040F2308010F0030C00F0158011F8013B24
-S31508000310BCF1020F624498BF11F801CB00F8013B0B
-S3150800032038BF11F8013BA2F1040298BF00F801CBCF
-S3150800033038BF00F8013B11F0030300F02580083AA6
-S31508000340C0F0088051F8043B083A51F804CBA0E8FD
-S315080003500810F5E7121D5CBF51F8043B40F8043B52
-S31508000360AFF30080D20724BF11F8013B11F801CB87
-S3150800037048BF11F8012B24BF00F8013B00F801CB58
-S3150800038048BF00F8012B704710B5203AC0F00B8023
-S31508000390B1E81850203AA0E81850B1E81850A0E87B
-S315080003A01850BFF4F5AF5FEA027C24BFB1E81850D5
-S315080003B0A0E8185044BF18C918C0BDE810405FEA45
-S315080003C0827C24BF51F8043B40F8043B08BF7047C1
-S315080003D0D20728BF31F8023B48BF11F8012B28BFC6
-S315080003E020F8023B48BF00F8012B70474FF0000287
-S315080003F000B5134694469646203922BFA0E80C500D
-S31508000400A0E80C50B1F12001BFF4F7AF090728BFE7
-S31508000410A0E80C5048BF0CC05DF804EB890028BF63
-S3150800042040F8042B08BF704748BF20F8022B11F08C
-S31508000430804F18BF00F8012B70470000004870472E
-S315080004405C1600204FF0013C50F8042B51F8043B91
-S315080004509A4221D1A2EB0C03934313EACC1317D18A
-S3150800046050F8042B51F8043B9A4215D1A2EB0C0321
-S31508000470934313EACC130BD150F8042B51F8043BE1
-S315080004809A4209D1A2EB0C03934313EACC13DBD0AF
-S315080004904FF00000704700BFD01A01BAB1FA81F1D7
-S315080004A001F0180122FA01F0CB40C1F12001DBB2BC
-S315080004B0C0B2C01A2CFA01F3D11A914311EAC3113A
-S315080004C0E6D1704710B50446AFF300802046BDE874
-S315080004D01040FFF7E9BE704701491820ABBEFEE79A
-S315080004E02600020000F0CDF9FCE7000010B500F088
-S315080004F083F901281AD000F0D3FA002816D00C4C3C
-S315080005002078012812D102F06FFFD4E901121144B4
-S3150800051001F5FA71884209D30020207000F06CFAC0
-S31508000520002803D1BDE8104000F0C4B910BD000092
-S31508000530B8010020044910B50120087000F006F83B
-S31508000540BDE81040FFF7D2BFB801002010B5044C33
-S315080005502078012802D102F047FFA06010BD0000F4
-S31508000560B801002010B500F090F900F085F902F006
-S3150800057043FF01F097F800F053FA00F02DF9BDE8B3
-S315080005801040FFF7D7BF10B500F07BF902F04EFF19
-S3150800059000F0D0FB00F038F9BDE81040FFF7A6BF21
-S315080005A02DE9FE434D4E304602F05AFF03F056FA47
-S315080005B004464B4D02E0640000F063F9AC42FAD3FE
-S315080005C0484DAC4203D9640800F05BF9F9E72246C6
-S315080005D00121B146304602F074FF4348434DCDE948
-S315080005E000404FF4FA50ADF808000126ADF80A604D
-S315080005F06946686803F084F86868016841F0400154
-S315080006000160016841F001010160DFF8E8803848BF
-S3150800061040F2E171C8F80000D8F80400D8F80820BC
-S3150800062020F0404000F1004061F31C0061F31C0219
-S3150800063020F00050C8E90102404602F08AFF082768
-S31508000640002088F80C70044608EB0001401C0C7466
-S3150800065098F80C10C0B28142F6D888F81860254878
-S3150800066002F082FF00220121484602F0EBFE214EED
-S315080006701F48203620303060706840F2676120F0ED
-S31508000680404000F10040B26861F31C0061F31C02AF
-S3150800069020F00050C6E90102304602F05AFF3773CF
-S315080006A000203118401C0C74317BC0B28142F8D846
-S315080006B010483476203002F057FF0122114648468A
-S315080006C002F0C0FE6868016821F040010160016817
-S315080006D021F001010160BDE8FE83000000400148E9
-S315080006E0001BB700000E270720A10700D401002031
-S315080006F000500148700B00202DE9F0410F4D0646C9
-S315080007000F4628680024C069C00713D0284602F09F
-S3150800071075FF60B9287B3870002105E06818012448
-S31508000720007C7054491CC9B2287B8842F6D82968CF
-S315080007300120C8612046BDE8F0810000900B00202A
-S3150800074070B5124C2173002104E0425C6318491C01
-S315080007501A74C9B2227B8A42F7D80C4802F0B4FF51
-S3150800076021680220C861094802F09BFF02F03CFE9E
-S3150800077000F1320505E000F084F802F035FEA842E3
-S3150800078003D82068C0698007F5D470BD700B0020B7
-S31508000790FFF7DCBE704700000648007818B101284C
-S315080007A003D0022803D081207047082070473F20D5
-S315080007B070470000C40100200648007818B10128D7
-S315080007C003D0022803D081207047082070473F20B5
-S315080007D070470000C401002010B503F06DFEFFF756
-S315080007E0DFFE044C0120207000F0B2FF00202070CC
-S315080007F010BD0000C401002010B5002403F06AFEF5
-S3150800080000B10124204610BD38B569460C48FFF7EB
-S3150800081073FF0C4C012805D120709DF8001008487C
-S3150800082003F062FE6946064800F0D2FF012806D1A9
-S31508000830002020709DF80010014803F055FE38BDD1
-S3150800084044040020C401002070B50A4E05460C4633
-S315080008503078012803D1E1B22846FFF771FF3078D6
-S3150800086018B9E1B2284601F01DF8BDE8704003F05A
-S315080008700DBF0000C4010020AFF30080642000F023
-S31508000880DFBEAFF3008000F0E1BEAFF3008072B6C2
-S31508000890704762B6704770B516460D46044605E0C1
-S315080008A015F8010B04F8010BFFF7EBFF761EB6B23D
-S315080008B0F6D270BD10B500F0F7FE90B100F01AF848
-S315080008C078B1FFF767FF02F0A9FD00F0E9FE0749D6
-S315080008D008400749086000F0E3FE4468FFF7D9FFBF
-S315080008E0A047BDE81040FFF753BF000080FFFF1F79
-S315080008F008ED00E0054810B5406A400B10F001000D
-S3150800090002D000F095FE012010BD0000008F0248BD
-S31508000910064810B590F82802012802D1034804F0C9
-S3150800092071FBBDE81040024804F034BE18020020EE
-S31508000930EA610008044890F82802012802D1024812
-S3150800094004F060BB70470000180200202DE9F04152
-S31508000950184E0446184D96F8280201280BD1314640
-S31508000960204604F0EBFC002805DA002086F8280269
-S31508000970304604F047FB4FF480762178002917D0DB
-S31508000980284603F0A4FB02F02FFD00F10A0705E054
-S31508000990FFF777FF02F028FDB84205D8D5F814010D
-S315080009A000F44070C005F3D5C5F81861641CE4E787
-S315080009B0BDE8F081180200200000034010B5074C7E
-S315080009C000200A2284F8280205A1204604F00EFC1D
-S315080009D0002802D1012084F8280210BD1802002040
-S315080009E02F626F6F746C6F672E7478740000000046
-S315080009F000487047EA61000810B5FFF7FDFE0128B8
-S31508000A0006D0064C207818B900F030F8012801D035
-S31508000A10002010BD0120207010BD0000C801002074
-S31508000A20084910B500200870024607A1074804F0D7
-S31508000A30B7FB002805D0BDE81040772104A0FFF7D2
-S31508000A4051BD10BDC8010020303A0000C80400207E
-S31508000A502E2E5C2E2E5C2E2E5C2E2E5C536F7572FF
-S31508000A6063655C66696C652E6300000000B5C7B0F7
-S31508000A704FF48C716846FFF7B9FC6946074804F0DD
-S31508000A801DFD40B9009830B19DF80800C00602D493
-S31508000A90012047B000BD0020FBE70000EA6100081E
-S31508000AA00348007808B1002070470120704700000D
-S31508000AB0C8010020014600F00F0010B530300929A2
-S31508000AC001D9C01D10BDFFF70BFCC0B210BD70B533
-S31508000AD005460C460009FFF7EDFF207005F00F00EC
-S31508000AE0FFF7E8FF60700020A070204670BD70B563
-S31508000AF0002506462C46305DFFF7F2FBC0B2A0F192
-S31508000B003001172902D23A38072801D2002070BDD1
-S31508000B10C9B2092901D9C91FC9B2641C01EB05105C
-S31508000B20E4B2C5B2022CE6D3284670BD02460A23B3
-S31508000B30B2FBF3F2491C002AFAD10A70B0FBF3F2B1
-S31508000B4003FB1202B0FBF3F0303201F8012D002846
-S31508000B50F4D10846704710B504460078FFF7C0FB85
-S31508000B6053280CD1FFF7B4FB01686078095C20298B
-S31508000B7005D1312805D0322805D0332805D00320E1
-S31508000B8010BD002010BD012010BD022010BD0000C0
-S31508000B902DE9F04116460C0007464FF0000500D037
-S31508000BA027B940F263214DA0FFF79CFC3846FFF7B2
-S31508000BB0D2FF804603280CD0384600F09DF858B17D
-S31508000BC05FEA08000BD001282BD0B8F1020F27D115
-S31508000BD050E00020BDE8F0814FF0FF30FAE7BF1C77
-S31508000BE03846FFF784FF0546BF1C3846FFF77FFFE8
-S31508000BF00002BF1C20603846FFF779FF2168ED1E0A
-S31508000C000844BF1C2060002E65D0002406E0384644
-S31508000C10FFF76DFF3055641CA4B2BF1CAC42F6DB6F
-S31508000C2059E0BF1C3846FFF762FF0546BF1C384629
-S31508000C30FFF75DFF0004BF1C20603846FFF757FF2B
-S31508000C402168BF1C01EB002020603846FFF74FFFE4
-S31508000C5021682D1F0844BF1C206096B3002406E0B7
-S31508000C603846FFF744FF3055641CA4B2BF1CAC429B
-S31508000C70F6DB30E0BF1C3846FFF739FF0546BF1CD8
-S31508000C803846FFF734FF0006BF1C20603846FFF7DA
-S31508000C902EFF2168BF1C01EB004020603846FFF795
-S31508000CA026FF2168BF1C01EB002020603846FFF7AD
-S31508000CB01EFF21686D1F0844BF1C20600EB100246A
-S31508000CC007E008E03846FFF712FF3055641CA4B267
-S31508000CD0BF1CAC42F6DB28467CE700002E2E5C2EB5
-S31508000CE02E5C2E2E5C2E2E5C536F757263655C66C9
-S31508000CF0696C652E6300000070B5861C3046FFF7E8
-S31508000D00F6FE04462546B61C3046FFF7F0FE641E7E
-S31508000D102844A4B2B61CC5B2012CF5D8E843C4B21F
-S31508000D203046FFF7E4FEA04201D0002070BD012046
-S31508000D3070BD00002DE9FC5FCC4E3078002875D0D8
-S31508000D400024DFF82CA306F1040801281DD00AF5B3
-S31508000D500A7707F5C0724FF4807107F5C279A7F5CF
-S31508000D608B65009202283AD003285FD1524638464E
-S31508000D7004F057F995F84112AB4600297DD0347036
-S31508000D80BCA0FFF7E3FD022068E100F08BFCFFF74B
-S31508000D9015FEC1A0FFF7DAFDC8A0FFF7D7FDFFF7DC
-S31508000DA027FE01460122504604F020FA40B134706D
-S31508000DB0CCA0FFF7CBFDBDE8FC5F0120FFF7BABD6D
-S31508000DC0CAA0FFF7C3FDCBA0FFF7C0FDD2A0FFF76F
-S31508000DD0BDFDC8F800400220C8F80440C3E05246EA
-S31508000DE0D94804F01EF995F84112AB4611B1347092
-S31508000DF0BCA0C6E7002865D00022D3480099FFF7B3
-S31508000E00C7FE0546401C12D0002D5BDDD8F804004D
-S31508000E10414678B1D8F800100A18CB49D1F88011A4
-S31508000E208A420DD12844C8F804004BE09CE034708F
-S31508000E30ACA004E1D7F880010860C8F8045041E086
-S31508000E40AAA0FFF783FDC1A0FFF780FD4746C24968
-S31508000E50D8F80400FFF76AFEBF48FFF777FDBFA082
-S31508000E60FFF774FD3868BC49000EFFF730FE386896
-S31508000E7009F10201C0F3074000E077E0FFF727FE1B
-S31508000E80388809F10401C0F30720FFF720FE3878F7
-S31508000E9009F10601FFF71BFEAF48FFF757FDA9A0AA
-S31508000EA0FFF754FDD7E9000100F0F8FBD8B18FA091
-S31508000EB0FFF74CFD98A0FFF749FDA348D0F880013D
-S31508000EC0C7E90005DBF84412DBF83C0281424BD146
-S31508000ED00021504604F0C9F858B1347081A0FFF7D4
-S31508000EE035FD0420BAE034707EA0FFF72FFD0520FB
-S31508000EF0B4E0D8F80400454688B37CA0FFF726FD81
-S31508000F0092A0FFF723FD94496868FFF70FFE924801
-S31508000F10FFF71CFD91A0FFF719FD28688E49000E02
-S31508000F20FFF7D5FD28684F46C0F30740B91CFFF701
-S31508000F30CEFD2888391DC0F30720FFF7C8FD28789D
-S31508000F40B91DFFF7C4FD8448FFF700FD7DA0FFF734
-S31508000F50FDFCD5E9000100F0A1FB0028C3D063A081
-S31508000F60FFF7F4FC03203070BDE8FC9FF0B37A4A23
-S31508000F707548843A01920099FFF70AFE0546401C17
-S31508000F805BD0002D3ADD7CA0FFF7E0FC72492846CD
-S31508000F90FFF7CCFD7048FFF7D9FC7BA0FFF7D6FC1E
-S31508000FA0D7F880016C49000E07F5C077FFF78FFD6B
-S31508000FB03868C846C0F3074009F10201FFF787FD04
-S31508000FC0388808F10401C0F30720FFF780FD387858
-S31508000FD008F10601FFF77BFD5F48FFF7B7FC59A04C
-S31508000FE0FFF7B4FC38682946019A00E006E000F0ED
-S31508000FF05DFB002827D03DA0FFF7A8FCDBF84412CC
-S31508001000DBF83C028142AFD165A0FFF79FFC00F0F8
-S315080010103BFBF0B135A0FFF799FC68A0FFF796FCFB
-S31508001020504603F0EFFF6BA0FFF790FC3470FFF714
-S315080010306FFCBDE8FC5FFFF73DBC347070A0FFF79E
-S3150800104085FC03200AE0347026A0FFF77FFC062003
-S3150800105004E0347023A0FFF779FC0720FFF76AFC49
-S315080010605046BDE8FC5F03F0CDBF0000C801002074
-S31508001070F806002052656164696E67206C696E65C2
-S315080010802066726F6D2066696C652E2E2E4552524B
-S315080010904F520A0D000000004669726D776172654D
-S315080010A02075706461746520726571756573742046
-S315080010B064657465637465640A0D00004F70656E37
-S315080010C0696E67206669726D776172652066696CFC
-S315080010D06520666F722072656164696E672E2E2EB2
-S315080010E0000000004552524F520A0D004F4B0A0DA0
-S315080010F0000000005374617274696E672074686535
-S315080011002070726F6772616D6D696E6720736571A5
-S3150800111075656E63650A0D0050617273696E6720A6
-S315080011206669726D776172652066696C6520746F91
-S315080011302064657465637420657261736520626CEA
-S315080011406F636B732E2E2E00200900204572617383
-S31508001150696E672000000000A40A002020627974E6
-S3150800116065732066726F6D206D656D6F727920618B
-S31508001170742030780000000050726F6772616D6DE0
-S31508001180696E672000000000206279746573207418
-S315080011906F206D656D6F727920617420307800005C
-S315080011A057726974696E672070726F6772616D2015
-S315080011B0636865636B73756D2E2E2E00436C6F73B3
-S315080011C0696E67206669726D776172652066696CFB
-S315080011D0650A0D004669726D7761726520757064DF
-S315080011E0617465207375636365737366756C6C7972
-S315080011F020636F6D706C657465640A0D00000000ED
-S31508001200496E76616C696420636865636B73756D96
-S3150800121020666F756E642E2E2E4552524F520A0D59
-S31508001220000000002DE9F047044600684FEA9128BF
-S315080012301F4616460D464FEA8828401C05D14146EA
-S31508001240204600F0E1F8002825D0216840464145AF
-S3150800125005D00146204600F0E7F804001DD02068B6
-S315080012604FF48069281A051908F580682D1DFFF7BF
-S3150800127008FB281B001F484506D34146204600F0B8
-S31508001280D3F8040009D0251D16F8010B05F8010B43
-S315080012907F1EECD10120BDE8F0870020FBE70000A7
-S315080012A00A4810B50068401C04D0084800F02EF91A
-S315080012B0002809D006480068401C04D0044800F0FD
-S315080012C025F9002800D0012010BD0000B40F002029
-S315080012D0B00B002070B50D4600F0C6F804460C4861
-S315080012E0011B681E814211D3204600F05FF80646AE
-S315080012F06019401E00F05AF80146FF2E06D0FF2955
-S3150800130004D03046BDE8704000F004B8002070BD37
-S31508001310FFFF1F0C2DE9F041884640453AD80328BF
-S3150800132038D3B8F10F0F35D805461F4F37E0FFF70A
-S31508001330A8FA4FF0FF360024FFF7A3FA04EB44009F
-S3150800134007EB8000017AA94204D104EB440057F860
-S31508001350206003E0641CE4B20D2CEDD3701C1AD097
-S3150800136002F042F841F6C8114418304602F042FA33
-S3150800137005E002F039F8A0420CD8FFF782FA02F02D
-S3150800138049FAC0F300000028F3D102F043FA30F01E
-S31508001390200002D00020BDE8F0816D1CEDB2454565
-S315080013A0C5D90120F7E700000463000870B50546B3
-S315080013B000240D4EFFF765FA04EB440156F82100A8
-S315080013C0A8420BD806EB810149680844A84205D90A
-S315080013D004EB440006EB8000007A70BD641CE4B29E
-S315080013E00D2CE7D3FF2070BD046300080048704742
-S315080013F000C0000C03494FF0FF30086001F20441B9
-S3150800140008607047B00B002010B58A0501D000208F
-S3150800141010BD02688A4204D002C04FF48062FFF70A
-S315080014203AFA012010BD000070B504460C480D4676
-S31508001430844202D1A0F204440AE00A48854202D155
-S31508001440074C054604E0204600F060F8002806D060
-S3150800145029462046FFF7D8FF002800D0204670BD51
-S31508001460B40F002000C0000C0821B1EB106F01D1A9
-S3150800147000F18060704700000B48D0E90012114463
-S3150800148082681144C26811440269114442691144D0
-S315080014908269D0F800021144C943814201D1012072
-S315080014A0704700207047000000C0000C70B5164653
-S315080014B00D46FFF7D9FF04461049681E091B8142ED
-S315080014C014D32046FFF772FFFF280FD06019401E7D
-S315080014D0FFF76CFFFF2809D0A00A09498002884255
-S315080014E02B463246214603D1064802E0002070BD4D
-S315080014F00548BDE87040FFF795BE0000FFFF1F0CCA
-S3150800150000C0000CB40F0020B00B00202DE9F041FC
-S3150800151006460068FFF74AFFFF2826D00024FFF793
-S31508001520B0F9306806EB042500EB04272D1D01F001
-S315080015305BFF00F10D082946384602F071F905E00F
-S3150800154001F052FF404510D8FFF79BF902F062F907
-S31508001550C0F300000028F3D102F05CF930F0100067
-S3150800156003D1395C2A5C914202D00020BDE8F081A3
-S31508001570401CFF28F5D9641C042CD0D30120F5E7BC
-S3150800158008B5002000900D480168491C14D0D0E920
-S3150800159001121144C2681144026911444269114496
-S315080015A08269C06911440844C04300906A46042110
-S315080015B00348FFF77BFF08BD012008BDB40F0020D4
-S315080015C000C2000C10B586B0142216496846FEF70C
-S315080015D0DBFE684602F04EFA002002F043FC0020CB
-S315080015E002F024FB042002F017FB02F01FFA202168
-S315080015F0012002F0BBFB012002F0BEF901F080FEDB
-S3150800160080220921084802F09DF9084C00220D2184
-S31508001610204602F097F9216E21F40051216606B0A2
-S3150800162010BD00000462000800850248008F0248C9
-S3150800163002494FF000704860704700000085024874
-S3150800164001494880704700004001002010B501F0AC
-S31508001650CBFE0B4C616888420CD32178094851B1FE
-S31508001660002121704FF00071416001F0BDFE6188D4
-S315080016700844606010BD012121704902F4E70000AA
-S31508001680400100200085024810B5FFF779FF0028C1
-S3150800169003D0BDE81040FFF703BE10BDFFF71ABE22
-S315080016A0FFF7A4BEFFF7A6BEFFF7E6BEFFF7FEBE2E
-S315080016B000487047001BB7002DE9F0418CB0DFF8F1
-S315080016C084800026012502248DF8006001958DF896
-S315080016D008406A460421404602F0ECF890278DF847
-S315080016E00C7004958DF8144003AA0521404602F0B3
-S315080016F0E1F81548C16921F0070141F00101C1610E
-S315080017008DF8246009AA0D21404602F0D3F88DF819
-S31508001710187007958DF8204006AA0C21404602F05D
-S31508001720C9F80A48016841F040010160C16864F3DC
-S315080017300201C160016821F0400101600CB0BDE8FA
-S31508001740F081000000810248000003400043014880
-S315080017503EB54FF46140009008208DF805008DF8DD
-S31508001760060001208DF8070010208DF808000E4CA1
-S315080017700020ADF80A0069460122206802F064FCE0
-S31508001780012304221021206802F08AFD0123042285
-S315080017900021206802F0E2FC2068016C21F00F01AC
-S315080017A0891C01643EBD0000F401002010B5044602
-S315080017B006480068D0F81411C1F3C00109B1002029
-S315080017C010BD02F036FC2070012010BDF401002087
-S315080017D02DE9F0411B4C80461B4E60780F460025CC
-S315080017E080B120783044401CFFF7E0FF012819D06B
-S315080017F001F0FAFD61686431884200D965700020FD
-S31508001800BDE8F0811048FFF7D1FF0128F7D13078FD
-S31508001810401E8028F3D801F0E7FD6060257001209E
-S315080018206070ECE72078401CC2B222703078904293
-S31508001830E5D1711C4046FFF72EF8657020783870A0
-S315080018400120DDE7EC010020B813002070B5144D27
-S31508001850014601262868D0F81421C2F300320AB1DD
-S31508001860002070BD02F033FC01F0BEFD00F10A0451
-S3150800187007E0FFF706F801F0B7FDA04201D90026F8
-S3150800188006E02868D0F8140100F44070C005F0D5C9
-S3150800189028684FF48071C0F81811304670BD0000F2
-S315080018A0F401002070B50D460646812903D97A2130
-S315080018B00EA0FEF717FE2846FFF7C8FF012803D03B
-S315080018C07E210AA0FEF70EFE00240CE0FEF7D9FFE3
-S315080018D0305DFFF7BBFF012803D0872103A0FEF781
-S315080018E001FE641CA4B2AC42F0D370BD2E2E5C2E51
-S315080018F02E5C2E2E5C2E2E5C536F757263655C41D2
-S31508001900524D434D345F584D43345C727332333213
-S315080019102E6300000D4810B500680068018E0B4C58
-S31508001920241F2180408E60802088000403D56188AA
-S31508001930201D00F07FFA2088400405D02188BDE8E4
-S315080019401040024800F05ABC10BD0000A801002053
-S3150800195070B52A4C54F89C0F40F0010020602068AE
-S3150800196020F0F00040F080002060264D244A052132
-S31508001970284601F09FFF01220521284601F0D6FFDF
-S315080019801F4A06211032284601F094FF012206213B
-S31508001990284601F0CBFF1A4A1B4D403A002128463B
-S315080019A001F088FF01220021284601F0BFFF144AF2
-S315080019B0164E303A0621304601F07CFF01220621F8
-S315080019C0304601F0B3FF0E4A0721203A304601F0AF
-S315080019D071FF01220721304601F0A8FF084A0121BC
-S315080019E0103A284601F066FF01221146284601F002
-S315080019F09DFFA06940F48810A06170BD00400050AA
-S31508001A006462000800830248008402480081024894
-S31508001A10014600200A7B002A02D1084600F076BB60
-S31508001A20704770B50446407B002501280DD06068D4
-S31508001A3000B18047207B30B9204600F06BFB10B11F
-S31508001A400125002000E001206073284670BD10B50E
-S31508001A50017B012411B900F023F900B900242046BE
-S31508001A6010BDF0B589B00E460446154624216846D1
-S31508001A70FEF7BCFC207AC00702D0032009B0F0BDEF
-S31508001A802046FFF7C5FF000708D50520002EF5D02C
-S31508001A900D2EF3D00E2EF1D0042EEFD000223146B3
-S31508001AA00D2E5BD00ADC0D2E72D2DFE806F0E72693
-S31508001AB01E372EEBEBD9EBEB3F474F006846861CEB
-S31508001AC005F1100722296FD008DC0E294DD01F29F1
-S31508001AD052D020295FD021295AD166E023297CD00B
-S31508001AE024297BD0252953D1B6E0207B002873D141
-S31508001AF02946204600F005FBB7E0207B00286BD17D
-S31508001B002946204600F0D0FAAFE0207B002863D1B2
-S31508001B10D5E90012204600F01FF9A6E0207B002830
-S31508001B205AD12946204600F017FA9EE0207B002865
-S31508001B3052D12946204600F022FA96E0207B00285A
-S31508001B404AD12946204600F050FA8EE0207B00282C
-S31508001B5042D12946204600F016FA86E0207BD8BBFB
-S31508001B602946204600F070FA7FE0207BA0BB294674
-S31508001B70204600F06FFA78E004218DF8001095F8F9
-S31508001B8020202946102A7DD88DF80120801C56E091
-S31508001B9078E0012203E08DF800202DE00022694656
-S31508001BA0204600F0CFFA60E023E001218DF800100E
-S31508001BB095F82010102965D895F82120102A61D8A3
-S31508001BC011448DF8011095F820202946801CFEF74F
-S31508001BD096FB95F8212002E050E016E035E095F8EE
-S31508001BE0200039463044FEF78AFB207B0028D5D0F2
-S31508001BF044E002218DF8001095F820202946102A85
-S31508001C0040D88DF80120801CEDE705218DF80010DD
-S31508001C1095F82010102935D895F82120102A31D8A2
-S31508001C2011448DF8011095F820202946801CFEF7EE
-S31508001C3066FB95F8200095F8212030443946FEF7D2
-S31508001C405EFB207B0028A4D018E0207BB0B929468B
-S31508001C50204600F0D5F908E008208DF80000C4E712
-S31508001C60207B58B9204600F057F838B10F2807D01E
-S31508001C700A2807D0332805D00120FFE60020FDE614
-S31508001C800220FBE60420F9E630B404460020257B52
-S31508001C90002D03D1204630BC00F0F4BA30BC7047A2
-S31508001CA070B50546012401F09FFB00F2E93601F004
-S31508001CB09BFBB04201D92E242BE0FEF7E2FD2868F3
-S31508001CC00068808DC0F340000028F0D02E2C20D06C
-S31508001CD028680068818D41F00401818528680068BC
-S31508001CE010F8291F41F001010170286890F85A0080
-S31508001CF078B9284600F0FEFD040001D02B2C08D147
-S31508001D00284600F0DDFB040003D12968012081F88C
-S31508001D105A00204670BD0000F8B504460125217A10
-S31508001D200020890713D4216800263346B1F84C10E1
-S31508001D30009640EA01420749204601F00FF80500DF
-S31508001D4005D1204600F012FC206880F85A60284623
-S31508001D50F8BD00009A6200082DE9F04F9BB0934643
-S31508001D600C4606462822324910A8FEF70DFB4021EC
-S31508001D706846FEF73BFB31680120487631680876ED
-S31508001D8031688876307A400701D50F243FE0A046AF
-S31508001D90ABEB08056D1C2A462146304600F078FC58
-S31508001DA0040034D16946304600F054F904002ED1B7
-S31508001DB003984FF47F41C0F30123C0F385220298AC
-S31508001DC001EA10400399C9B20843B2FBF0F202993E
-S31508001DD002EB030AC1F3035110AA52F821704743D4
-S31508001DE00BE008EB0702914653464146304600F0A1
-S31508001DF0EBFD040003D1C846ED1BBD42F1D235B157
-S31508001E0053465A464146304600F0DEFD04463068E1
-S31508001E10006802F0DDF80028F9D13068006802F0A1
-S31508001E20D3F80028F3D11BB02046BDE8F08F000098
-S31508001E30D46200082DE9F0410446006801270D46E2
-S31508001E408180C8073E460DD0216802204876207A50
-S31508001E50390400F0EF0020722068006802F066F886
-S31508001E6020688671A8070ED5216803204876207A4F
-S31508001E704FF4003100F0EF0020722068006802F08D
-S31508001E8055F82068867168070ED5216804204876BB
-S31508001E90207A4FF4802100F0EF0020722068006855
-S31508001EA002F044F82068867128070ED521680520B7
-S31508001EB04876207A4FF4002100F0EF00207220685F
-S31508001EC0006802F033F820688671E8060ED52168A6
-S31508001ED006200876207A4FF4801100F0DF00207281
-S31508001EE02068006802F022F82068C671A8060ED598
-S31508001EF0216807200876207A4FF4001100F0DF00E9
-S31508001F0020722068006802F011F82068C671680619
-S31508001F100ED5216808200876207A4FF4800100F053
-S31508001F20DF0020722068006802F000F82068C67199
-S31508001F30E8050ED521680920C876207A4FF0807109
-S31508001F4000F0CF0020722068006801F0EFFF2068DB
-S31508001F5086713846BDE8F0811FB50C46417A0022E5
-S31508001F6049070092019202926946039200F03DF8F1
-S31508001F700199C1F3C611491C216004B010BD407A0D
-S31508001F800860002070470268928CC2F30B020A8030
-S31508001F900268138D526A1B0443EA12424A600268B9
-S31508001FA0926A120C0A720268D26A120E4A720268A1
-S31508001FB0D26A120C8A720268928D120ACA72026872
-S31508001FC092F82C200A730268926A120E4A73026803
-S31508001FD0128E120A8A73026892F83020CA73006851
-S31508001FE0006B000C08740020704710B50B4601689A
-S31508001FF00F22581C3431FEF782F9002010BD00006C
-S315080020007CB500260446019600680D460123B0F803
-S315080020104C000C4946EA004201A80090204600F010
-S315080020209DFE00280DD10199890105D50121297048
-S31508002030217A41F0080103E02E70217A01F0F701B8
-S3150800204021727CBD986200080068006A086000205A
-S3150800205070470000FEB500250E460446029500F0BE
-S31508002060A1FF00281CD1206801230E49B0F84C00B6
-S3150800207045EA004202A80090204600F06FFE0028BC
-S315080020800ED120680121006801F0ABFF0120CDE9DF
-S315080020900060044940230022891D204600F002FF03
-S315080020A0FEBD0000B66200081FB50C46417A4FF027
-S315080020B000024907009201920292694603920ED5E0
-S315080020C0FFF793FF002808D10299019A090441EA0B
-S315080020D01241890201F58061216004B010BDFFF745
-S315080020E084FF0028F9D1029A01999205019BC1F350
-S315080020F0C231120D42EA9372891C521C8A40226030
-S31508002100EBE74FF40070088000207047007A00F073
-S315080021100F00704710B504460068006801F012FF0A
-S31508002120022001F029FC207A400606D5204600F058
-S315080021301DFA0121204600F0F1FD2046BDE81040B9
-S3150800214000F00AB92DE9FE4F91460F46044600F005
-S3150800215029FF05004CD120680021006801F041FFE5
-S3150800216078782549401C20F001060DF10808B61CB0
-S31508002170012332468A462046CDF8008000F0EEFD5F
-S31508002180050035D10220CDE900701B4933460022EF
-S315080021901831204600F086FE2068006801F018FF16
-S315080021A00028F9D101235A0251462046CDF800806D
-S315080021B000F0D4FD05462068006801F009FF0028F4
-S315080021C0F9D12068006801F0FFFE0028F3D17DB937
-S315080021D020464D466946FFF713FF40B99DF80010A3
-S315080021E0012901D1012D02D0294300D0102005462E
-S315080021F02846BDE8FE8F00009C6200082DE9F041E4
-S3150800220004460D464FF0000888064FF01E074FF0AB
-S31508002210010608D52068202107762068006801F0A5
-S3150800222085FE2068C671E80608D52068102107765D
-S315080022302068006801F07AFE2068C671A8070DD5E7
-S3150800224021681F20887620680221006801F06EFE4A
-S31508002250207A00F0DF00207220680672E8070DD0A9
-S3150800226021681C20487620680121006801F05EFE7E
-S31508002270207A00F0EF002072206886714046BDE89B
-S31508002280F0810000FEB50446007AC50701D0032593
-S315080022904EE0000701D505254AE00126012B0D462B
-S315080022A00FD01146029222682A201F4656762268C7
-S315080022B0167622689676226892F85A20012A20D045
-S315080022C032E0216817462A2091F85A10012201297E
-S315080022D02AD13946204600F0DBF928BB607A000788
-S315080022E000D47F0220680121006801F07AFECDE95A
-S315080022F000564FF400733A461649204600F0D2FDC0
-S3150800230012E01A46204600F0C3F968B92068012190
-S31508002310006801F066FE0F4BCDE900569B1C3A4655
-S3150800232002A9204600F09CFB80B1332810D0012575
-S315080023302068006801F04CFE0028F9D12068006882
-S3150800234001F042FE0028F3D12846FEBD0025EFE73E
-S315080023500425EDE79E62000801462C200A7A5206FB
-S3150800236002D4084600F078BA70470000FEB5044665
-S31508002370007AC50701D0032555E0050701D50525CF
-S3150800238051E0400701D502254DE00226012B0D46F6
-S3150800239010D01F4602922368114601225A762368F6
-S315080023A02A201A7623689A76226892F85A20012AF1
-S315080023B020D032E0216817462A2091F85A100122C7
-S315080023C001292AD13946204600F062F928BB607AED
-S315080023D0000700D47F0220680021006801F001FE92
-S315080023E0CDE900564FF400733A461849204600F0E6
-S315080023F059FD12E03A46204600F04AF968B92068C5
-S315080024000021006801F0EDFD104BCDE900569B1C3C
-S315080024103A4602A9204600F023FB90B11E2810D0A8
-S31508002420332810D001252068006801F0D1FD002866
-S31508002430F9D12068006801F0C7FD0028F3D12846C5
-S31508002440FEBD0025EFE70425EDE70000A2620008BF
-S315080024507CB504460020019020680121006801F03F
-S3150800246092FD164D01AED0B12068007F242815D103
-S315080024700123002229462046009600F06FFC00281A
-S315080024800CD025280AD00421204600F047FC002855
-S3150800249004D120688021006801F075FD7CBD022109
-S315080024A0204600F03BFC0028F8D1012300222946EB
-S315080024B02046009600F052FCE3E70000966200080A
-S315080024C030B50446007A93B000F00805204600F0BF
-S315080024D057FB38B912A8012300905A022149204611
-S315080024E000F03CFC50EA05013AD1204600F026FDF2
-S315080024F020B120680021006801F092FD402102A861
-S31508002500FDF774FF2168012091F8441009071DD0D2
-S31508002510204600F047FDC8B9012102A8CDE900010F
-S3150800252010494023104A1039204600F0BBFC68B910
-S31508002530069901F00F01012901D0012006E0216862
-S31508002540096811F8282F42F004020A70002807D0FB
-S315080025502068006810F8281F01F0FB0101700020B0
-S3150800256013B030BD9C6200080100008010B5044617
-S31508002570006830212030FDF739FF0021617220689C
-S3150800258080F850102268012050762268107622685A
-S31508002590107722689076217220680068818D21F074
-S315080025A00401818510BD2DE9F0410F4604461A2520
-S315080025B000F01AFF00F2E93600F016FFB04201D922
-S315080025C02E250DE0FEF75DF92068006801F000FD94
-S315080025D00028F1D12068006801F0F6FC0028EBD14C
-S315080025E02068006801F0F0FCF8B9388800258106F3
-S315080025F006D4C0F305210D2902D0C043800710D1A7
-S315080026002068006801F0E4FC08B11B250DE0388855
-S31508002610810602D4C043800703D1207A40F0200007
-S315080026202072207A40F0100020722846BDE8F0811A
-S3150800263010B502460020126801230146002A00DA76
-S315080026401946540000D51946940000D51946540178
-S3150800265000D51946D40000D51946140100D51946E7
-S31508002660140400D51946940200D51946D40200D59B
-S315080026701946140300D51946D40100D51946D403C2
-S3150800268000D51946120701D4002900D0012010BD33
-S3150800269038B50D460021009114466946FFF704FD3A
-S315080026A0002804D1009A2919914200D9332038BD4F
-S315080026B02DE9F041984616460D46044600F094FE6C
-S315080026C000F2E937FFF726F900F08EFEB84205D882
-S315080026D0FEF7D7F82068C0790028F3D021680020D3
-S315080026E0C8712068017E1E2907D0012180F8511083
-S315080026F02046BDE8F04100F017B800200FE0012E93
-S3150800270002D0022E05D008E021680968096A296006
-S3150800271003E021682A6809680A62401C2D1D4045A5
-S31508002720EDD30020BDE8F0812DE9F04704460068A6
-S31508002730454F25254FF000084449006801F0FAFB8B
-S3150800274020680179090703D1006801F03DFC20B132
-S315080027500221204600F0E2FA05462068017911F0C8
-S31508002760700F03D1006801F033FC20B10421204624
-S3150800277000F0D4FA05462068354E0068314601F067
-S31508002780D5FB206890F85110012946D1006800222F
-S31508002790394601F021FC216801202E4F002581F8D9
-S315080027A0580000F021FE4FF47A71B7FBF1F1471893
-S315080027B04FF400497F1CFFF7ADF800F015FEB8424C
-S315080027C001D92E250EE0FEF75CF8206881790129EB
-S315080027D008D0C179012905D00068494601F0D8FB1F
-S315080027E00028E8D12168002088712168C8719DB940
-S315080027F02068006801F0E3FB70B120682525414692
-S31508002800006801F093FB20683146006801F08EFBF2
-S315080028100621204600F082FA2068006801F0CFFB06
-S3150800282038B92068006801F0C1FB08B1242500E02A
-S315080028302525206846F08051006801F08FFB206846
-S3150800284005772846BDE8F087966200080000FF1065
-S315080028500080FF0040420F0038B504462C20217A3C
-S31508002860490644D40121204600F058FA00283ED1F2
-S31508002870216809688A8D22F001028A852168012269
-S3150800288009688B8D62F31F238B85216809688A8DF9
-S3150800289042F001028A852268F3211268918622682D
-S315080028A04EF2FF011268D186236833221B681A8705
-S315080028B02268126851872168096811F82E2F22F0BC
-S315080028C00F0242F00E020A702168096811F8292FD2
-S315080028D042F00E020A70217A41F04301217200216A
-S315080028E000910349009A521C00928A42FAD338BDD5
-S315080028F0A0860100FEB5002504462E4600231A468A
-S3150800290030492046009600F029FA002858D101A837
-S31508002910CDE900062B4906234FF4D5720C31204623
-S3150800292000F01CFA20B121684A7E022A0FD011E075
-S315080029300199CAB2AA2A03D1C1F30321012901D0F8
-S31508002940192007E02168012281F8502002E081F869
-S31508002950506000206D1CEDB2022D01D21928CDD091
-S3150800296000282DD12068B0F84C10204600F0CCF88D
-S31508002970002825D12068134D243000900323002217
-S31508002980A91C204600F0EAF9002819D1216820463A
-S315080029904C31009105230022291D00F0DFF900289B
-S315080029A00ED102A92046FFF72BFB002808D19DF877
-S315080029B00810012900D12B20217A01F0FC0121728F
-S315080029C0FEBD0000846200082DE9FC410546002092
-S315080029D00190687A98461646000701D449025602BD
-S315080029E001AF0A4601231D492846009700F0B6F9AB
-S315080029F0040030D1194901233246891C284600971C
-S31508002A0000F0ACF9040026D1144902230022091D5E
-S31508002A102846009700F0A2F9044600F0E5FC0146B6
-S31508002A2008EB4802C2EBC81001EBC006761C00F0A2
-S31508002A30DBFCB04201D92E240DE0FDF722FF286801
-S31508002A40006801F0C5FA0028F1D12868006801F08D
-S31508002A50BBFA0028EBD12046BDE8FC81AE6200082F
-S31508002A602DE9F04385B007460C46DDE90C6939685F
-S31508002A7001201546887600210491797A9846090737
-S31508002A8002D42168490221604FF40071CDE901158D
-S31508002A9022218DF80C108DF80D00386801A9006800
-S31508002AA001F0A6FA38684FF08071006801F056FA0E
-S31508002AB004A80090012341463846226800F04EF9E2
-S31508002AC004000BD019E080234A4631463846FFF702
-S31508002AD0EFFD040011D16D1E06F50076002DF2D12A
-S31508002AE00849384600F082FA040006D13868C07EE4
-S31508002AF0092802D13846FFF7ABFC05B02046BDE8E9
-S31508002B00F083000040420F007CB504460020019087
-S31508002B1001A80D460A46009001231849204600F0F0
-S31508002B201DF9236893F8501009B9122801D0002816
-S31508002B3023D120331149009304232A460C31204619
-S31508002B4000F00CF9122801D0002816D1204600F012
-S31508002B505BF9002811D1216891F8502032B1096A31
-S31508002B604900617A06D541F00C0105E0617A41F029
-S31508002B70020101E041F0010161727CBDB662000804
-S31508002B8070B594B000210446129110911191007A03
-S31508002B90032300F008052068B0F84C20343041EAD9
-S31508002BA00246009032462B49204600F0D7F82843C3
-S31508002BB00BD0204600F0F6F905462068012100688A
-S31508002BC001F00FFA14B0284670BD40216846FDF79B
-S31508002BD00DFC69462046FFF73DFA58B900994FF4AF
-S31508002BE07F4202EA112252EA116103D0217A41F0AA
-S31508002BF0040222720500E5D1607AC006E2D42046B6
-S31508002C0000F0D0F90500DDD1206812490123B0F89B
-S31508002C104C00243146EA004212A80090204600F0F3
-S31508002C209DF80500CED120680121006801F0D9F988
-S31508002C30012110A8CDE900010649082300223431F4
-S31508002C40204600F02FF90546DDE910122068C0E994
-S31508002C501112B7E7926200087CB50546002000907D
-S31508002C6001900E8816F47C5F23D0C6F305240F2C3A
-S31508002C701FD01C462B681B681B69009309889E0198
-S31508002C80C1F3052105D5032903D0297A41F00806A1
-S31508002C9002E0297A01F0F7062E72072A37D2DFE812
-S31508002CA002F0080409142B2D2B0068462360FFF751
-S31508002CB0BFFC7CBD68462360FFF7BAFC0028F8D045
-S31508002CC01449284600F092F97CBD13490A69120294
-S31508002CD022600A694B69120E42EA032262604A6957
-S31508002CE08B69120E42EA0322A2608A69C969120E2A
-S31508002CF042EA0121A1607CBD23607CBD98B20190A7
-S31508002D0001A8FFF795FC0099090C21607CBD0120FC
-S31508002D107CBD000040420F0000C001482DE9F0418B
-S31508002D20064600680C460027006810F82F1F214346
-S31508002D30017000F059FB00F2F51500F055FBA842AA
-S31508002D4001D92E2707E0FDF79CFD3068006890F84A
-S31508002D502F002042F1D13846BDE8F0812DE9F04731
-S31508002D60044600680026DDF820A00D4680F851606C
-S31508002D7021684FF00108994681F81980216817469D
-S31508002D80204681F818802946FFF70DFCC0B21B289B
-S31508002D9038D01A2836D020683A462946006801F005
-S31508002DA01BF900F021FB00F2E937FEF7B3FD00F04E
-S31508002DB01BFBB84205D8FDF764FD2068807900281A
-S31508002DC0F3D0206886712068417E1C2902D002292A
-S31508002DD008D00CE053464A4629462046BDE8F04747
-S31508002DE0FFF73ABF2988C1F30521082909D02978B0
-S31508002DF0890601D580F851802046BDE8F047FFF7DF
-S31508002E0093BC0220BDE8F0872DE9FC470646002062
-S31508002E1005460190306890F85000D8B11F48DFF891
-S31508002E2080A080460DF10409012300225146304650
-S31508002E30CDF80090FFF792FF04000ED064252846CF
-S31508002E406D1C322803D23068006A0028ECDA204666
-S31508002E50BDE8FC874FF48010E1E730681049203060
-S31508002E600090042342460C313046FFF777FF0400F2
-S31508002E7001D0122CEBD1002444F6206700F0B4FAF6
-S31508002E804FF47A71B7FBF1F147187F1C01E0FDF7A3
-S31508002E90F8FC00F0A9FAB842F9D3D0E700001040D0
-S31508002EA0B66200082DE9F04786B00025DDE90EA9CF
-S31508002EB0CDE901530446D81C8DF810504FEA900806
-S31508002EC08DF8115020680F461646006802A901F0D1
-S31508002ED08FF801A800900123324639462046FFF7AD
-S31508002EE03DFF002827D143464A4651462046FFF76C
-S31508002EF0DFFB00281FD100F077FA00F2E936FEF76B
-S31508002F0009FD00F071FAB04205D8FDF7BAFC206851
-S31508002F10007A0028F3D0206805722068817E1F2970
-S31508002F2008D0012180F8511006B02046BDE8F047C8
-S31508002F30FFF7FABB002006B0BDE8F0877CB500268F
-S31508002F400546019600F02EF8040026D1286840218F
-S31508002F50006800F0EFFF2868B0F84410090A49072E
-S31508002F6016D5B0F84C00012346EA004201AE0C49DA
-S31508002F7028460096FFF7F2FE04000ED10849012301
-S31508002F800222091D28460096FFF7E8FE040004D130
-S31508002F9028680221006801F043F820467CBD00003D
-S31508002FA0B66200087CB5064600200190316801AC7F
-S31508002FB00123B1F84C10009440EA01452A460A4913
-S31508002FC03046FFF7CBFE00280CD10199C1F38221C8
-S31508002FD0022907D0044902232A460A3930460094B2
-S31508002FE0FFF7BCFE7CBD00009862000870B5044679
-S31508002FF00D4621680120002681F8580000F0F4F9F2
-S315080030004FF47A71B5FBF1F145186D1CFEF782FC99
-S3150800301000F0EAF9A84201D92E2605E0FDF731FCB1
-S315080030202068007A0028F1D02168002008722068FC
-S31508003030817E1F2900D0067E304670BD30B4044616
-S315080030400020257B002D03D1204630BCFFF78EB922
-S3150800305030BC70470D4A0021106851FA80F1C0F360
-S31508003060072313FA81F1C0F3074313FA81F101EB41
-S31508003070106081B200201318401C1B7938281944A7
-S3150800308089B2F8D3C843401C80B2704700010020BB
-S3150800309010B500F029F800280DD10849064808603F
-S315080030A0002002460B18401C1A713828FAD3BDE8CE
-S315080030B0104000F02DB810BDA2E742CE0001002056
-S315080030C070B50D460646002400F00EF838B1382EC5
-S315080030D005D225B1034801243044007928702046DA
-S315080030E070BD00000001002070B5074D0749002497
-S315080030F02868884205D1FFF7ADFFA98F884200D11D
-S315080031000124204670BD000000010020A2E742CE3F
-S3150800311010B5FFF79FFF0149888710BD0001002001
-S315080031202DE9F041674ED6F80002C00709D1D6F856
-S31508003130040240F00100C6F80402D6F80002C007EF
-S31508003140FBD061480068800509D55F4808300168EA
-S3150800315041F40071016041F64C5001F073FC5B4D7F
-S31508003160286840F40020286040F6C41001F06AFC84
-S315080031702868574908402860544F103F38684FF070
-S31508003180000810F0300FA5F104041CD03868514926
-S3150800319008403860FEF78CFA4F49B0FBF1F04C490D
-S315080031A0C91C01EB004039680843386047490831B3
-S315080031B0C1F80080286820F4003028602068C0F331
-S315080031C0C2100728FAD1286840F001002860206854
-S315080031D0C007FCD0286840F0100028603B4F3F48E5
-S315080031E03F1D3860286840F040002860286820F0B5
-S315080031F010002860286840F480202860206840076E
-S31508003200FCD5286820F0010028602068C007FCD19A
-S3150800321033494FF00110086031480830C0F8008083
-S31508003220001FC0F800802E481430C0F80080001D2A
-S31508003230C0F800802A49032010310860091F294870
-S315080032400860274928481C310860286820F0400093
-S3150800325028602648386020688006FCD54FF416603A
-S3150800326001F0F0FB2248386020688006FCD54FF450
-S31508003270616001F0E7FB1F48386020688006FCD5CE
-S315080032804FF4965001F0DEFB1B4838602068800634
-S31508003290FCD541F2707001F0D5FB184838602068FB
-S315080032A08006FCD54FF4E15001F0CCFB0520C6F8AA
-S315080032B06C010B480838C0F8008000F021F8BDE81A
-S315080032C0F0810000004000500044005014470050B0
-S315080032D0FDFFFEFFCFFFF0FFA0252600002F0B0104
-S315080032E00C4600500500010003002001002F0501CF
-S315080032F0002F0301002F0201002F0101002F0001FA
-S3150800330010B51C4C2068C1031B4823D51B49096806
-S31508003310C90701D1FEF7CCF918490C3909684A07DB
-S31508003320174911D50A68C2F303630A680968C2F324
-S315080033300622C1F30641491C5B1C13FB01F1B0FBD5
-S31508003340F1F0521C504305E0096801F07F01491C61
-S31508003350B0FBF1F02168C9B2491CB0FBF1F0054990
-S31508003360091D096801F00101491CB0FBF1F0054986
-S31508003370086010BD0C46005000366E011C47005010
-S3150800338018470050C0FF032072B60D480D49086063
-S31508003390BFF34F8F62B60B488030016841F4700165
-S315080033A0016008480C30016821F0080101600649EF
-S315080033B0486920F00F0040F004004861704700009B
-S315080033C00000000808ED00E00020005810B51022A3
-S315080033D051060448FCF793FFFFF7D6FFFFF7A0FE58
-S315080033E010BD0000C4FF032000B500F01FF8014817
-S315080033F0006800BD0C02002000B500F00FF84FF081
-S31508003400E0200449416100218161052202610248E8
-S31508003410016000BD7F3202000C0200204FF0E02060
-S315080034200021016141618161704700004FF0E02091
-S315080034300069C00303D502480168491C016070474A
-S315080034400C020020D0F8C43113F4407FFAD10223CD
-S3150800345043EA0242491C42EA0161C0F8C4117047B6
-S3150800346010B501210160044C204600F01BFD2046E2
-S31508003470BDE8104000F0E4BA1000001070B5084D21
-S315080034800446284600F0C2FC284600F019FD2068CC
-S3150800349020F00100206020688007FCD470BD000081
-S315080034A01000001001460020D1F8C81101F00F01E4
-S315080034B0012903D0022903D1FEF7FAB800F0CEBAE3
-S315080034C070472DE9F04115460E460446FFF7D6FF2C
-S315080034D0D4F8C80120F00F003043C4F8C8012046CC
-S315080034E0FFF7E0FFB0FBF5F1C1F5806140F2FF366A
-S315080034F0B14200D33146C1F58062B0FBF2F7AB09A1
-S3150800350082099802B0FBF2F3B34200D33346184659
-S315080035104243920AEB1BA5EB8212934201D8012281
-S3150800352000E00022002A00D0084602D04FF0010130
-S3150800353001E04FF00201E2684CF2FF3322EA03028F
-S31508003540E260E26840EA813042EA0002E260BDE8F1
-S31508003550F081816841F0005181600068C16841F0DE
-S315080035600051C1607047000010B504460068204944
-S31508003570014449094A09520301F01F0142EA01219F
-S31508003580826822F47F428260206882680A438260E9
-S31508003590207E08B1012820D121682020C8616068F2
-S315080035A081000BD400F0604141EA804021688861BF
-S315080035B0A06800F0604141EA804002E02168886125
-S315080035C0A0682168C860207E012807D021684FF4CA
-S315080035D00060C86107482168C86110BD204600F030
-S315080035E073F821684FF00060C8610348F3E70000EC
-S315080035F000B0FEB74006A000C000200610B501685E
-S31508003600CA69C969C2F3C022C1F380010AB103209D
-S3150800361010BD09B1022010BD08230168CB610168FD
-S315080036208A69920042682BD422F0005242608C6963
-S31508003630C4F38A4464F31C024260CA68540F826861
-S3150800364064F35D7282609400CC6801D5C4F38A4441
-S3150800365064F31C0282600A68C2F3036202730A6991
-S3150800366002614A694261CA69C969C2F38002C1F343
-S31508003670C0010AB10029D0D100210176084610BD43
-S3150800368042F0005242608C6964F31C024260CC68C6
-S31508003690826864F31C028260CC68640F64F35D720E
-S315080036A0D8E70068C169C1F34012C169C1F30021B6
-S315080036B012B119B102207047042070474FF0E0613B
-S315080036C0C161002070470000027E0321012A12D141
-S315080036D002682021D1610168037B0A6863F31B62D3
-S315080036E00A600268016911610268416951610068EE
-S315080036F00249C161002108467047000040002800C1
-S315080037002DE9F04F8A460127DAF800204FF0000924
-S3150800371002EB82024FEA420B42F2107EDAF80420EC
-S315080037204D46F04639460A26BBFBF1F3B3FBF2F4E5
-S31508003730B4FBF6FC06FB1C4CB4FBF6F4BCF1050F17
-S3150800374000D9641C34B104EB840C4FEA4C0CB3FB6F
-S31508003750FCF302E0B3FBF6F301249A4201D89B1A64
-S3150800376000E0D31A142C07D8984505D9894625466A
-S315080037709846B3F57A7F02D3491C4029D4D9BAF8BA
-S315080037800830764640214A1C42F210746243B2FB66
-S31508003790F5F2934201D8D41A00E09C1AA64201D940
-S315080037A00F462646934202D8491E0329EBD20268E1
-S315080037B0E91B42F040020260491E9AF80A200903F2
-S315080037C09201A1F58051403A01F4E041D2B2114389
-S315080037D03A02A2F5807202F470621143A9F101025D
-S315080037E002F03F0211430161016821F040010160C6
-S315080037F0BDE8F08F054900B5F5220A6000F030F8FB
-S3150800380003480169C907FCD100BD00005455000CE6
-S315080038100020005801480069704700000020005841
-S3150800382030B505460C480C46F5210160502101606B
-S31508003830002304EB8300416854F8230000F022F8C3
-S315080038409B1C402BF5D3284600F024F80348016951
-S31508003850C907FCD130BD00005455000C00200058A3
-S3150800386030B50649AA240C60054B55221A608025F6
-S315080038700D600C601A603021016030BD5455000C93
-S31508003880A8AA000C024A1060101D016070470000CB
-S31508003890F055000C054910B5AA220A60044B5524B8
-S315080038A01C60A0230B60026010BD00005455000C7C
-S315080038B0A8AA000CF0B521F0030303441D698C0780
-S315080038C0E40EF826A640B5431D61456F4F00032652
-S315080038D0BE40B5434567134DA84202D0124DA842D3
-S315080038E005D1056E01268E40B543056614E01578A8
-S315080038F02D0611D555688D404560CD0800EB85002D
-S31508003900056C4907C90E07268E40B5430564157A26
-S315080039108D40016C0D43056410781969A040084371
-S315080039201861F0BD008E0248008F024810B5436F3B
-S31508003930490003248C40A3434367436F8A401343DB
-S31508003940436710BD21F0030310B5184403698907BE
-S31508003950C90EF8248C40A343036103698A401343C4
-S31508003960036110BD02480168024A114301607047AD
-S315080039701447005002000100014908607047000022
-S315080039800446005010B50C4C206820F480302060A6
-S31508003990FDF78EFE0949B0FBF1F0094901EB00413C
-S315080039A0054810380268074B1A4011430160206821
-S315080039B020F40030206010BD14470050A0252600D2
-S315080039C00000FFFFCFFFF0FF12484FF40001C0F8D8
-S315080039D08010D0F81C1321F03001C0F81C13816F39
-S315080039E00902FCD54FF40031C0F880100821C0F850
-S315080039F00413816F8903FCD54FF40021C0F88010A9
-S31508003A00D0F80C1341F00801C0F80C13816F0903B4
-S31508003A10FCD570470040005002480168024A114030
-S31508003A200160704714470050FDFFFEFF0248016819
-S31508003A30024A11400160704724470050FDFFFEFF0F
-S31508003A40010F054A01EB410102EB810120F07040AC
-S31508003A50C1F8440670470000004000500348044976
-S31508003A600068096801F00101C8407047C0FF0320DB
-S31508003A701446005038B50446002000F0B5F800F0AA
-S31508003A80D3F9E079012805D1FFF79EFF00F04EF83B
-S31508003A900028FBD0607A00F0F5F91D48D0F8C4106C
-S31508003AA00029FBD1207A00F05DF8207C00F092F81E
-S31508003AB0607C00F07BF8A07C00F06EF8E07C00F0FB
-S31508003AC07FF8A079012805D1FFF75CFF00F022F8FE
-S31508003AD00028FBD0E078A0B1FFF79EFFA078009001
-S31508003AE023786278E178A08800F0AAF8E1684FF4B4
-S31508003AF08030814201D100F077F8BDE83840FFF701
-S31508003B00FFBBA0790028F1D1FFF72CFFEEE70000F4
-S31508003B1000400050044801684FF46070884301D0A3
-S31508003B200020704701207047104700500348D0F81E
-S31508003B30000340F3C000401C7047000000400050DE
-S31508003B40010F074A01EB410102EB810120F07040A9
-S31508003B50D1F84016014201D0012070470020704775
-S31508003B600040005010B50B4C216841F480112160CB
-S31508003B7001280AD1206820F480102060642000F013
-S31508003B80BFF9206840F400202060BDE8104064209A
-S31508003B9000F0B6B91447005003490A68401E22F0DF
-S31508003BA0010202430A6070472046005003490A682A
-S31508003BB0401E22F0010202430A6070471046005078
-S31508003BC003490A68401E22F0010202430A60704750
-S31508003BD01446005003490A68401E22F0FF020243B9
-S31508003BE00A6070470C46005003490A6822F480327E
-S31508003BF002430A60704700000C4600500549002839
-S31508003C0040F20112086802D01043086070479043DA
-S31508003C10FBE700001C47005003490A68401E22F0D3
-S31508003C20070202430A6070471846005003490A68AB
-S31508003C3022F4803202430A6070470000184600509A
-S31508003C402DE9F0471E4617460B460446089DFFF722
-S31508003C50D5FFDFF808A1012BAAF10408A8F1040989
-S31508003C601AD0DAF800106D1E21F07F012943CAF830
-S31508003C70001048460168C906FCD5D8F8002042F06D
-S31508003C800102C8F800200168C907FCD0344905209C
-S31508003C90C1F86C01BDE8F087F4B34FF0C06070431B
-S31508003CA0B0FBF7F41820B4FBF0F0820DD8F800103A
-S31508003CB0404641F00101C8F8001049460B68DB0789
-S31508003CC0FCD0036843F010030360DAF80030DFF82D
-S31508003CD0948003EA08036FF0FF0808EB06263343CF
-S31508003CE04FEA082606EB02421343320202EB07624A
-S31508003CF01343CAF80030026842F0400202600268C4
-S31508003D0022F010020260026842F4802202600A6809
-S31508003D105207FCD5026800E019E022F001020260B1
-S31508003D200868C007FCD13C20B4FBF0F0800D854242
-S31508003D3001D200F055F85A20B4FBF0F0800D854208
-S31508003D4001D200F04DF8284600F04AF89EE7FDF744
-S31508003D50AFFC0549B0FBF1F08005A0E71847005015
-S31508003D6000400050FF8080F040420F001A4A10B50C
-S31508003D70136843F001031360131F1C68E407FCD0A3
-S31508003D80146844F01004146009024FF07F4404EBF1
-S31508003D900060A1F5807101431160106840F0400091
-S31508003DA01060106820F010001060106840F4802041
-S31508003DB0106018684007FCD5106820F001001060F4
-S31508003DC01868C007FCD1106820F04000106003494D
-S31508003DD00820C1F86C0110BD24470050004000506F
-S31508003DE008490A68084B22F4FE0203EB0040024326
-S31508003DF00A600448083801688906FCD5322000F0B4
-S31508003E007FB80000184700500000FFFF010F054A61
-S31508003E1001EB410102EB810120F07040C1F8480630
-S31508003E2070470000004000500C48D0F80012C9073F
-S31508003E3006D10121C0F80412D0F80012C907FBD038
-S31508003E4007480168890507D5054A4FF40071083205
-S31508003E50116001688905FCD47047000000400050D5
-S31508003E60004400500649D1F8C4201207FBD4D1F803
-S31508003E700C2322F040020243C1F80C2370470000CD
-S31508003E80004000500649D1F8C4201207FBD4D1F8E7
-S31508003E900C2322F080020243C1F80C23704700006D
-S31508003EA000400050010F054A01EB410102EB810178
-S31508003EB020F07040C1F81004704700000040005020
-S31508003EC0010F054A01EB410102EB810120F0704028
-S31508003ED0C1F814047047000000400050010F074A5B
-S31508003EE001EB410102EB810120F07040D1F80C147E
-S31508003EF0014201D001207047002070470040005061
-S31508003F0010B50446FFF7FCF90648074A0168B1FBF5
-S31508003F10F2F16143002001E000BF401C8842FBD358
-S31508003F2010BD0000C0FF032040420F000186090CA7
-S31508003F3041867047028F8A430287428F22EA1141DF
-S31508003F404187704710B5044C2046FFF75FFF2046AF
-S31508003F50BDE81040FFF7B4BF4000001010B50C468E
-S31508003F60034600F008F8188F20431887588F40EA50
-S31508003F701440588710BD828E0A438286C28E42EA52
-S31508003F801141C1867047808F084000D001207047D4
-S31508003F90B1F5803F04D2008E084004E00120704746
-S31508003FA0408E00EA11400028F8D17047406AC0F3F5
-S31508003FB003500F2801D00020704701207047408E1B
-S31508003FC0002800D001207047406AC0F300007047FF
-S31508003FD0406AC0F34000704782600988C1810020AA
-S31508003FE07047828922F0100242EA011181817047E6
-S31508003FF00A8882808A88C28082890B7A22F0200207
-S315080040001A4382810A7A1AB9828922F002028281C7
-S315080040108289497A22F00C0242EA8101818170473D
-S3150800402010F8282F02F0DD02027002780A430270A7
-S315080040307047D0F80C1111F0E06F03D0D0F81C01CE
-S3150800404080B27047406DFBE72DE9F04117460C46F4
-S315080040500546102600F04EF8207A00B1064657B1FC
-S315080040602079216800283246284602D000F0D0F888
-S3150800407001E000F08BF8E079710840004FF4807297
-S3150800408002EB0121801E0843401C40F440304FF0EB
-S31508004090FF33E8636079911C401E41EA006068635B
-S315080040A0A079190428B16A6B01EB004002436A63E0
-S315080040B005E0686B627901EB0241084368634FF4D7
-S315080040C0A060A863EB6460892864BDE8F081D0F835
-S315080040D0082112F0E06F02D0C0F880117047826B99
-S315080040E002F08002802AFAD04FF40052C264C0F867
-S315080040F08010704710B504461248844202D0124810
-S31508004100844202D10F48083010E01048844202D099
-S315080041100F48844202D10D48083007E00D48844212
-S3150800412002D00D48844203D10A48083000F0CEF880
-S315080041300320E060E068C007FCD0206C20F00F0088
-S31508004140206410BD0000034000020340000002483E
-S3150800415000020248004002480042024810B5D0F862
-S315080041600C4124F0E064C0F80C4141EA032141EA1D
-S315080041700261D0F80C21044B1A40114341F08051DA
-S31508004180C0F80C1110BD0000C0C0FFEF2DE9F047C4
-S3150800419014460E460546642934D394B3FFF75EFCED
-S315080041A001466420B1FBF0F8B6FBF0FC4FF48061E1
-S315080041B00E4601274A1EB1460CFB04FC08FB01F01B
-S315080041C0B0FBFCF0830AC0F309004B4504D89042C3
-S315080041D002D202461F460E46491EEFD1761E46F407
-S315080041E000402861686908490840091401EB8421E0
-S315080041F00843064901EB0741084368610020BDE80A
-S31508004200F087FFE70120FAE7EF8000FC0000FFFFD8
-S315080042102DE9F04114460D460646FFF71FFC0146F8
-S3150800422005FB04F70120B94234DD91FBF7F340F2B0
-S31508004230FF3C04E0401C07FB00F291FBF2F36345E8
-S31508004240F8D203FB04F24243B1FBF2F25F1C674368
-S315080042504743B1FBF7F1691AA5EB020200D54942BB
-S31508004260002A00DA5242914200DA5B1CC3F58061EB
-S3150800427041F4804131617169074A1140121402EB19
-S3150800428084221143054A02EB004001437161002074
-S31508004290BDE8F0810120FBE7EF8000FC0000FFFF8E
-S315080042A010B5D0F8084124F0E064C0F8084141EAA6
-S315080042B0032141EA0261D0F80821034B1A40114351
-S315080042C0C0F8081110BD0000C0C0FFF8204910B59D
-S315080042D0884211D1C4142046FFF798FD2046FFF7FF
-S315080042E02FFC0028FAD12046FFF7EAFD2046FFF703
-S315080042F0F5FD0028FAD110BD1649884211D1164C91
-S315080043002046FFF783FD2046FFF71AFC0028FAD15E
-S315080043102046FFF7D5FD2046FFF7E0FD0028FAD135
-S3150800432010BD0E498842FBD10B4C80342046FFF75E
-S315080043306DFD2046FFF704FC0028FAD12046FFF75A
-S31508004340BFFD2046FFF7CAFD0028FAD110BD0000C0
-S315080043500800034008000248800000100840024890
-S315080043602DE9F041104FFF21001D397000F098F833
-S3150800437006460025D7F8884005E014F8010B2844BE
-S31508004380C5B2FCF77EFA761EF7D201217970284667
-S31508004390391D00F08DF90020B870F8700820A7F8CC
-S315080043A08600BDE8F0810000E40A002070B5FCF73D
-S315080043B077FBF0B1114C0020012584F8820084F8BF
-S315080043C08150FF21217010216170A070FCF7E4F97B
-S315080043D0E070FCF7F1F92071FCF7EEF9000A60715C
-S315080043E0A571E5710820A4F88600BDE87040FDF7C0
-S315080043F059B9BDE87040102000F050B9E40A002011
-S3150800440070B50446FCF7C8F96178801E884201DA5F
-S31508004410222018E00E4DFF2028700120A5F88600FE
-S31508004420617859B1A21CD5F88800FDF73FF948B163
-S3150800443055F8880F61780844286070BDFDF724F99F
-S315080044400028FAD13120BDE8704000F027B90000F5
-S31508004450E40A002070B50446FCF79EF96178401E10
-S31508004460884204DABDE87040222000F017B9201D02
-S3150800447000F016F8094D01466B1CC5F888006278ED
-S315080044801846FCF708FAFF2005F8480B6178286CEF
-S31508004490084428646078401CE88770BDE40A002058
-S315080044A00178427841EA02218278C07841EA0241DD
-S315080044B041EA0060704700000548002100F8811FA6
-S315080044C0C0F80710C170A0F80510817041707047D8
-S315080044D0E40A0020034890F88100002800D0012053
-S315080044E070470000E40A00202DE9F04104460078F0
-S315080044F00127644DFF2812D095F8811001297CD137
-S315080045000021FF26F4283AD014DCD0287BD00ADC18
-S31508004510C9285FD0CC2872D0CF2871D199E020461F
-S31508004520FFF744FF90E0D1287DD0D2286FD0F3283A
-S3150800453066D12DE0F5380A2862D2DFE800F00524B6
-S315080045409090902D903A3C46FCF726F96278401EEA
-S31508004550904201DA222072E0681CD5F888104835A6
-S31508004560FCF799F905F8486D6178D5F8880008448C
-S31508004570C5F888006078401CA5F8860064E02046E7
-S31508004580FFF768FF60E02E70201DFFF789FF31E016
-S315080045902046FFF7E5FE57E02E703B48C5F8880031
-S315080045A06970A970E9700720291D00F081F80820B4
-S315080045B0E2E7002043E02E70697095F88200A87043
-S315080045C0E970297169710620D6E785F8811085F8A2
-S315080045D0821040E0FCF7E0F8411E621CD5F888001E
-S315080045E0FDF764F858B12E70FCF7D6F8D5F88810A0
-S315080045F0401E0844C5F8880024E041E003E02CE0AA
-S315080046002DE010E003E02046FFF7FAFE1CE02E70CE
-S3150800461069700C46A970FCF7BFF8E8702C716C71CC
-S31508004620AC710720A8E72046001DD5F88840FFF79B
-S3150800463037FF01462046FDF731F870B10BE000F070
-S315080046402DF801E0A5F8867095F88400012808D0B1
-S315080046500AE0FCF72FF92E70F4E73120EFE7202067
-S31508004660EDE7102000F01AF8B5F98610002907DDE5
-S3150800467085F88470BDE8F041024889B2FCF7E4B8D1
-S31508004680BDE8F081E40A0020FC6200080249002027
-S3150800469081F8840070470000E40A00200349FE22DE
-S315080046A00A7048700220A1F886007047E40A0020C4
-S315080046B00870020A4A70020C8A70000EC8707047A9
-S315080046C070B504460020E070401EE062204601F006
-S315080046D09CFB08B1042070BD04F22E2001F068FB93
-S315080046E0A0F52A41553901D0032070BD04F16600B2
-S315080046F001F053FB074DB5EB002F06D004F18200FD
-S3150800470001F04BFBB5EB002F01D1002070BD022054
-S3150800471070BD00000046415400E0401C02780AB112
-S315080047208A42FAD1D0B270474269891E921E8A42DD
-S3150800473001D800207047826A408901FB0020704733
-S315080047402DE9F05F8146884601F11A0001F030FB39
-S3150800475088BB98F80000012700F03F00401E00EBD8
-S315080047608001DFF85CA001EBC00400254FF6FF7B53
-S315080047701AF8051001EB080001F01AFB06466FB19E
-S31508004780FF2C18D201F02AF8074639F81400641CE1
-S3150800479001F024F887420ED1374601E05E450AD17A
-S315080047A06D1C0D2DE4D398F80000400606D52FB1F0
-S315080047B039F8140010B10020BDE8F09F0120FBE78E
-S315080047C0206400082DE9F04105680F00804606D0F0
-S315080047D001F0E2F9022809D20120BDE8F081EE686D
-S315080047E016B16869B04207D8012605E0411CF4D025
-S315080047F069698142F1D83E4634466869641CA0421C
-S3150800480002D80224022E0AD32146404601F0C4F9F2
-S3150800481038B10128E1D0411CDFD0B442EDD10020E7
-S31508004820DBE74FF0FF3632462146284601F03EFBCD
-S3150800483030B957B122463946284601F037FB20B130
-S3150800484001280FD001242046C7E7EC60D5E904010A
-S31508004850891E884201D2401E2861287940F001004D
-S315080048602871F0E73446EEE72DE9F35F0E68009805
-S3150800487000248846D0F828902546705D6D1C2028AF
-S3150800488013D32F2811D05C280FD0FF2C36D2012144
-S3150800489000F088FF070031D0802F12D2014663A0AE
-S315080048A0FFF73AFF50BB0CE06D1C715D2F29FBD05A
-S315080048B05C29F9D07219C8F80020202805D20426E8
-S315080048C00EE029F81470641CD7E7002608E009EB07
-S315080048D0440030F8020C202801D02E2802D1641E8C
-S315080048E0002CF4D1002129F814103CB100980B22B1
-S315080048F02021006A01F083FA002703E00620BDE8BC
-S31508004900FC9F7F1C39F817002028FAD02E28F8D0EB
-S315080049101FB146F0030600E0641E2CB109EB440003
-S3150800492030F8020C2E28F7D14FF0000AD0464FF087
-S31508004930080B39F817507F1C05B3202D03D02E2DF0
-S3150800494004D1A74202D046F00306F2E7DA4501D2BF
-S31508004950A74219D1BBF10B0F0ED0A74201D046F0E2
-S3150800496003060BD84FEA886027464FF0080A4FF02F
-S315080049700B0B4FEA1068DCE746F003060098006A5E
-S315080049800178E5292ED02FE0802D0CD3002128466A
-S3150800499000F008FF050003D02748284410F8805C7B
-S315080049A046F0020625B1294624A0FFF7B5FE18B140
-S315080049B05F2546F003060EE0A5F14100192802D846
-S315080049C048F0020807E0A5F16100192803D8203D40
-S315080049D048F00108ADB20098016A01F80A500AF1D8
-S315080049E0010AA6E705210170BBF1080F03D14FEABA
-S315080049F088604FEA1068C8F38100032803D06FEA7D
-S31508004A000801890701D146F00206B10709D408F062
-S31508004A100301012901D146F01006012801D146F00B
-S31508004A2008060098006AC672002068E7222A3A3CFF
-S31508004A303E3F7C7F00000000A06300082B2C3B3D16
-S31508004A405B5D000008B500210091814202D200BFDB
-S31508004A50491CF9E708BD2DE9F04704460021D0F8BE
-S31508004A60009000F03CFA002857D1FF254FF0FF3898
-S31508004A702F46C4F824804846A16901F0C6F9060005
-S31508004A804AD1E169087850B1CA7AE52802F03F02AE
-S31508004A90A27138D0130704D50F2A34D105E00426AD
-S31508004AA03AE00F2A01D0C5B11CE0A26A72B34306E8
-S31508004AB005D54F7B20F04000236905466362A8426E
-S31508004AC008D1487BB84205D11046FFF739FE08B130
-S31508004AD06D1E00E0FF25EDB218E0084601F0D7FA92
-S31508004AE0B84219D0206AC17AC9070CD1E1690B22EC
-S31508004AF010F8015B11F8013B5B1B521E02D0002B1C
-S31508004B00F6D000E043B1FF25C4F8248000212046F2
-S31508004B1000F005F80600AED03046BDE8F0872DE96E
-S31508004B20F047054604680069894600F12008A86927
-S31508004B3010B1B8F5001F02D30420BDE8F0875FEA7C
-S31508004B40C8515AD1401CA8616969002729B16089F2
-S31508004B50401E10EA582F05D04FE02189B1EB581FA7
-S31508004B601DD94AE0284601F017F8064601281AD941
-S31508004B70701C30D06069B04239D8B9F1000F0ED038
-S31508004B8028466969FFF71EFE06000AD0012E0AD0DC
-S31508004B90701C20D0204601F0CBFAE0B905E0AF61E1
-S31508004BA0CAE70720C9E70220C7E74FF400720021C9
-S31508004BB004F1300001F023F9002731462046FFF7BB
-S31508004BC0B3FD4FF00109E0620BE084F8039020463C
-S31508004BD001F0AEFA08B10120AFE7E06A401C7F1C7D
-S31508004BE0E0626089B842F0D8E06AC01BE0623146EC
-S31508004BF020466E61FFF798FDA861C8F308002044B7
-S31508004C003030C5F81080E861002096E72DE9F047B6
-S31508004C100426FF25884604462F46D0F8009045E02E
-S31508004C20484601F0F2F8060044D1E169087880B1F7
-S31508004C30CA7AE52802F03F02A27108D02E2806D0CB
-S31508004C4022F02003082B06D00023434505D0FF2574
-S31508004C501CE004262EE00123F7E70F2A01D00DBB3E
-S31508004C601BE0420605D54F7B20F040002269054629
-S31508004C706262A84208D1487BB84205D1A06A01F011
-S31508004C80DDF808B16D1E00E0FF25EDB200212046D3
-S31508004C90FFF745FF060009D00CE0084601F0F7F9D2
-S31508004CA0B84209D04FF0FF30606205E0A1690029DB
-S31508004CB0B6D10EB10020A0613046BDE8F0870000ED
-S31508004CC02DE9F04F85B0044600680390276AD4F8AA
-S31508004CD02880F87A10F0A00F03D0062005B0BDE8AA
-S31508004CE0F08F002500E06D1C38F815000028FAD171
-S31508004CF00C223946684601F079F89DF80B00C00782
-S31508004D0019D00020F8720126A06233464246694649
-S31508004D10384600F003FF2046FFF79DFE10B9761CC3
-S31508004D20642EF2D3642E10D00428D7D19DF80B0038
-S31508004D30F872C4F828809DF80B00800707D50D2067
-S31508004D400C35B5FBF0F6761C02E00720C6E701260F
-S31508004D5000212046276800F0C2F888B900253846A1
-S31508004D60A16901F052F858B9E1690978E5290AD02C
-S31508004D7049B1002501212046FFF7D1FE0028EED0D3
-S31508004D80042804D004E06D1CB54201D0F2E70720E0
-S31508004D905FEA000877D1761E5FEA060A59D02169CC
-S31508004DA0CAF1000001EB4011204600F098F85FEACE
-S31508004DB0000868D1206A01F06AF90490A16903988D
-S31508004DC001F023F85FEA00085DD1E669D4F828B057
-S31508004DD0049870730F20F0720020307301460AF0B1
-S31508004DE0FF0906F11A0001F04EF9A9F1010000EBDE
-S31508004DF0800101EBC008002701E0854203D03BF89B
-S31508004E00185008F1010821482946C05D304401F0D0
-S31508004E103AF90DB94FF6FF757F1C0D2F4FF6FF7047
-S31508004E20EBD3854202D03BF8180008B949F040098F
-S31508004E3086F8009003990120C87000212046FFF7E4
-S31508004E406EFE5FEA00081ED1AAF101005FEA000AB9
-S31508004E50B4D1A169039800F0D8FF5FEA000812D11F
-S31508004E6020220021E06900F0CAFFD4E907010B22DD
-S31508004E7000F0BCFF206AE169C07A00F018000873E8
-S31508004E8003990120C870404628E7000020640008FE
-S31508004E902DE9F041416A044606690568481C02D0B6
-S31508004EA0204600F01CF8002817D1E5274FF0010826
-S31508004EB02846A16900F0A9FF60B9E1690F7085F875
-S31508004EC003802169B14208D200212046FFF727FE58
-S31508004ED00028EDD0042800D10220BDE8F0812DE994
-S31508004EE0F04107680D460646B1F5001F36D2E806BA
-S31508004EF034D13561B46824B93878032805D37C6A77
-S31508004F001CB178894FEA402812E03889B0EB551F62
-S31508004F1024D9786A12E0304600F03EFE0446401C6A
-S31508004F201AD0022C1AD37869A04217D9A5EB08051E
-S31508004F3045452146EFD23846FFF7F6FBC6E9054058
-S31508004F4060B100EB5520B061C5F308003844303035
-S31508004F50F0610020BDE8F0810120FBE70220F9E7B7
-S31508004F6010B504460548FCF75CFD0CB1032010BDDE
-S31508004F700248FCF76CFD0249085C10BDA801002038
-S31508004F801862000810B508B1042010BD0248FCF7E5
-S31508004F9068FD0249085C10BDA80100201C620008D3
-S31508004FA010B508B1042010BD002BFBD0DBB20348B6
-S31508004FB0FCF76AFE0249085C10BD0000A801002043
-S31508004FC01C62000810B508B1032010BD0248FCF7A2
-S31508004FD01FFD0249085C10BDA801002018620008E0
-S31508004FE010B508B1042010BD002BFBD0DBB2034876
-S31508004FF0FEF724F80249085C10BD0000A80100204D
-S315080050001C62000838B5044600F07CFA002807D16F
-S315080050106946204601F0B5F8002801D10021216033
-S3150800502038BD2DE9FC4100259046074604464E1E2C
-S3150800503011E001AB01226946404600F0A2F9019849
-S3150800504001280AD19DF800000D2804D06D1C04F82B
-S31508005050010B0A2801D0B542EBDB0020207015B100
-S315080050603846BDE8FC810020FBE72DE9F84F0D46E0
-S315080050700446694601F085F85FEA000872D1607C4B
-S31508005080B0F100086ED1E068A84203D2217C8907F6
-S3150800509000D40546002760694FF0010967610DB322
-S315080050A000994FF0020A49894E0268B1691E401EEE
-S315080050B0B1FBF6F1B0FBF6F2914205D3711E8843B7
-S315080050C060612D1AA1690CE0A16849B90021204642
-S315080050D0FFF778FB014601283FD0481C4FD0A16056
-S315080050E0A161D1B926E0207C8007204605D5FFF7C7
-S315080050F069FB010004D1354611E000F04DFD01467B
-S31508005100481C3CD0012928D900984069884224D9EE
-S31508005110A1616069AD1B30446061B542E3D860693E
-S3150800512028446061E80505D00098FFF7FDFAA0B1AC
-S3150800513000EB5527A08AC00526D0E269BA4223D0DB
-S31508005140207C04F12805400611D50098012329463C
-S315080051504078FFF745FF90B905E084F811A00220D2
-S31508005160BDE8F88F19E0207C20F0400020740098F4
-S3150800517001233A4640782946FFF712FF18B184F80A
-S3150800518011900120ECE7E761E1686069884204D97B
-S31508005190E060207C40F0200020744046E0E70000F4
-S315080051A017B581B0144602980090684600F0C4FD11
-S315080051B0002802DA0B2004B010BD0B4B002253F86E
-S315080051C0201001B10A700199002900D00A7043F82D
-S315080051D0201001D0012C01D00020ECE7002201A903
-S315080051E002A800F03BFBE6E7140200202DE9F7438E
-S315080051F090B005000DD04FF0000802F01F063246A9
-S3150800520001A911A8C5F8008000F028FB040004D005
-S315080052108DE0092013B0BDE8F083019802900DA82F
-S315080052200A9044480C9002A8119900F03BFC04002F
-S3150800523004D10A98C07A000600D5062416F01C0F79
-S315080052404AD04CB1042C03D102A8FFF739FD044615
-S3150800525046F008064CB16AE09DF80E0010F0110FF2
-S3150800526045D1700701D5082461E0300745D5324F8E
-S31508005270099839460E3000F0FEFE09983946163070
-S3150800528000F0F9FE09992020C8720999019800F0E2
-S3150800529071FD074600220999019800F0D8FE099881
-S315080052A000211C3000F0E7FE01980121C17017B3F8
-S315080052B0D0F82C900022394602A800F08FFE040090
-S315080052C035D14946019800F0A0FD04000198A7F1E0
-S315080052D00107C7600DD02AE04CBB9DF80E00C10639
-S315080052E001D5042423E0B10703D5C00701D007245C
-S315080052F01DE0300701D546F020060198C16A2962EB
-S3150800530009996962099900F035FDA86009981C3069
-S3150800531000F043FDE86085F81180C5F81480C5F8EB
-S315080053201C802E74019828600198C088A8802046A1
-S3150800533070E700003A1400200000614810B596B0E6
-S3150800534004460020CDE90210049003E002A8641C7C
-S3150800535000F021FE21780029F8D1039800280DDBFA
-S31508005360024601AB05A9029800F064F930B9019923
-S315080053700398884202D1049816B010BD4FF0FF304A
-S31508005380FAE72DE9FC5F8946002119609A46164618
-S315080053900446694600F0F5FE002812D1607C002814
-S315080053A00FD1207CC0070BD06169E0684FF0010B74
-S315080053B0401A04F12801019186427BD9064679E014
-S315080053C00720BDE8FC9F6069C1055BD10099498942
-S315080053D0491E11EA502709D1F8B12046A16900F003
-S315080053E0DBFB02281BD3411C46D0A061A1690098AB
-S315080053F0FFF79AF998B100EB0708750A23D00098C9
-S315080054007A1941898A4200D9CD1B40782B464246F3
-S315080054104946FFF7C5FD78BB04E0A068E1E702202E
-S315080054206074CEE7207C40060BD5E169A1EB080045
-S31508005430A84206D209EB40204FF40072019900F009
-S31508005440D5FC6D022CE0E269424519D0207C400665
-S315080054500AD50098012301994078FFF7C1FD58B98C
-S31508005460207C20F0400020740098012342464078B2
-S315080054700199FFF795FD18B184F811B00120A0E74E
-S31508005480C4F81C80A08AC0F30800C0F50075B542B0
-S3150800549000D9354601192A464846283100F0A6FCA7
-S315080054A06069A94428446061DAF800004119761B4E
-S315080054B0CAF80010002E86D1002082E733B58FB0D7
-S315080054C00D46002269460FA800F0C8F9040014D159
-S315080054D00BA808900A480A9068460F9900F0E2FA65
-S315080054E004000AD10898C07A000601D5062404E00B
-S315080054F01DB12946684600F0AEFB11B0204630BD06
-S315080055003A140020F8B50446694600F03AFE002829
-S315080055100ED1217C8A060BD548060ED50098E2697D
-S315080055200123407804F12801FFF75AFD08B101204C
-S31508005530F8BD207C20F040002074154E216A0098A2
-S3150800554000F063FC0028F3D1656A2946E87A40F042
-S315080055502000E872A268206800F079FD05F11C00B9
-S31508005560E16800F088FD314605F1160000F083FD7C
-S31508005570002105F1120000F086FD00980121C17096
-S3150800558000F092FD217C21F020012174F8BD000075
-S315080055900000614811B59BB0022201A91BA800F0C2
-S315080055A05DF90199029100280ED118A80A902048A1
-S315080055B00C9002A81B9900F075FA002804D10A98E5
-S315080055C0C07A000602D506201CB010BD9DF80E0054
-S315080055D0C0072BD10999019800F0CCFB04469DF829
-S315080055E00E00C00611D501980D9000210F940DA844
-S315080055F0FFF775FC0028E7D100210DA8FFF706FB89
-S31508005600A0B1042801D00028DED102A8FFF740FC8B
-S315080056100028D9D134B10022214602A800F0DEFCC8
-S315080056200028D1D1019800F03FFDCDE70720CBE750
-S315080056303A1400202DE9FC5F8946002119609A4634
-S3150800564016460446694600F09CFD002806D1607C93
-S31508005650002803D1207C800702D40720BDE8FC9FE0
-S31508005660606904F1280182194FF0010B0191824209
-S3150800567000D2C6438DE06069C10569D100994989A0
-S31508005680491E11EA502512D108B1A16902E0A068A5
-S3150800569028B900212046FFF795F800287CD0012874
-S315080056A02BD0411C4ED0A061A16801B9A060207C16
-S315080056B040060BD50098E269012340780199FFF767
-S315080056C08FFC78BB207C20F040002074A1690098EC
-S315080056D0FFF72AF888B100EB0508770A23D0009966
-S315080056E0EA194889824200D9471B48783B46424610
-S315080056F04946FFF775FCA8B902E002206074ADE7D9
-S31508005700E169A1EB0800B8420AD209EB40214FF43F
-S315080057100072019800F06AFB207C20F0400020749B
-S315080057207D0227E00EE0E16941450FD0E168606936
-S3150800573088420BD200980123424640780199FFF728
-S315080057402FFC18B184F811B0012087E7C4F81C8033
-S31508005750A08AC0F30800C0F50075B54200D93546E1
-S3150800576020442A464946283000F040FB207C40F079
-S31508005770400020746069A94428446061E168884251
-S3150800578000D80846E060DAF800004119761BCAF826
-S315080057900010002E7FF46FAF207C40F020002074AC
-S315080057A000205BE7802804D30B4A51B1FF2801D9B2
-S315080057B00020704702EB4000A0F58050B0F8000FBB
-S315080057C0704732F81130834203D0491C89B28029C8
-S315080057D0F7D38031C8B270472E64000830B5B0F5EB
-S315080057E0805F01D21B4900E01B4931F8022B002AD1
-S315080057F015D0904213D331F8023B1C0ADDB252FA97
-S3150800580083F3834221D9092C09D2DFE804F005097C
-S315080058100E11131517191B00801A31F8100030BD28
-S31508005820811A01F00101401A00E0103880B230BD3B
-S315080058302038FBE73038F9E71A38F7E70830F5E794
-S315080058405038F3E7A0F5E350F0E7002CCDD101EB93
-S315080058504501CAE72E650008206700082DE9FF41C3
-S31508005860002790460E460F6000F066FA050003D53D
-S315080058700B2004B0BDE8F081874850F825409CB15C
-S315080058803460207828F0010620B16078FFF79AFB8B
-S31508005890C1070BD02770E8B2B8466070FFF760FB07
-S315080058A0C10708D00320E4E70C20E2E70EB1400761
-S315080058B004D40020DDE71EB1400701D50A20D8E749
-S315080058C0002529462046FEF7FBFE022820D16E4613
-S315080058D004EB051090F8F21100F5F77019B10830CD
-S315080058E000F05BFA00E0002046F825006D1C042D48
-S315080058F0EED3002756F8275025B129462046FEF74D
-S31508005900DFFE00E00320022802D37F1C042FF1D318
-S31508005910042809D002286CD204F13B0000F048FAAA
-S31508005920B0F5007F65D101E00120A2E704F1460049
-S3150800593000F03EFA18B904F1540000F02EFAA061FE
-S3150800594094F84070A770012F01D0022F51D1474318
-S3150800595094F83D006081E8B3411E084249D104F13C
-S31508005960410000F025FA2081000742D104F14300E6
-S3150800597000F01EFA060004D104F1500000F00DFAFA
-S31508005980064604F13E0000F013FA010031D02389DF
-S31508005990C81900EB131296422BD3B01A6689B0FBCE
-S315080059A0F6F0B8B1012640F6F67C604500D302262B
-S315080059B04FF6F67C604500D30326801C2A44A26273
-S315080059C029446061C4E90751032E14D013B1394440
-S315080059D0616200E00DE0022E1ED000F0010100EB2E
-S315080059E0400001EB5000A16900F2FF10B1EB502F07
-S315080059F014D20D203DE704F15A0000F0D9F9002829
-S31508005A00F7D120890028F4D104F15C0000F0C5F92B
-S31508005A10606260698000E6E74000E4E74FF0FF3027
-S31508005A202061E06080202071032E2CD104F16000F3
-S31508005A3000F0BEF9012826D1691C204600F0E5F9D8
-S31508005A4008BB84F8048004F22E2000F0B1F9A0F512
-S31508005A502A41553917D104F1300000F09EF90F4953
-S31508005A60884210D104F5057000F097F90C49884270
-S31508005A7009D104F5067000F090F9206104F5077065
-S31508005A8000F08BF9E06004492670091F0888401C5D
-S31508005A900880E0800DE700001402002052526141A0
-S31508005AA07272416173B504460568019801E0401CAD
-S31508005AB0019001782F29FAD05C29F8D00021A1603D
-S31508005AC001980078202807D2216A8020C872002110
-S31508005AD02046FFF704FA7CBD01A92046FEF7C4FE5E
-S31508005AE00028F8D12046FEF7B6FF216AC97A28B100
-S31508005AF00428F0D14907EED405207CBD4907FCD41B
-S31508005B00A079C006F8D5208AC0F3080041192846AE
-S31508005B10303100F02FF9A060DEE700007CB51646AC
-S31508005B201C4605460B2200F061F9052C11D9194AC5
-S31508005B300CE00021B61C2346044663F35F044008C4
-S31508005B40E30300D55440491C1029F4D330880028B3
-S31508005B50EFD107216B4604F00F003030392800D901
-S31508005B60C01D5854491E2409F5D17E2058540022D8
-S31508005B7000E0521C8A4202D2A85C2028F9D10829E2
-S31508005B8002D2585C491C00E02020A854521C082A5E
-S31508005B90F5D37CBD211001002DE9F04104680D46BE
-S31508005BA002290BD36069A84208D920784FF0FF363E
-S31508005BB0012807D002282BD0032839D001263046E1
-S31508005BC0BDE8F081206A05EB550700EB5721204612
-S31508005BD000F01BF90028F2D1C7F3080020447F1C07
-S31508005BE090F83080206A00EB5721204600F00DF926
-S31508005BF00028E4D1C7F30800204490F8301048EA9A
-S31508005C000120E90701D00609D9E7C0F30B06D6E754
-S31508005C10206A00EB1521204600F0F7F80028CED1BF
-S31508005C20E8B204EB4000303000F0C2F80646C6E79A
-S31508005C30206A00EBD511204600F0E7F80028BED10F
-S31508005C4040F2FF1000EA85002044303000F0A5F845
-S31508005C5020F07046B3E72DE9F0474FF000090546F6
-S31508005C6081F8169080690C46002863D0686A401C43
-S31508005C7014D00026AF6A0AE00021FFF793FD08B1A9
-S31508005C80FF2E01D3002606E0A119761C887537F881
-S31508005C90020B0028F0D1A11981F816900020A17DE9
-S31508005CA002464FF02E0CEB691B5C401C202B22D0C1
-S31508005CB0052B00D1E523092807D111B9A61886F8BE
-S31508005CC016C0A618521C86F809C0A618737289B998
-S31508005CD0A3F14107192F0CD8EF69092897F80C800A
-S31508005CE001D3102700E0082718EA070F01D0203350
-S31508005CF0DBB2B375521C0B28D5D331B9A11881F87C
-S31508005D001690E869007B00B90022A11881F809906D
-S31508005D10E869C07A2072E8691C3000F03EF8206015
-S31508005D20E869183000F044F8A080E869163000F0F9
-S31508005D303FF8E080BDE8F08710B503464FF0FF3026
-S31508005D401C68002C13D0214600E0491C0A78202A3A
-S31508005D500ED33A2AF9D114F8012B303A0A2A06D278
-S31508005D608C4204D1002A02D1491C1046196010BD84
-S31508005D70002010BD70B506460D4601F11A0000F068
-S31508005D8017F804463078032805D105F1140000F009
-S31508005D900FF844EA0044204670BDC178827842EA8A
-S31508005DA001214278007842EA012140EA0120704741
-S31508005DB04178007840EA0120704708B500208DF840
-S31508005DC00000FBF7FFFBFDF763F9FAF7CBFB694623
-S31508005DD00020FDF775F99DF80000012801D1FAF7B2
-S31508005DE0D7FCFBF769FCFAF7CEFBFCE7002A05D0DF
-S31508005DF011F8013B00F8013B521EF9D17047C9B2B0
-S31508005E0000F8011B521EFBD1704770B50446C06AE4
-S31508005E100E460025B0420FD0204600F089F905004D
-S31508005E200AD160780123324604F13001FFF7B8F849
-S31508005E3008B16E1E0125E662284670BD2DE9F047B9
-S31508005E4080460F4601F11A00FFF7B2FF20BB3878EB
-S31508005E50012600F03F00401E00EB8001DFF8489065
-S31508005E6001EBC00400254FF6FF7A19F805003844FF
-S31508005E70FFF79EFF36B1FF2C0ED228F8140006460F
-S31508005E80641C01E0504507D16D1C0D2DEDD3387803
-S31508005E90400607D5FF2C02D30020BDE8F087002175
-S31508005EA028F814100120F8E7206400082DE9F047C7
-S31508005EB0022617460D460446022969D36069A84298
-S31508005EC066D920784FF00109012804D0022836D077
-S31508005ED003285DD143E0216A05EB550801EB5821FB
-S31508005EE02046FFF792FF060052D1C8F30800204467
-S31508005EF0303008F10108E90704D00178FAB262F3F4
-S31508005F001F1100E03946017084F80390216A204683
-S31508005F1001EB5821FFF779FF060039D1C8F30800CD
-S31508005F2020443030E90702D0C7F3071105E00178AD
-S31508005F30C7F3032201F0F0011143017026E0206A3D
-S31508005F4000EB15212046FFF760FF060020D1E8B2D6
-S31508005F5004EB4000B9B2303000F095F816E0206A3C
-S31508005F6000EBD5112046FFF750FF060010D140F28E
-S31508005F70FF1000EA8500204430300546FFF70DFF84
-S31508005F8067F31B000146284600F075F884F803906D
-S31508005F903046BDE8F087F8B50E4604460A2902D110
-S31508005FA00D21FFF7F8FF6568002D16DB60196D1CDB
-S31508005FB006733D2D0DDB6B462A4604F10C0120685D
-S31508005FC0FFF738FB0098A84201D1002501E04FF001
-S31508005FD0FF356560A068401CA060F8BD2DE9F0415A
-S31508005FE0046813460E46074602292CD36069B04258
-S31508005FF029D93BB14FF0FF3219462046FFF756FF25
-S3150800600000281ED131463846FFF7C6FD050017D0D1
-S31508006010012D18D0681C18D0002231462046FFF7FB
-S3150800602045FF00280DD12069411C05D0401C206180
-S31508006030207940F00100207160692E46B042E1D80F
-S315080060400020BDE8F0810220FBE70120F9E770B5E2
-S315080060500C460646154691B204F11A0000F013F8EC
-S315080060603078032806D1290C04F11400BDE87040E5
-S3150800607000F009B870BD0170090A4170090A8170FB
-S31508006080090AC17070470170090A417070470146D4
-S3150800609000200B22430803EBC01011F8013B521EE7
-S315080060A01844C0B2F6D1704770B5044600F040F8FF
-S315080060B0050036D1207803282CD12079012829D14A
-S315080060C0420204F1300000210646FFF798FE4AF620
-S315080060D0552104F22E20FFF7D6FF13493046FFF765
-S315080060E0CAFF124904F50570FFF7C5FF04F50670E7
-S315080060F02169FFF7C0FF04F50770E168FFF7BBFFEA
-S31508006100E2690123521CE26260783146FEF768FFB5
-S3150800611000202071002260781146FEF733FF00B197
-S315080061200125284670BD00005252614172724161D4
-S315080061302DE9F0410446C0780027F8B1E66A04F173
-S3150800614030016078012332468846FEF749FF08B1D8
-S31508006150012713E00020E070206AA169301A8842FE
-S315080061600CD2A57808E0A069012306446078324677
-S315080061704146FEF735FF6D1E022DF4D23846BDE8BE
-S31508006180F08170B50D4604000CD0206850B1017836
-S3150800619041B1C188A288914204D14078FEF712FF26
-S315080061A0C00703D000202860092070BD2068286039
-S315080061B0002070BD10B500290AD00878002807D03D
-S315080061C005487844FAF73EF9002801D0002010BDAA
-S315080061D00248784410BD00003A0600003206000066
-S315080061E04FF04070E1EE100A70472F64656D6F70CE
-S315080061F0726F675F786D63343730302E73726563FC
-S31508006200000000003002010100000100000000004B
-S31508006210000001000201010100010204000102035D
-S3150800622004000000800000000000010001000000DA
-S3150800623001000000800000000000010001000000CD
-S3150800624001000000800000000000010001000000BD
-S3150800625001000000800000000000010001000000AD
-S31508006260010000008000000000000100010000009D
-S31508006270010000008000000000000100010000008D
-S3150800628001000000000009021A0300043A061B0771
-S315080062901A080909090A1B0C1A0D000F1A103A11D7
-S315080062A03A123A183A193A1B1A1C1A1D3A1E1A209B
-S315080062B01A211B263A2A1A373A381A063A0D3A1676
-S315080062C01A1702291A2A3A3312011B051B063A081D
-S315080062D01A231A24000000002000000040000000D5
-S315080062E08000000000010000000200000004000019
-S315080062F00008000000100000002000004F70656EC6
-S31508006300424C540000C0000C00400000030000008E
-S315080063100000010C00400000040000000040010CD1
-S3150800632000400000050000000080010C004000004D
-S315080063300600000000C0010C004000000700000035
-S315080063400000020C00000200080000000000040C17
-S3150800635000000400090000000000080C000004000A
-S315080063600A00000000000C0C000004000B000000EE
-S315080063700000100C000004000C0000000000140CC3
-S31508006380000004000D0000000000180C00000400C6
-S315080063900E00000000001C0C000004000F000000A6
-S315080063A0809A45418E418F804545454949498E8F9A
-S315080063B09092924F994F555559999A9B9C9D9E9F9D
-S315080063C041494F55A5A5A6A7A8A9AAABACADAEAF9E
-S315080063D0B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF37
-S315080063E0C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF27
-S315080063F0D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF17
-S31508006400E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF06
-S31508006410F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFF6
-S3150800642001030507090E10121416181C1E00C700D2
-S31508006430FC00E900E200E400E000E500E700EA000D
-S31508006440EB00E800EF00EE00EC00C400C500C90050
-S31508006450E600C600F400F600F200FB00F900FF00B3
-S31508006460D600DC00A200A300A500A7209201E10047
-S31508006470ED00F300FA00F100D100AA00BA00BF004F
-S315080064801023AC00BD00BC00A100AB00BB009125E9
-S31508006490922593250225242561256225562555250D
-S315080064A06325512557255D255C255B251025142573
-S315080064B034252C251C2500253C255E255F255A25D7
-S315080064C0542569256625602550256C256725682588
-S315080064D06425652559255825522553256B256A2592
-S315080064E018250C25882584258C2590258025B1031B
-S315080064F0DF009303C003A303C303B500C403A603C5
-S315080065009803A903B4031E22C603B50329226122F0
-S31508006510B1006522642220232123F7004822B00017
-S315080065201922B7001A227F20B200A025A000610018
-S315080065301A03E0001703F8000703FF0001007801BB
-S315080065400001300132010601390110014A012E010C
-S315080065507901060180014D00430281018201820111
-S315080065608401840186018701870189018A018B01DB
-S315080065708B018D018E018F0190019101910193018B
-S315080065809401F60196019701980198013D029B0135
-S315080065909C019D0120029F01A001A001A201A20168
-S315080065A0A401A401A601A701A701A901AA01AB019B
-S315080065B0AC01AC01AE01AF01AF01B101B201B3014B
-S315080065C0B301B501B501B701B801B801BA01BB01FC
-S315080065D0BC01BC01BE01F701C001C101C201C30172
-S315080065E0C401C501C401C701C801C701CA01CB015D
-S315080065F0CA01CD011001DD0101008E01DE01120183
-S31508006600F3010300F101F401F401F8012801220263
-S3150800661012013A020900652C3B023B023D02662C38
-S315080066203F0240024102410246020A01530240006B
-S3150800663081018601550289018A0158028F015A0291
-S3150800664090015C025D025E025F02930161026202D2
-S3150800665094016402650266026702970196016A025E
-S31508006660622C6C026D026E029C01700271029D0121
-S31508006670730274029F0176027702780279027A021F
-S315080066807B027C02642C7E027F02A60181028202C2
-S31508006690A9018402850286028702AE014402B1017D
-S315080066A0B20145028D028E028F0290029102B70155
-S315080066B07B030300FD03FE03FF03AC03040086030C
-S315080066C0880389038A03B1031103C2030200A303E3
-S315080066D0A303C4030803CC0303008C038E038F03B0
-S315080066E0D8031801F2030A00F903F303F403F503C8
-S315080066F0F603F703F703F903FA03FA033004200352
-S3150800670050041007600422018A043601C1040E01F0
-S31508006710CF040100C004D00444016105260400002A
-S315080067207D1D0100632C001E9601A01E5A01001F44
-S315080067300806101F0606201F0806301F0806401FF9
-S315080067400606511F0700591F521F5B1F541F5D1F66
-S31508006750561F5F1F601F0806701F0E00BA1FBB1F5B
-S31508006760C81FC91FCA1FCB1FDA1FDB1FF81FF91F57
-S31508006770EA1FEB1FFA1FFB1F801F0806901F08065B
-S31508006780A01F0806B01F0400B81FB91FB21FBC1F00
-S31508006790CC1F0100C31FD01F0206E01F0206E51F1B
-S315080067A00100EC1FF21F0100FC1F4E2101003221DF
-S315080067B070211002842101008321D0241A05302C6F
-S315080067C02F04602C0201672C0601752C0201802C0F
-S315080067D06401002D260841FF1A0300000C69000811
-S315080067E040010020D80000003C020008E4690008C7
-S315080067F01802002084140000580200081001000046
-S3150800680043000000F8FFFFFF004040404040404082
-S315080068104040414141414140404040404040404065
-S315080068204040404040404040400502020202020209
-S315080068300202020202020202022020202020202058
-S31508006840202020020202020202029090909090906C
-S31508006850101010101010101010101010101010102A
-S31508006860101010100202020202028888888888889E
-S31508006870080808080808080808080808080808088A
-S315080068800808080802020202400000000000000092
-S3150800689000000000000000000000000000000000EA
-S315080068A000000000000000000000000000000000DA
-S315080068B000000000000000000000000000000000CA
-S315080068C000000000000000000000000000000000BA
-S315080068D000000000000000000000000000000000AA
-S315080068E0000000000000000000000000000000009A
-S315080068F0000000000000000000000000000000008A
-S315080069000000000000000000000000000000000079
-S315080069100000000000C00148000000000000000060
-S315080069203F0000000000000000000000000000001A
-S315080069300000000000000000000000000000000049
-S315080069400000000000000000000000000000000039
-S315080069500000000000000000000000000000000029
-S315080069600000000000000000000000000000000019
-S31508006970000000004801002051190008030000002B
-S3150800698000000000000000000000000000000000F9
-S3150800699004000000000000000000000000000000E5
-S315080069A000420148004301480044014800450148A7
-S315080069B000460148004701480000000000000000AA
-S315080069C0000003400002034000000248000202489B
-S315080069D00040024800420248000000000000000093
-S309080069E000000000A5
+S315080002700B6070471FB503F0A9FE1FBD10B510BD72
+S31508000280DFF80CD0FFF7F6FF03F01EF800F027FAA8
+S315080002900088FE1F03B4FFF7F1FF03BC00F02AFA3B
+S315080002A0DFF80CD00348804703480047FEE7000004
+S315080002B00088FE1FBD140008010200083C4870476C
+S315080002C03B48123070473A483230704730B41446CB
+S315080002D0012902D0012030BC70472178C1F34111B1
+S315080002E0022905D16178012902D1A188072901D0FF
+S315080002F00020F0E72E4901F15302B1F85B302146A0
+S3150800030030BC03F0D5BA70B5044600F027F8294882
+S31508000310294D1CB1042C06D3002070BD00680122AB
+S315080003200088688012E050F82440204600F0F0F873
+S31508000330C2B21F2A00D91F22002105E0605C05EB26
+S315080003404103491C5880C9B29142F7D3022000EBF9
+S31508000350420040F440702880174870BD78B51548AB
+S31508000360002124380278002A21D1012202700022B5
+S31508000370124E6C46451CB05C03098DF8003000F03F
+S315080003800F008DF801000020235C0A2B01D23033C0
+S3150800039000E037336B54491C401CC0B2C9B202286E
+S315080003A0F2D3521CD2B2102AE5D30020685478BD85
+S315080003B04E400008DC01002030020020C4FF032064
+S315080003C010B5002003F0A2FA00F0BAF94FF4FA616A
+S315080003D0884204D2BDE81040084600F0CFB910BDE7
+S315080003E003F086BA13B504469DF804003F2803D9DE
+S315080003F075213BA000F084F9012101A800F059F805
+S31508000400012803D0792136A000F07AF99DF8041066
+S31508000410204600F04EF89DF80410884203D07C214F
+S315080004202FA000F06DF9002003F074FB1CBD2DE928
+S31508000430F04180460F46002002F01AFC0021481EB3
+S3150800044003F0A4FA304C314D0026607838B1207894
+S315080004502844401C00F032F801280DD01DE02B4836
+S3150800046000F02CF8012818D12878401E3E2814D808
+S3150800047001206070267010E02078401CC2B22270FD
+S315080004802878904209D1691C404600F000FA667047
+S31508000490207838700120BDE8F0810020FBE70120B4
+S315080004A001F048B8002001F045B801F044B801F061
+S315080004B043B80A460146002003F04CBB70B5054612
+S315080004C00024204603F01AFB38B1294601220020F1
+S315080004D003F02CFB012800D10124204670BD000042
+S315080004E02E2E5C2E2E5C2E2E5C2E2E5C536F757275
+S315080004F063655C41524D434D345F584D43345C75DA
+S3150800050073622E63000000002C020020CC0E00202F
+S3150800051010B5431C02E010F8011B71B18107FAD12E
+S315080005204FF0013202C88C1A8C4314EAC211F9D072
+S31508000530C01A0A0603D0C01E10BDC01A10BD0A0490
+S3150800054001D0801E10BD0902FCD0401E10BD032A32
+S3150800055040F2308010F0030C00F0158011F8013BD2
+S31508000560BCF1020F624498BF11F801CB00F8013BB9
+S3150800057038BF11F8013BA2F1040298BF00F801CB7D
+S3150800058038BF00F8013B11F0030300F02580083A54
+S31508000590C0F0088051F8043B083A51F804CBA0E8AB
+S315080005A00810F5E7121D5CBF51F8043B40F8043B00
+S315080005B0AFF30080D20724BF11F8013B11F801CB35
+S315080005C048BF11F8012B24BF00F8013B00F801CB06
+S315080005D048BF00F8012B704710B5203AC0F00B80D1
+S315080005E0B1E81850203AA0E81850B1E81850A0E829
+S315080005F01850BFF4F5AF5FEA027C24BFB1E8185083
+S31508000600A0E8185044BF18C918C0BDE810405FEAF2
+S31508000610827C24BF51F8043B40F8043B08BF70476E
+S31508000620D20728BF31F8023B48BF11F8012B28BF73
+S3150800063020F8023B48BF00F8012B704702F0FF0381
+S3150800064043EA032242EA024200F002B84FF00002EF
+S315080006500429C0F0128010F0030C00F01B80CCF1C6
+S31508000660040CBCF1020F18BF00F8012BA8BF20F834
+S31508000670022BA1EB0C0100F00DB85FEAC17C24BF88
+S3150800068000F8012B00F8012B48BF00F8012B704732
+S315080006904FF0000200B5134694469646203922BF0D
+S315080006A0A0E80C50A0E80C50B1F12001BFF4F7AF58
+S315080006B0090728BFA0E80C5048BF0CC05DF804EB3A
+S315080006C0890028BF40F8042B08BF704748BF20F8A8
+S315080006D0022B11F0804F18BF00F8012B704710B598
+S315080006E00446AFF300802046BDE81040FFF7D2BDB0
+S315080006F07047000001491820ABBEFEE7260002003D
+S3150800070000F0BBF8FCE7000010B500F087F80128F8
+S3150800071012D00A4C207801280ED100F0DDFED4E96B
+S315080007200112114401F5FA71884205D300202070A0
+S31508000730BDE8104000F0BAB810BD0000180200204D
+S31508000740014840687047000018020020044910B5A7
+S315080007500120087000F006F8BDE81040FFF7D4BF86
+S315080007601802002010B5044C2078012802D100F0A8
+S31508000770B3FEA06010BD00001802002001494860C1
+S31508000780704700001802002010B500F07AF800F053
+S315080007906FF800F0A9FE00F077FB00F033F8BDE82B
+S315080007A01040FFF7D3BF10B500F067F800F0B6FEAB
+S315080007B000F03CF8BDE81040FFF7A6BFFFF7D2BF30
+S315080007C0FFF70EBE0648007818B1012803D00228A4
+S315080007D003D081207047082070473F2070470000EB
+S315080007E0240200200648007818B1012803D0022800
+S315080007F003D081207047082070473F2070470000CB
+S315080008002402002010B501F043FCFFF7D9FD024988
+S315080008100220087010BD00002402002010B5002434
+S3150800082001F044FC00B10124204610BD08B5694614
+S315080008300648FFF7FCFD012807D105490220087084
+S315080008409DF80010014801F03BFC08BDB4050020E6
+S3150800085024020020054A10B51278022A02D1C9B22C
+S31508000860FFF7C0FDBDE8104001F0FCBC24020020E3
+S31508000870AFF30080642000F0D5BAAFF3008000F033
+S31508000880D7BAAFF3008072B6704762B6704770B5D4
+S3150800089016460D46044605E015F8010B04F8010B4B
+S315080008A0FFF7EBFF761EB6B2F6D270BD10B500F0B4
+S315080008B0EDFA90B100F01AF878B1FFF781FF00F071
+S315080008C025FE00F0DFFA074908400749086000F0EE
+S315080008D0D9FA4468FFF7D9FFA047BDE81040FFF7EB
+S315080008E06DBF000080FFFF1F08ED00E0054810B54A
+S315080008F0406A400B10F0010002D000F08BFA01208C
+S3150800090010BD0000008F02482DE9F0470446006834
+S315080009104FEA91281F4616460D464FEA8828401C7E
+S3150800092005D14146204600F031F9002825D0216836
+S315080009304046414505D00146204600F037F90400F7
+S315080009401DD020684FF48069281A051908F58068B3
+S315080009502D1DFFF792FF281B001F484506D3414669
+S31508000960204600F023F9040009D0251D16F8010BCE
+S3150800097005F8010B7F1EECD10120BDE8F0870020A9
+S31508000980FBE700000A4810B50068401C04D0084878
+S3150800099000F07EF9002809D006480068401C04D0FB
+S315080009A0044800F075F9002800D0012010BD0000A9
+S315080009B0C80A0020C40600202DE9F0410246002698
+S315080009C01848314601EB410300EB83031B7A934237
+S315080009D021D101EB410150F8215000EB8100476815
+S315080009E045EA0700800704D040F24E310EA0FFF713
+S315080009F087FE012600240AE014F0FF0F01D1FFF755
+S31508000A003CFF286808B1002609E0641C2D1DB4EBDC
+S31508000A10970FF1D303E0491CC9B20D29D2D330464A
+S31508000A20BDE8F081B84100082E2E5C2E2E5C2E2ED5
+S31508000A305C2E2E5C536F757263655C41524D434D57
+S31508000A40345F584D43345C666C6173682E630000EE
+S31508000A5070B50D4600F0CAF804460C48011B681E1E
+S31508000A60814211D3204600F063F806466019401EFD
+S31508000A7000F05EF80146FF2E06D0FF2904D0304666
+S31508000A80BDE8704000F004B8002070BDFFFF1F0CE1
+S31508000A902DE9F041884640453ED803283CD3B8F1B5
+S31508000AA00F0F39D80546214F3BE0FFF7E6FE4FF01A
+S31508000AB0FF360024FFF7E1FE04EB440007EB800055
+S31508000AC0017AA94204D104EB440057F8206003E0F8
+S31508000AD0641CE4B20D2CEDD3701C1ED02846FFF71B
+S31508000AE06BFFE0B900F0F8FC41F6C811441830462F
+S31508000AF000F024FD05E000F0EFFCA0420CD8FFF75B
+S31508000B00BCFE00F02BFDC0F300000028F3D100F076
+S31508000B1025FD30F0200002D00020BDE8F0816D1CD4
+S31508000B20EDB24545C1D90120F7E70000B8410008F4
+S31508000B3070B5054600240D4EFFF79FFE04EB4401F1
+S31508000B4056F82100A8420BD806EB810149680844EB
+S31508000B50A84205D904EB440006EB8000007A70BD74
+S31508000B60641CE4B20D2CE7D3FF2070BDB841000821
+S31508000B700048704700C0000C03494FF0FF3008607A
+S31508000B8001F2044108607047C406002010B58A05C2
+S31508000B9001D0002010BD02688A4204D002C04FF47A
+S31508000BA08062FFF774FE012010BD000070B5044690
+S31508000BB00C480D46844202D1A0F204440AE00A48D1
+S31508000BC0854202D1074C054604E0204600F060F84D
+S31508000BD0002806D029462046FFF7D8FF002800D06F
+S31508000BE0204670BDC80A002000C0000C0821B1EBE1
+S31508000BF0106F01D100F18060704700000B48D0E902
+S31508000C000012114482681144C268114402691144F1
+S31508000C10426911448269D0F800021144C9438142ED
+S31508000C2001D10120704700207047000000C0000C69
+S31508000C3070B516460D46FFF7D9FF04461049681EDB
+S31508000C40091B814214D32046FFF772FFFF280FD0F5
+S31508000C506019401EFFF76CFFFF2809D0A00A094952
+S31508000C60800288422B463246214603D1064802E0D6
+S31508000C70002070BD0548BDE87040FFF745BE00007E
+S31508000C80FFFF1F0C00C0000CC80A0020C406002085
+S31508000C902DE9F04106460068FFF74AFFFF2826D0EF
+S31508000CA00024FFF7EAFD306806EB042500EB04276D
+S31508000CB02D1D00F011FC00F10D082946384600F0FC
+S31508000CC053FC05E000F008FC404510D8FFF7D5FDB9
+S31508000CD000F044FCC0F300000028F3D100F03EFC0D
+S31508000CE030F0100003D1395C2A5C914202D0002012
+S31508000CF0BDE8F081401CFF28F5D9641C042CD0D32C
+S31508000D000120F5E708B5002000900D480168491C48
+S31508000D1014D0D0E901121144C26811440269114481
+S31508000D20426911448269C06911440844C04300906D
+S31508000D306A4604210348FFF77BFF08BD012008BD6A
+S31508000D40C80A002000C2000C10B588B014222C492D
+S31508000D5003A8FFF741FC03A800F022FD002000F0DD
+S31508000D6017FF002000F0F8FD042000F0EBFD00F06E
+S31508000D7001FD2021012000F08FFE012000F0A0FCDB
+S31508000D8000F036FB802209211E4800F07FFC1E4C2D
+S31508000D9000220D21204600F079FC226E012122F462
+S31508000DA0005222664FF46140009008208DF8050035
+S31508000DB08DF8060010208DF808000020134C8DF8D9
+S31508000DC00710ADF80A0069460122204600F042FFE6
+S31508000DD0012304221021204601F056F8012304229B
+S31508000DE00021204600F0AEFF206C20F00F01891C80
+S31508000DF02164074800F0F4FE00F0EAFE08B010BDD2
+S31508000E00D83F000800850248008F024800000340CA
+S31508000E108000002002494FF00070486070470000CB
+S31508000E2000850248014948807047000040010020BB
+S31508000E3010B500F051FB0B4C616888420CD3217841
+S31508000E40094851B1002121704FF00071416000F04E
+S31508000E5043FB61880844606010BD01212170490286
+S31508000E60F4E70000400100200085024810B5FFF7AE
+S31508000E7049FF002803D0BDE81040FFF783BD10BD29
+S31508000E80FFF7E6BDFFF774BEFFF776BEFFF7B6BEFF
+S31508000E90FFF7CEBE00487047001BB7000D4810B5D7
+S31508000EA000680068018E0B4C241F2180408E6080EC
+S31508000EB02088000403D56188201D00F06DF820887D
+S31508000EC0400405D02188BDE81040024800F0F6B875
+S31508000ED010BD0000A801002070B52A4C54F89C0FDC
+S31508000EE040F001002060206820F0F00040F080000B
+S31508000EF02060264D244A0521284600F07FFB012262
+S31508000F000521284600F0B6FB1F4A0621103228465E
+S31508000F1000F074FB01220621284600F0ABFB1A4AB2
+S31508000F201B4D403A0021284600F068FB01220021AB
+S31508000F30284600F09FFB144A164E303A06213046E2
+S31508000F4000F05CFB01220621304600F093FB0E4AB6
+S31508000F500721203A304600F051FB0122072130468E
+S31508000F6000F088FB084A0121103A284600F046FBA3
+S31508000F7001221146284600F07DFBA06940F488103E
+S31508000F80A06170BD004000502C4000080083024854
+S31508000F9000840248008102482DE9F04104460068B1
+S31508000FA001270D468180C8073E460DD021680220DC
+S31508000FB04876207A390400F0EF002072206800682D
+S31508000FC000F044FE20688671A8070ED52168032024
+S31508000FD04876207A4FF4003100F0EF00207220683E
+S31508000FE0006800F033FE2068867168070ED5216810
+S31508000FF004204876207A4FF4802100F0EF00207212
+S315080010002068006800F022FE2068867128070ED541
+S31508001010216805204876207A4FF4002100F0EF0079
+S3150800102020722068006800F011FE20688671E806C4
+S315080010300ED5216806200876207A4FF4801100F034
+S31508001040DF0020722068006800F000FE2068C67184
+S31508001050A8060ED5216807200876207A4FF40011D5
+S3150800106000F0DF0020722068006800F0EFFD2068BD
+S31508001070C67168060ED5216808200876207A4FF4CE
+S31508001080800100F0DF0020722068006800F0DEFDB5
+S315080010902068C671E8050ED521680920C876207A29
+S315080010A04FF0807100F0CF0020722068006800F0D1
+S315080010B0CDFD206886713846BDE8F0812DE9F041FE
+S315080010C004460D464FF0000888064FF01E074FF0FD
+S315080010D0010608D52068202107762068006800F0F8
+S315080010E0B5FD2068C671E80608D520681021077680
+S315080010F02068006800F0AAFD2068C671A8070DD50B
+S3150800110021681F20887620680221006800F09EFD6D
+S31508001110207A00F0DF00207220680672E8070DD0FA
+S3150800112021681C20487620680121006800F08EFDA1
+S31508001130207A00F0EF002072206886714046BDE8EC
+S31508001140F08100000D4A0021106851FA80F1C0F3C1
+S31508001150072313FA81F1C0F3074313FA81F101EB70
+S31508001160106081B200201318401C1B7938281944D6
+S3150800117089B2F8D3C843401C80B2704700010020EA
+S3150800118010B500F029F800280DD10849064808606E
+S31508001190002002460B18401C1A713828FAD3BDE8FD
+S315080011A0104000F02DB810BDA2E742CE0001002085
+S315080011B070B50D460646002400F00EF838B1382EF4
+S315080011C005D225B103480124304400792870204609
+S315080011D070BD00000001002070B5074D07490024C6
+S315080011E02868884205D1FFF7ADFFA98F884200D14C
+S315080011F00124204670BD000000010020A2E742CE6F
+S3150800120010B5FFF79FFF0149888710BD0001002030
+S315080012102DE9F041674ED6F80002C00709D1D6F885
+S31508001220040240F00100C6F80402D6F80002C0071E
+S31508001230FBD061480068800509D55F480830016819
+S3150800124041F40071016041F64C5001F005FE5B4D1A
+S31508001250286840F40020286040F6C41001F0FCFD20
+S315080012602868574908402860544F103F38684FF09F
+S31508001270000810F0300FA5F104041CD03868514955
+S3150800128008403860FFF706FE4F49B0FBF1F04C49BD
+S31508001290C91C01EB004039680843386047490831E2
+S315080012A0C1F80080286820F4003028602068C0F360
+S315080012B0C2100728FAD1286840F001002860206883
+S315080012C0C007FCD0286840F0100028603B4F3F4814
+S315080012D03F1D3860286840F040002860286820F0E4
+S315080012E010002860286840F480202860206840079D
+S315080012F0FCD5286820F0010028602068C007FCD1CA
+S3150800130033494FF00110086031480830C0F80080B2
+S31508001310001FC0F800802E481430C0F80080001D59
+S31508001320C0F800802A49032010310860091F29489F
+S315080013300860274928481C310860286820F04000C2
+S3150800134028602648386020688006FCD54FF4166069
+S3150800135001F082FD2248386020688006FCD54FF4EB
+S31508001360616001F079FD1F48386020688006FCD569
+S315080013704FF4965001F070FD1B48386020688006CF
+S31508001380FCD541F2707001F067FD18483860206896
+S315080013908006FCD54FF4E15001F05EFD0520C6F845
+S315080013A06C010B480838C0F8008000F021F8BDE849
+S315080013B0F0810000004000500044005014470050DF
+S315080013C0FDFFFEFFCFFFF0FFA0252600002F0B0133
+S315080013D00C4600500500010003002001002F0501FE
+S315080013E0002F0301002F0201002F0101002F000129
+S315080013F010B51C4C2068C1031B4823D51B49096836
+S31508001400C90701D1FFF746FD18490C3909684A078B
+S31508001410174911D50A68C2F303630A680968C2F353
+S315080014200622C1F30641491C5B1C13FB01F1B0FB04
+S31508001430F1F0521C504305E0096801F07F01491C90
+S31508001440B0FBF1F02168C9B2491CB0FBF1F00549BF
+S31508001450091D096801F00101491CB0FBF1F00549B5
+S31508001460086010BD0C46005000366E011C4700503F
+S3150800147018470050C0FF032072B60D480D49086092
+S31508001480BFF34F8F62B60B488030016841F4700194
+S31508001490016008480C30016821F00801016006491E
+S315080014A0486920F00F0040F00400486170470000CA
+S315080014B00000000808ED00E00020005810B51022D2
+S315080014C051060448FFF743F8FFF7D6FFFFF7A0FEDB
+S315080014D010BD0000C4FF032000B500F01FF8014846
+S315080014E0006800BD2802002000B500F00FF84FF094
+S315080014F0E020044941610021816105220261024818
+S31508001500016000BD7F320200280200204FF0E02073
+S315080015100021016141618161704700004FF0E020C0
+S315080015200069C00303D502480168491C0160704779
+S31508001530280200207047704770470000054900B52B
+S31508001540F5220A6000F030F803480169C907FCD1A2
+S3150800155000BD00005455000C0020005801480069E1
+S31508001560704700000020005830B505460C480C4668
+S31508001570F521016050210160002304EB83004168D6
+S3150800158054F8230000F022F89B1C402BF5D328467C
+S3150800159000F024F803480169C907FCD130BD0000F2
+S315080015A05455000C0020005830B50649AA240C6092
+S315080015B0054B55221A6080250D600C601A60302193
+S315080015C0016030BD5455000CA8AA000C024A1060F0
+S315080015D0101D016070470000F055000C054910B554
+S315080015E0AA220A60044B55241C60A0230B600260E3
+S315080015F010BD00005455000CA8AA000CF0B521F047
+S31508001600030303441D698C07E40EF826A640B54378
+S315080016101D61456F4F000326BE40B5434567134D10
+S31508001620A84202D0124DA84205D1056E01268E4069
+S31508001630B543056614E015782D0611D555688D4015
+S315080016404560CD0800EB8500056C4907C90E0726DD
+S315080016508E40B5430564157A8D40016C0D430564CB
+S3150800166010781969A04008431861F0BD008E024839
+S31508001670008F024810B5436F490003248C40A343EA
+S315080016804367436F8A401343436710BD21F0030342
+S3150800169010B5184403698907C90EF8248C40A3437A
+S315080016A0036103698A401343036110BD0248016858
+S315080016B0024A1143016070471447005002000100B6
+S315080016C001490860704700000446005010B50C4CEC
+S315080016D0206820F480302060FFF7DCFB0949B0FB66
+S315080016E0F1F0094901EB0041054810380268074B3B
+S315080016F01A4011430160206820F40030206010BDB4
+S3150800170014470050A02526000000FFFFCFFFF0FF7A
+S3150800171012484FF40001C0F88010D0F81C1321F0CD
+S315080017203001C0F81C13816F0902FCD54FF4003153
+S31508001730C0F880100821C0F80413816F8903FCD50E
+S315080017404FF40021C0F88010D0F80C1341F00801BE
+S31508001750C0F80C13816F0903FCD570470040005090
+S3150800176002480168024A1140016070471447005058
+S31508001770FDFFFEFF02480168024A114001607047FA
+S3150800178024470050FDFFFEFF034804490068096826
+S3150800179001F00101C8407047C0FF032014460050FD
+S315080017A038B50446002000F0B5F800F0D3F9E07922
+S315080017B0012805D1FFF7ACFF00F04EF80028FBD052
+S315080017C0607A00F0F5F91D48D0F8C4100029FBD15D
+S315080017D0207A00F05DF8207C00F092F8607C00F03A
+S315080017E07BF8A07C00F06EF8E07C00F07FF8A0792A
+S315080017F0012805D1FFF76AFF00F022F80028FBD080
+S31508001800E078A0B1FFF7ACFFA07800902378627863
+S31508001810E178A08800F0AAF8E1684FF480308142A8
+S3150800182001D100F077F8BDE83840FFF7E1BDA079AF
+S315080018300028F1D1FFF73AFFEEE70000004000501C
+S31508001840044801684FF46070884301D0002070474F
+S3150800185001207047104700500348D0F8000340F3B2
+S31508001860C000401C7047000000400050010F074AA6
+S3150800187001EB410102EB810120F07040D1F84016DE
+S31508001880014201D0012070470020704700400050F7
+S3150800189010B50B4C216841F48011216001280AD14A
+S315080018A0206820F480102060642000F0B9F92068D0
+S315080018B040F400202060BDE81040642000F0B0B974
+S315080018C01447005003490A68401E22F001020243E9
+S315080018D00A6070472046005003490A68401E22F0F5
+S315080018E0010202430A6070471046005003490A681D
+S315080018F0401E22F0010202430A6070471446005057
+S3150800190003490A68401E22F0FF0202430A60704734
+S315080019100C46005003490A6822F4803202430A60E2
+S31508001920704700000C4600500549002840F2011295
+S31508001930086802D01043086070479043FBE7000030
+S315080019401C47005003490A68401E22F0070202435A
+S315080019500A6070471846005003490A6822F4803224
+S3150800196002430A6070470000184600502DE9F04708
+S315080019701E4617460B460446089DFFF7D5FFDFF8B7
+S3150800198008A1012BAAF10408A8F104091AD0DAF86B
+S3150800199000106D1E21F07F012943CAF80010484641
+S315080019A00168C906FCD5D8F8002042F00102C8F83B
+S315080019B000200168C907FCD034490520C1F86C012C
+S315080019C0BDE8F087F4B34FF0C0607043B0FBF7F49E
+S315080019D01820B4FBF0F0820DD8F80010404641F00C
+S315080019E00101C8F8001049460B68DB07FCD00368FC
+S315080019F043F010030360DAF80030DFF8948003EA56
+S31508001A0008036FF0FF0808EB062633434FEA08265B
+S31508001A1006EB02421343320202EB07621343CAF88B
+S31508001A200030026842F040020260026822F01002AA
+S31508001A300260026842F4802202600A685207FCD5F6
+S31508001A40026800E019E022F0010202600868C00797
+S31508001A50FCD13C20B4FBF0F0800D854201D200F0A9
+S31508001A6055F85A20B4FBF0F0800D854201D200F0FB
+S31508001A704DF8284600F04AF89EE7FFF70BFA0549A5
+S31508001A80B0FBF1F08005A0E7184700500040005071
+S31508001A90FF8080F040420F001A4A10B5136843F0E1
+S31508001AA001031360131F1C68E407FCD0146844F094
+S31508001AB01004146009024FF07F4404EB0060A1F59E
+S31508001AC0807101431160106840F040001060106892
+S31508001AD020F010001060106840F48020106018682C
+S31508001AE04007FCD5106820F0010010601868C00790
+S31508001AF0FCD1106820F04000106003490820C1F8A6
+S31508001B006C0110BD244700500040005008490A687F
+S31508001B10084B22F4FE0203EB004002430A60044825
+S31508001B20083801688906FCD5322000F079B800002B
+S31508001B30184700500000FFFF010F054A01EB41015D
+S31508001B4002EB810120F07040C1F84806704700009A
+S31508001B50004000500C48D0F80012C90706D10121F0
+S31508001B60C0F80412D0F80012C907FBD0074801686C
+S31508001B70890507D5054A4FF40071083211600168D6
+S31508001B808905FCD47047000000400050004400500E
+S31508001B900649D1F8C4201207FBD4D1F80C2322F049
+S31508001BA040020243C1F80C23704700000040005071
+S31508001BB00649D1F8C4201207FBD4D1F80C2322F029
+S31508001BC080020243C1F80C23704700000040005011
+S31508001BD002494FF44030C1F80402704700400050F3
+S31508001BE0010F054A01EB410102EB810120F070402B
+S31508001BF0C1F814047047000000400050010F074A5E
+S31508001C0001EB410102EB810120F07040D1F80C1480
+S31508001C10014201D001207047002070470040005063
+S31508001C2010B50446FFF7E4FB0648074A0168B1FB0E
+S31508001C30F2F16143002001E000BF401C8842FBD35B
+S31508001C4010BD0000C0FF032040420F000186090CAA
+S31508001C50418670472DE9F04117460C460546102681
+S31508001C6000F03CF8207A00B1064657B12079216881
+S31508001C7000283246284602D000F0BEF801E000F0FF
+S31508001C8079F8E079710840004FF4807202EB01217F
+S31508001C90801E0843401C40F440304FF0FF33E86391
+S31508001CA06079911C401E41EA00606863A0791904B6
+S31508001CB028B16A6B01EB004002436A6305E0686B72
+S31508001CC0627901EB0241084368634FF4A060A86398
+S31508001CD0EB6460892864BDE8F081000010B504460D
+S31508001CE01248844202D01248844202D10F48083072
+S31508001CF010E01048844202D00F48844202D10D48B1
+S31508001D00083007E00D48844202D00D48844203D1CA
+S31508001D100A48083000F0CEF80320E060E068C00703
+S31508001D20FCD0206C20F00F00206410BD000003409A
+S31508001D300002034000000248000202480040024830
+S31508001D400042024810B5D0F80C4124F0E064C0F80F
+S31508001D500C4141EA032141EA0261D0F80C21044B07
+S31508001D601A40114341F08051C0F80C1110BD000013
+S31508001D70C0C0FFEF2DE9F04714460E460546642914
+S31508001D8034D394B3FFF700FD01466420B1FBF0F8A5
+S31508001D90B6FBF0FC4FF480610E4601274A1EB14699
+S31508001DA00CFB04FC08FB01F0B0FBFCF0830AC0F353
+S31508001DB009004B4504D8904202D202461F460E46F9
+S31508001DC0491EEFD1761E46F4004028616869084925
+S31508001DD00840091401EB84210843064901EB074131
+S31508001DE0084368610020BDE8F087FFE70120FAE7AD
+S31508001DF0EF8000FC0000FFFF2DE9F04114460D4678
+S31508001E000646FFF7C1FC014605FB04F70120B94267
+S31508001E1034DD91FBF7F340F2FF3C04E0401C07FB7E
+S31508001E2000F291FBF2F36345F8D203FB04F2424356
+S31508001E30B1FBF2F25F1C67434743B1FBF7F1691A3E
+S31508001E40A5EB020200D54942002A00DA5242914225
+S31508001E5000DA5B1CC3F5806141F480413161716928
+S31508001E60074A1140121402EB84221143054A02EB79
+S31508001E700040014371610020BDE8F0810120FBE7C5
+S31508001E80EF8000FC0000FFFF10B5D0F8084124F0F1
+S31508001E90E064C0F8084141EA032141EA0261D0F84A
+S31508001EA00821034B1A401143C0F8081110BD000061
+S31508001EB0C0C0FFF8204910B5884211D1C414204685
+S31508001EC0FFF73AFE2046FFF7D1FC0028FAD1204654
+S31508001ED0FFF786FE2046FFF791FE0028FAD110BDCF
+S31508001EE01649884211D1164C2046FFF725FE204692
+S31508001EF0FFF7BCFC0028FAD12046FFF771FE204602
+S31508001F00FFF77CFE0028FAD110BD0E498842FBD1A6
+S31508001F100B4C80342046FFF70FFE2046FFF7A6FC41
+S31508001F200028FAD12046FFF75BFE2046FFF766FE3B
+S31508001F300028FAD110BD0000080003400800024836
+S31508001F4080000010084002482DE9F041104FFF219B
+S31508001F50001D397000F090F806460025D7F888402D
+S31508001F6005E014F8010B2844C5B2FEF786FC761E78
+S31508001F70F7D2012179702846391D00F085F900202D
+S31508001F80B870F8700820A7F88600BDE8F081000050
+S31508001F903806002070B50F4C0020012584F8820011
+S31508001FA084F88150FF21217010216170A070FEF71E
+S31508001FB009FCE070FEF716FC2071FEF713FC000A18
+S31508001FC06071A571E5710820A4F88600BDE8704027
+S31508001FD0FEF75ABF3806002070B50446FEF7F2FB36
+S31508001FE06178801E884201DA222018E00E4DFF2013
+S31508001FF028700120A5F88600617859B1A21CD5F889
+S315080020008800FEF745FF48B155F8880F61780844FF
+S31508002010286070BDFEF72AFF0028FAD13120BDE8F6
+S31508002020704000F027B900003806002070B5044655
+S31508002030FEF7C8FB6178401E884204DABDE87040A6
+S31508002040222000F017B9201D00F016F8094D0146A8
+S315080020506B1CC5F8880062781846FEF718FCFF2046
+S3150800206005F8480B6178286C084428646078401C99
+S31508002070E88770BD380600200178427841EA0221D7
+S315080020808278C07841EA024141EA00607047000060
+S315080020900548002100F8811FC0F80710C170A0F894
+S315080020A0051081704170704738060020034890F883
+S315080020B08100002800D00120704700003806002063
+S315080020C02DE9F041044600780127644DFF2812D017
+S315080020D095F8811001297CD10021FF26F4283AD0F1
+S315080020E014DCD0287BD00ADCC9285FD0CC2872D073
+S315080020F0CF2871D199E02046FFF74CFF90E0D12810
+S315080021007DD0D2286FD0F32866D12DE0F5380A287D
+S3150800211062D2DFE800F005249090902D903A3C4674
+S31508002120FEF750FB6278401E904201DA222072E0E8
+S31508002130681CD5F888104835FEF7A9FB05F8486DE0
+S315080021406178D5F888000844C5F888006078401C8E
+S31508002150A5F8860064E02046FFF768FF60E02E7069
+S31508002160201DFFF789FF31E02046FFF7EDFE57E017
+S315080021702E703B48C5F888006970A970E970072079
+S31508002180291D00F081F80820E2E7002043E02E70C0
+S31508002190697095F88200A870E9702971697106203E
+S315080021A0D6E785F8811085F8821040E0FEF70AFB2D
+S315080021B0411E621CD5F88800FEF76AFE58B12E70DB
+S315080021C0FEF700FBD5F88810401E0844C5F88800BD
+S315080021D024E041E003E02CE02DE010E003E0204697
+S315080021E0FFF7FAFE1CE02E7069700C46A970FEF720
+S315080021F0E9FAE8702C716C71AC710720A8E72046E3
+S31508002200001DD5F88840FFF737FF01462046FEF740
+S3150800221037FE70B10BE000F02DF801E0A5F88670E6
+S3150800222095F88400012808D00AE0FEF73FFB2E70D7
+S31508002230F4E73120EFE72020EDE7102000F01AF848
+S31508002240B5F98610002907DD85F88470BDE8F041E8
+S31508002250024889B2FEF7FEBABDE8F08138060020CA
+S31508002260B04100080249002081F884007047000048
+S31508002270380600200349FE220A7048700220A1F899
+S3150800228086007047380600200870020A4A70020C59
+S315080022908A70000EC870704770B51149054688895E
+S315080022A0CA89801A84B24020402C00D30446087894
+S315080022B00026000607D580262CB1094889682246DB
+S315080022C01430FEF744F914B1054A143200E000222E
+S315080022D0234631462846BDE8704001F03BBD000064
+S315080022E06005002038B50446930802E051F8040B4F
+S315080022F020605B1E9BB2F9D212F0030206D00020C2
+S3150800230000906846FEF723F90098206038BD2DE94D
+S31508002310F843054680889446C01A80B2141AEA889B
+S315080023202F68C2F30E02884602FB00F6544308994A
+S3150800233003FB0277B6B2A4B241B1012950D1844554
+S3150800234018D802FB0CF292B2394644E0844504D808
+S3150800235002FB0CF23946404608E03246394640460A
+S31508002360FEF7F5F8296808EB06002246BDE8F843AB
+S31508002370FEF7EDB826F00300814602463946404688
+S31508002380FFF7B0FF07EB090216F003011FD0C1F1F2
+S3150800239004004646844200D22046C0B2231A9CB2A4
+S315080023A0002300936B4603E012F8017B03F8017BD8
+S315080023B0491EC9B2F8D2296803E011F8012B03F8BF
+S315080023C0012B401EC0B2F8D20098306000E02968A0
+S315080023D0002C05D022464046BDE8F843FFF782BFE9
+S315080023E0BDE8F88338B5930802E00C6840F8044B5A
+S315080023F05B1E9BB2F9D212F0030204D00968009161
+S315080024006946FEF7A4F838BD2DE9F84305468088E5
+S315080024109446C01A80B2141AEA882F68C2F30E02CC
+S31508002420884602FB00F65443089903FB0277B6B2C6
+S31508002430A4B249B101294FD1844519D802FB0CF23F
+S3150800244092B24146384643E0844504D802FB0CF272
+S315080024504146384608E0324641463846FEF777F8A0
+S31508002460286808EB06012246BDE8F843FEF76FB870
+S3150800247026F003008146024641463846FFF7B2FF7A
+S3150800248007EB090016F003031DD0C3F10401464605
+S315080024908C4200D22146CAB2A11A8CB23168009188
+S315080024A0694603E011F8016B00F8016B5B1EDBB2AD
+S315080024B0F8D2286803E011F8013B00F8013B521EE8
+S315080024C0D2B2F8D200E02868002C05D02246414650
+S315080024D0BDE8F843FFF786BFBDE8F88310B50446A4
+S315080024E08178002001F0C2FB00280DD1201D01F0E3
+S315080024F095F9402808D3A17804F19C024023BDE849
+S315080025001040002001F026BC10BD09786FEA016171
+S31508002510C90FC90100231A4601F01CBC70B584888E
+S31508002520D51A9A4201D205EB44052D042D0C05D087
+S31508002530AC4208D2944203D8121B02E0002070BDB8
+S31508002540224493B24381A2B201E09B1A9BB2934202
+S31508002550FBD20C460168C088C0F30E0203FB0211C9
+S315080025602046FDF7F4FF012070BDF8B51C46DDE9ED
+S31508002570063715468288E61A9C4201D206EB4206C1
+S315080025803604360C05D0B24209D2A24203D8A21AA2
+S3150800259002E00020F8BD224493B243818688AE4209
+S315080025A000D23546828801E09B1A9BB29342FBD241
+S315080025B02A460097FFF7ABFE2846F8BD7CB50446C9
+S315080025C04089CDE9000323892046FFF7CEFF6189BC
+S315080025D00546A0882A4600F05BF8608128467CBD3F
+S315080025E02DE9F843984614000F46054609D02E896A
+S315080025F06989E8790006A88814D48E4204D3711A2A
+S3150800260005E00020BDE8F883721A02EB400189B2A2
+S31508002610884201D9401A00E0002080B284420ED3D5
+S3150800262004460CE0A0420ED8B8F1000F05D1EB889D
+S31508002630221AC3F30E0302FB037704460E462CB395
+S31508002640A888334613E08E4201D3721A02E0731A41
+S3150800265003EB400292B22244B2EB400FF0D3021BC6
+S3150800266092B200F015F80646EAE7191A8BB28342C9
+S31508002670FBD2224639462846CDF80080FFF7C4FE2D
+S31508002680A8882246314600F003F828812046B9E793
+S315080026900346881880B2814202D8B0EB430F05D3AF
+S315080026A05942002202EB4101084480B270470000FB
+S315080026B070B5264901EB0016E021357A24483468BE
+S315080026C0FDF7E6FF234A002010705070D4F8000882
+S315080026D020F4FE60C4F80008002009E004EB40116D
+S315080026E0D1F8003B43F00063C1F8003B401CC0B280
+S315080026F0A842F3D34FF00110C4F81C080920C4F807
+S315080027001408C4F810080F20103500EB4500606265
+S3150800271010205080F168C0EB910040F48010A06250
+S31508002720D4F8000920F00300C4F80009084840213D
+S3150800273041814183D4F8100B40F0C040C4F8100B17
+S31508002740A06940F44020A06170BD00004041000827
+S3150800275070020020EC01002070B506460024114DD9
+S3150800276009E0204600F0F6FB00281AD041683046FA
+S315080027708847641CE4B22878401C8442F1D333218C
+S315080027800948FDF763FF0848FF221021C01CFDF722
+S3150800279055FFBDE870400448FF2210211330FDF7AD
+S315080027A04DBF70BDFC0100206C040020054901EBFB
+S315080027B000100068D0F8041821F00201C0F80418C7
+S315080027C07047000040410008054901EB0010006809
+S315080027D0D0F8041841F00201C0F804187047000048
+S315080027E040410008114BCA0903EB001021F0800193
+S315080027F0006800EB41100CD0D0F8001921F4001144
+S31508002800C0F80019D0F8001941F08051C0F8001935
+S315080028107047D0F8001B21F40011C0F8001BD0F84F
+S31508002820001B41F08051C0F8001B7047404100086A
+S3150800283070B50F4901EB00100468057A4FF00110D6
+S31508002840C4F81C08012000230A4E0BE004EB4011D3
+S31508002850C1F8003B06EB40125381C1F80039401C11
+S315080028605383C0B2A842F1D303491020488070BDF3
+S315080028704041000870020020EC010020F0B5314B01
+S315080028804FF4001603EB001021F080030068C90915
+S315080028904FF002042BD000F5106523B105EB431168
+S315080028A00F68002F09DB05EB43110C6802B90026F7
+S315080028B046F0006214430C6011E00D6845F00065AF
+S315080028C00D608D686D06FCD50D6802B9002646F0C8
+S315080028D0804215430D608A689207FCD58C602021DA
+S315080028E041EA8311016101698906FCD4F0BD00F54E
+S315080028F0306523B105EB43110F68002F07DB05EBA5
+S315080029004310016802B9002631430160F0BDD0F8D2
+S31508002910043843F40073C0F8043843691B06FCD531
+S315080029200B6802B9002646F0804213430B608A689A
+S315080029309207FCD58C60D0F8041841F48061C0F881
+S315080029400418F0BD404100082DE9F043424A8B784F
+S3150800295002EB001523F080022E7A28684FEAD31876
+S31508002960B24221D23D4B8C8803EB421303EB08138A
+S31508002970C4F30A045C818C791C735C890427E41C03
+S31508002980B4FBF7F4364FA4B24FF0805C4FF0010960
+S31508002990B8F1000F0BD0D0F824807E88ED68264465
+S315080029A0B044B8EB950F2ED90020BDE8F0834FF65A
+S315080029B0FF7808EA840406EB94040F2606EB440421
+S315080029C0466AA4B2A64206D27E88ED682644B6EBCD
+S315080029D0950FE9D8446200EB4214D4F8005B5B8992
+S315080029E0C9781D4301F00301012901D14FF0000CFC
+S315080029F04CEA81410D4345F40041C4F8001BD0F868
+S31508002A001C38103221E0B6B2C6EB950545EA0444F7
+S31508002A1000EB82057E80C5F80041C9785B8901F024
+S31508002A20030143EA8253012901D14FF0000C4CEA15
+S31508002A3081410B4300EB4211D1F80049234343F48B
+S31508002A400043C1F80039D0F81C3809FA02F10B43E3
+S31508002A50C0F81C380120A8E7404100087002002091
+S31508002A60EC0100200122FFF709BF0000F8B5154662
+S31508002A700A46134C31F080014FEAD21204EB411496
+S31508002A8004EB021425604FF000056560238108D029
+S31508002A906589B3FBF5F4B3FBF5F605FB16353DB9C9
+S31508002AA005E0084C24F812300093012304E00BB922
+S31508002AB0641CA4B20093234600F0D8F90120F8BD9F
+S31508002AC070020020F00100202DE9FE4304460E4660
+S31508002AD040783549354F022806D0032830D00428D7
+S31508002AE019D005281ED124E0387820F00100387066
+S31508002AF0387820F002003870002078701CE02146F3
+S31508002B00281D00F09DFE002E4BD1296803B0012038
+S31508002B10BDE8F04308473878C00742D0387840F017
+S31508002B20040038708D68002EE9D12968002088478E
+S31508002B30E5E73878C00734D0387820F00400F0E7A5
+S31508002B40002588460AE0284600F004FA20B14269C2
+S31508002B5012B12078616890476D1CEDB298F80000B4
+S31508002B60401C8542EFD3387840071AD5387820F0CC
+S31508002B70040038700E486D4607C88DE807002078AF
+S31508002B808DF80000D8F8084016B921680020884753
+S31508002B902946201D00F054FE002E02D1216801208E
+S31508002BA08847BDE8FE830000FC0100206C04002075
+S31508002BB09841000870B50546274800EB05100468DB
+S31508002BC0206C26496FF30F00884205D024498842B5
+S31508002BD002D0244988423ED12846FFF7F5FDE06831
+S31508002BE040F04000E060204600F084FDE06820F4F4
+S31508002BF0705040F4A050E060D4F8000840F003009C
+S31508002C00C4F80008D4F8000E20F00F00C4F8000E2F
+S31508002C10E06840F00700E060E06820F0005040F00F
+S31508002C208040E060206820F0100040F0C00020607E
+S31508002C30D4F8000840F00400C4F800086069616927
+S31508002C400843606160686168084360600648A0617F
+S31508002C502846FFF7ABFD70BD404100080000544F01
+S31508002C60000031550000325516380080704770470D
+S31508002C702DE9FE4F06466B4800EB0619D9F80040C9
+S31508002C806569A0690540E80405D54FF48050606180
+S31508002C903046FFF70DFDDFF88CA1A8041AD54FF4CE
+S31508002CA000506061D4F80808C0F34100002865D0D8
+S31508002CB0022865D00020DAE90437DAF818200093EC
+S31508002CC0CDE901728DF8040001218DF8006068468F
+S31508002CD0FFF7FAFE28054FF000070ED54FF40060FF
+S31508002CE06061009704208DF800608DF801000121CD
+S31508002CF0019702976846FFF7E7FE002D0EDA4FF0B8
+S31508002D0000406061009705208DF800608DF801008D
+S31508002D100121019702976846FFF7D6FE680712D584
+S31508002D20D4F804805FEA48700BD5009702208DF826
+S31508002D3000608DF801000121019702976846FFF7A8
+S31508002D40C3FEC4F80480DFF8E08028072AD50820E7
+S31508002D50606098F80100A8B1D4F80808DAF83430A9
+S31508002D60C0F30D22DAF83C000093029001218DF899
+S31508002D70006068460192FFF7A7FE07E002209AE77F
+S31508002D80012098E7A06920F00800A06100970320B9
+S31508002D908DF800608DF801000121019702976846B9
+S31508002DA0FFF792FEE8062ED5A06920F01000A06174
+S31508002DB0304600F007FA6068C006F9D498F80000B3
+S31508002DC0E8B199F808300021D9F800C00846DFF8BC
+S31508002DD05C9008E00A4609EB401149898A4200D905
+S31508002DE01146401CC0B29842F4D303EB91000F2160
+S31508002DF001EB400080B2CCF8240088F80070A06986
+S31508002E0040F01000A061280302D5304600F06CF9A6
+S31508002E10680304D53046BDE8FE4F00F0B5B8BDE8F6
+S31508002E20FE8F000040410008EC01002070020020DF
+S31508002E30084A02EB00121268D2F8003823F4FE633F
+S31508002E4043EA0111C2F80018802100231A46FFF749
+S31508002E500DBE00004041000808B5002100918142DE
+S31508002E6002D200BF491CF9E708BD0000F0B5364D8F
+S31508002E70059C05EB0010354D006861B9344F05EB2C
+S31508002E80021537F812606D893446AE4200D32C46D7
+S31508002E90351B27F812502D4D4FF08056770005EB5D
+S31508002EA04115012A26D000F5306C0CEB4111D1F8FA
+S31508002EB010C00CF0604CC1F810C0D1F810C044EA3C
+S31508002EC0C3434CEA030CC1F810C00B6843F0044333
+S31508002ED00B600B68C3F38143012B30D105EB02125B
+S31508002EE0127B012A2BD1D0F808080A6810F4807FD3
+S31508002EF027D125E000F5106202EB411244EAC343EC
+S31508002F001361136843F0044313601368C3F38143E2
+S31508002F10012B0BD12B7F012B08D1D0F80838156867
+S31508002F2013F4807F00D13E4635431560002C06D049
+S31508002F30D0F8342801238B401A43C0F83428F0BD52
+S31508002F403E4632430A60F0BD404100087002002048
+S31508002F50F0010020094959B1094A1178884205D279
+S31508002F60516800EB400001EBC0007047401AC0B240
+S31508002F7008B10020704703487047000000000000B1
+S31508002F80FC010020804100082DE9F14F86B0534826
+S31508002F900699002400EB011B9BF80800DBF800707B
+S31508002FA0049007F51060039090E0D7F818280121DF
+S31508002FB001FA04FA12EA0A0F7ED0494800EB4415D2
+S31508002FC0039800EB4416B0681035C00724D0B160EA
+S31508002FD054B94448408838B1012300901A4621461E
+S31508002FE00698FFF743FF17E03C48B5F808C006996E
+S31508002FF0D0E90A80CDE9008044F080090023012247
+S315080030008DF800108DF80490CDF808C08DF80530BD
+S3150800301011466846FFF758FDB068000654D5D7F83C
+S31508003020340810EA0A0F4FD03069C0F3C94000903F
+S3150800303000203AE0306982B26889824200D30246AB
+S31508003040B06980B2B2EB800F33D8686830B107EB4D
+S31508003050043101F5805100F0DEFB23E0DBF80010B7
+S31508003060286801EB043C91080CF5805C03E050F8F5
+S31508003070043BCCF80030491E89B2F8D212F003039B
+S315080030800DD00178012B03D990F8018041EA082177
+S31508003090022B02D9807841EA0041CCF80010286852
+S315080030A01044286009F1010080B2009981468842DF
+S315080030B0C0D33069400300E006E005D1D7F83408EC
+S315080030C020EA0A00C7F83408641CE4B2049884426B
+S315080030D0FFF46BAF07B0BDE8F08F00004041000871
+S315080030E070020020F00100202DE9FE4F0746314806
+S315080030F0002400EB07104FF0010890F80890DFF85D
+S31508003100B8B0DFF8B0A006684FE0D6F8181804F192
+S31508003110100208FA02F0014245D006EB4415D5F82C
+S31508003120081B05F53065080718D50820090405D5D4
+S31508003130316C224A914201D348F20800A860DAF8B5
+S315080031401C0000901C488DF80070001D01210268C3
+S315080031500192406802906846FFF7B6FCA868C00767
+S3150800316021D0C5F80880164800EB441154B9BBF8BD
+S31508003170000038B100900123002221463846FFF7A7
+S3150800318075FE10E0DAE90A500B89CDE900500022F5
+S315080031908DF8044001218DF8007002938DF8052002
+S315080031A06846FFF791FC641CE4B24C45ADD3BDE814
+S315080031B0FE8F000040410008F00100200A30544FFD
+S315080031C0700200202DE9F041344901EB0010036834
+S315080031D0186A03F5805100F00F07C0F3434203EB6A
+S315080031E04715C0F30A1605F53065072A0AD2DFE83F
+S315080031F002F0090910440B0904000A68284802600D
+S3150800320009684160BDE8F081286940F0C04028613E
+S31508003210F8E7244800EB4714606818B1324600F016
+S3150800322036FB18E0B208206802E00B6840F8043B59
+S31508003230521E92B2F9D216F0030209D0096801703B
+S31508003240012A01D90B0A4370022A01D9090C817097
+S315080032502068304420606089B042D3D92089296922
+S31508003260401A80B22081002FCCD10D49091F0A8847
+S31508003270801A208100200880C4E73743C2D1186C21
+S3150800328009498842BED3A86848F220010842B9D045
+S315080032900121800600D52121A960B3E74041000835
+S315080032A0F4010020700200200A30544F70B506461B
+S315080032B015460C46C86800F077FC2A463046E3688F
+S315080032C0BDE870400121184788B000248DF81840E1
+S315080032D0FDF73AFDFDF754FFFDF756FA06A900205B
+S315080032E0FDF766FF9DF81800012801D1FDF766FA7B
+S315080032F08DF800400F4E0125022401958DF80840EF
+S315080033006A4604213046FEF779F990208DF80C00BC
+S3150800331004958DF8144003AA05213046FEF76EF988
+S315080033200548C16921F0070141F00101C161FDF7B6
+S315080033303AFAFCE7008102480000034070B50446EB
+S315080033404178002000F092FC08B1002070BD04F11D
+S31508003350DC0140220E4604F1100000F059FA05007F
+S3150800336007D0034661783246002000F0F3FC0028B7
+S31508003370ECD0284670BD00002DE9F84380460C467F
+S31508003380002000F011FC2178C1F34112032A76D2FD
+S31508003390022A08D0734F11F01F0010D0012870D0F0
+S315080033A002286CD18FE07048002806D000F0FCFB9C
+S315080033B0224601214046FCF789FFBDE8F883012A29
+S315080033C003D011F0600F5AD10AE02079102856D29E
+S315080033D03844C078FFF7BEFD010050D0224686E08B
+S315080033E060780A284BD2DFE800F040388D318D0529
+S315080033F02A8D1113204600F0DDFBA1784046FFF721
+S3150800340017FD387840F002003870A8E0787856E062
+S31508003410A5787878A84210D0787838B14046FFF772
+S3150800342007FABE784046FFF797F9BE702DB12946D0
+S31508003430404600F0E7F80028BFD07D708BE02146B3
+S31508003440404600F093F80028B7D088E06088012845
+S3150800345058D1387840F0080005E06088012851D135
+S31508003460387820F00800387075E038780222C0F302
+S31508003470401102EA90000143ADF800104BE041E02C
+S31508003480FFE7207910283DD23844C078FFF762FD5F
+S31508003490010037D022464046FFF708FFA0BB207838
+S315080034A010F0600F2ED160780A2801D00B2829D198
+S315080034B0002000F079FB60780A284CD100208DF8AE
+S315080034C00000012328E0267926F08000F109082863
+S315080034D018D207EB40000844C07CFFF73BFD0546C1
+S315080034E0207810F0600F07D065B12246294640467D
+S315080034F0BDE8F843FFF7DABE607830B1012811D08D
+S3150800350003280FD0002058E729E03146404600F04E
+S3150800351013FCADF8000002236A462146404600F037
+S31508003520C7F91CE0618829B90128314640460FD001
+S3150800353000F0E4FB9DB1224629464046FFF7B6FE59
+S31508003540002000F031FB97F82400C00703D006E0FE
+S3150800355000F09AFBEEE72146404600F09BF9012071
+S315080035602BE700006C040020CD02000870B50C465D
+S3150800357049880546080ACAB206282DD006DC01285D
+S3150800358009D0022814D0032834D120E007280FD008
+S315080035900F282FD104E0FCF791FE0246122323E000
+S315080035A01548002827D0FCF78EFE09E053881BE053
+S315080035B0022808D0114800281DD01046AFF3008015
+S315080035C0020017D0F2E71046FCF77AFEF8E7A18862
+S315080035D01046FCF798FE04E0094800280BD0AFF324
+S315080035E00080020006D0137821462846BDE87040C0
+S315080035F000F05EB9002070BDC70200080000000098
+S31508003600000000002DE9F35F491EC8B2FCF758FE1A
+S3150800361000285DD0417802295AD1C179DFF8C8B0AF
+S315080036204B0900F109049BF80010DFF8C0A063F30A
+S3150800363004118BF80010C3799B0963F345118BF8C5
+S315080036400010418801EB000945E0607801270B2846
+S3150800365002D12078E77804446078042838D1A9EBA9
+S3150800366004001FFA80F8002528E02846FFF772FCB8
+S3150800367000282ED083684246214600989847064679
+S31508003680092819D3464517D800205A4609E0A178D3
+S315080036900144C9B21144CB78FF2B19D1401CCD7017
+S315080036A0C0B2B842F3D310482B46324621461330EF
+S315080036B000F02BF8344406E06D1CEDB29AF80000D1
+S315080036C0401C8542D1D39AF80000401C854202D39B
+S315080036D00020BDE8FC9F4C45B7D3054808B1FCF768
+S315080036E0DEFE0120F5E700006C040020FC01002046
+S315080036F09F040008016941F0010101610169C907D8
+S31508003700FCD101690029FCDA704730B58C180BE04A
+S315080037104A78052A06D18A7822F0800500EB450505
+S31508003720D209AB540A781144A142F1D330BD82883C
+S31508003730C078C2F30A0200F003004FF48063012840
+S3150800374004D0022809D003280FD110E0022901D09D
+S3150800375040F2FF339A4208D80DE0022902D0402AE7
+S3150800376003D808E0B2F5007F05D00020704702298B
+S31508003770F0D04023EEE70120704700214181018106
+S315080037800120704710B5B2F5004F029C01D9002000
+S3150800379010BD01608280C18863F30E01C180C179C2
+S315080037A064F3C711C171002141810181012010BD57
+S315080037B0014680880A8949898A4201D3511A02E05A
+S315080037C0521A02EB400189B2814200D2084670477C
+S315080037D0828801894089814201D3081A02E0091AC0
+S315080037E001EB420080B2904201D3012070470020CD
+S315080037F0704770B5438904460289FEF78FFE6189D2
+S315080038000546A0882A46FEF743FF6081284670BD14
+S315080038100023FEF7D3BE0123FEF7D0BE82880189B6
+S315080038204089814201D3081A02E0091A01EB4200D5
+S3150800383080B2824201D9101A00E0002080B2704797
+S3150800384070B50B4605460689FFF7C2FF20B1E87931
+S31508003850000601D4002070BDA888344601E0211A6C
+S315080038608CB28442FBD2EA882868C2F30E0204FBB3
+S3150800387002001946FCF76BFEA88801223146FEF7BE
+S3150800388007FF2881012070BD0023FEF7A9BE01238A
+S31508003890FEF7A6BE054A0B6813604B685360002303
+S315080038A09360D3819381FEF730BE00006005002047
+S315080038B070B50E4D0C682C604C68C5E901420024B1
+S315080038C0EC81CC88A34200D32346AB81CC884CB18B
+S315080038D003B12AB1FEF7E0FC002800D0012070BD34
+S315080038E0002070BDFEF711FEF6E700006005002017
+S315080038F0044810B5002804D003484078FEF764FF52
+S31508003900012010BDC9270008FC01002070B5064635
+S3150800391000F032F808B1012070BD33211348FCF7D6
+S3150800392095FE134C201DFFF728FFA4F10C0511483E
+S31508003930AC6018B12846AFF300806860002408E040
+S315080039402046FFF707FB0028E6D000688047641C7E
+S31508003950E4B22878401C8442F2D36E703046FFF7F2
+S3150800396029F93046FFF783F9D5E700006C040020F3
+S31508003970080200200000000003484078FF2801D014
+S315080039800120704700207047FC010020FEB500F0BA
+S31508003990FDF800287ED0544E544C6F46B56800207A
+S315080039A0296888473946281DFFF723FF07462968EF
+S315080039B001208847002F6DD09DF801000928ECD218
+S315080039C0DFE800F005060E05758118468A00E4E76B
+S315080039D09DF8000000F01CFA9DF80400A070DCE7D2
+S315080039E09DF8000000F014FA41480028D5D0FCF7ED
+S315080039F059FDD2E7207840F00100207094F82300A2
+S31508003A0020F0010084F8230094F8230020F0040035
+S31508003A1084F8230094F8240020F0010084F8240098
+S31508003A2094F8240020F0040084F824009DF800008F
+S31508003A3001A9FFF7A1FC0028AFD19DF800000021DD
+S31508003A40FFF710F89DF800008021FFF70BF8A4E7B0
+S31508003A509DF8045035F0800104EB410202EBD510C5
+S31508003A6090F8232022F0010280F8232090F82320E2
+S31508003A7022F0040280F8232010D0C07CFFF76AFAEF
+S31508003A80002830D09DF805209DF800C0029B2946E5
+S31508003A90076900E027E06046B8477EE79DF80520FD
+S31508003AA09DF800002946029B00F090F875E72078FB
+S31508003AB0C0078CD00F48002889D02078C0F3C000F2
+S31508003AC0FCF7F3FC69E72078C00788D00A48002885
+S31508003AD085D0FCF7ECFC60E70198002889D0DDE981
+S31508003AE00110884759E7FEBDFC0100206C04002040
+S31508003AF0A5040008AB040008AF040008C0EBC00129
+S31508003B0001EB8010024901EB8000001DFFF750BE53
+S31508003B1050030020C0EBC00101EB8010024901EB05
+S31508003B208000FFF70BBC00005003002070B5C0EB07
+S31508003B30C00303EB8010064B92B203EB8004201DF2
+S31508003B40FFF766FE05462046FEF7C8FC284670BD08
+S31508003B505003002070B5C0EBC00303EB80100A4B7E
+S31508003B6092B203EB800404F110000546FFF78CFEC1
+S31508003B7006462846FFF71CFE402802D32046FFF7D4
+S31508003B80DDFB304670BD00005003002010B5FFF77E
+S31508003B90F3FE002800D0012010BD000014210148C2
+S31508003BA0FCF776BD600500200149086170470000F2
+S31508003BB060050020044902680A60406848600020E1
+S31508003BC08860C881888170476005002070B5254DDA
+S31508003BD00646C90928781C46B1EBD01F0FD00BB191
+S31508003BE0002070BD204818B11E493046AFF300804A
+S31508003BF02B693BB31B4A0321304698472BE0000646
+S31508003C0007D4A8680028ECD016491A461431FCF7E0
+S31508003C109EFCE889204480B2E881A9682144A9600D
+S31508003C20E988814201D0402C17D22B6923B10D4A6D
+S31508003C3002213046984730B10A493046FEF765FCFE
+S31508003C400028CED007E000213046FEF70BFF802182
+S31508003C503046FEF707FF012070BD3046FEF71CFB15
+S31508003C60EEE700006005002000000000054A21F08C
+S31508003C70800002EB400000EBD11090F82300C0F35F
+S31508003C80000070476C04002010B50D4C21F080022E
+S31508003C900A4804EB420202EBD114407894F8232038
+S31508003CA092070AD5FEF79EFD14F8230F20F00200AE
+S31508003CB02070207820F00100207010BDFC01002043
+S31508003CC06C04002070B50B480C468978457821F0BD
+S31508003CD08000082801D3002070BD07488178204657
+S31508003CE0FFF725FD0028F7D021462846BDE8704095
+S31508003CF0FEF72ABEFC0100206C04002010B50D4C0E
+S31508003D0021F080020A4804EB420202EBD114407803
+S31508003D1094F8232092070AD4FEF7A4FE14F8230F7A
+S31508003D2040F002002070207840F00100207010BD9D
+S31508003D30FC0100206C040020054A21F0800002EBFB
+S31508003D40400000EBD11090F82300C0F34000704704
+S31508003D506C04002070B5134E21F08004104806EB61
+S31508003D60440404EBD114407894F82350ED0701D0AD
+S31508003D70002070BD94F8235045F0010584F82350BF
+S31508003D80FEF774FE08B1012070BD14F8230F20F069
+S31508003D9001002070207820F004002070E8E7000079
+S31508003DA0FC0100206C04002001000348407801D083
+S31508003DB0FEF75DBFFEF75ABFFC0100202DE9F0476C
+S31508003DC01E46DDE9089817460C46824600251BE084
+S31508003DD06078052804D1E07800F00300B04202D0EC
+S31508003DE00020BDE8F08721465046FFF76BFF002804
+S31508003DF0F7D0A078C10902D088F8000001E089F858
+S31508003E00000020786D1C0444BD42E1DB0120E8E790
+S31508003E1010B5FEF7A1FCBDE81040FFF7BFBE0000D5
+S31508003E20F8B54FF48E711148FCF732FC00250F4F98
+S31508003E302E46C5EBC50000EB851007EB8004012371
+S31508003E40402204F11C01201D0096FFF79BFC01236C
+S31508003E50402204F15C0104F110000096FFF792FC81
+S31508003E606D1C15F0FF05E4D0F8BD000050030020D6
+S31508003E702DE9FC41074648790E46FF2823D13078BC
+S31508003E80274B8419002522442846C0EBC00101EBC4
+S31508003E90801103EB810191F801C0BCF1000F01D13B
+S31508003EA0897849B1401C10F0FF00EED05DB1B078BA
+S31508003EB02870307960B92FE0C0EBC00101EB8010A3
+S31508003EC003EB8005F2E70020BDE8FC8121780C446D
+S31508003ED06178052901D09442F8D36A1CA91CCDE95A
+S31508003EE000120246022321463846FFF767FF0028DC
+S31508003EF0EAD03079A978C0EBC000044439B1402330
+S31508003F0005F19C023846FFF725FF0028DCD06878C3
+S31508003F1010B12846FFF712FAA01B80B2D4E70000BA
+S31508003F20500300202DE9F04100240B4F2646C4EB30
+S31508003F30C40000EB841007EB8005281D2E60FFF7F0
+S31508003F401CFC05F11000FFF718FC641C14F0FF04B4
+S31508003F50EDD0BDE8F08100005003002070B50025C3
+S31508003F60174C01E0002070BDA078884208D0607820
+S31508003F70884205D0012504F58E74002DF4D0F1E7AA
+S31508003F80A07888420ED19AB204F19C01201DFFF751
+S31508003F907BFC0C4810B12846AFF300802046FEF79C
+S31508003FA09DFA0BE06078884208D1074818B199B2A3
+S31508003FB02846AFF300802046FFF7C0F9012070BD00
+S31508003FC05003002000000000000000004FF0407081
+S31508003FD0E1EE100A704700003002010100000100FE
+S31508003FE0000000000000010002010101800000003D
+S31508003FF00000010001000000010000008000000030
+S31508004000000001000100000001000000800000001F
+S31508004010000001000100000001000000800000000F
+S3150800402000000100010000000100000080000000FF
+S3150800403000000100010000000100000080000000EF
+S31508004040000001000100000001000000090412013F
+S31508004050010200000040501DAC600001010203018E
+S3150800406009022000010100804B0904000002FF003C
+S315080040700000070501024000000705810240000014
+S31508004080050F2100011C100500DF60DDD88945C732
+S315080040904C9CD2659D9E648A9F000003069E000183
+S315080040A0000A000000000003069E001400030057E3
+S315080040B0494E5553420000000000000000000080F1
+S315080040C000040001002800440065007600690063CA
+S315080040D000650049006E00740065007200660061A4
+S315080040E00063006500470055004900440000004E83
+S315080040F0007B0038003000370039003900390043AA
+S315080041000033002D0045003400450030002D0034F2
+S31508004110003000450041002D0038003100380038D5
+S31508004120002D0034003800450038003500320042C2
+S3150800413000350034004600320042007D00000000D1
+S31508004140000004506B000000070000000008000093
+S31508004150000100000000000000000000000600004A
+S31508004160000000000000000000070000000000003A
+S31508004170000000000003000000000000000000002E
+S31508004180213E0008253F0008713E0008CD020008C0
+S315080041905D3F000800000000000500000000000068
+S315080041A000000000000800000000000000000000F9
+S315080041B04F70656E424C540000C0000C0040000071
+S315080041C0030000000000010C00400000040000008D
+S315080041D00040010C00400000050000000080010CB2
+S315080041E0004000000600000000C0010C004000006E
+S315080041F0070000000000020C000002000800000092
+S315080042000000040C00000400090000000000080C6F
+S31508004210000004000A00000000000C0C0000040066
+S315080042200B0000000000100C000004000C00000049
+S315080042300000140C000004000D0000000000180C1B
+S31508004240000004000E00000000001C0C0000040022
+S315080042500F00000057696E5553422042756C6B205B
+S3150800426044657669636500004F70656E424C54205C
+S31508004270557365720000000098420008400100204E
+S31508004280F00000003C0200088843000830020020C5
+S31508004290DC0C0000580200080000000000000000C6
+S315080042A000C0014800000000000000003F000000B8
+S315080042B000000000000000000000000000000000F0
+S315080042C000000000000000000000000000000000E0
+S315080042D000000000000000000000000000000000D0
+S315080042E000000000000000000000000000000000C0
+S315080042F000000000000000000000000000000000B0
+S3150800430048010020D90E0008030000000000000044
+S315080043100030313233343536373839414243444533
+S315080043204600000000000000000000000000000039
+S31508004330000000004C40000868420008544200088B
+S31508004340B901002000000000000000000000000085
+S315080043500000000000FF0000000000000000000050
+S31508004360A93D00089F04002010000C000000000072
+S31508004370000000000000000000000000040000002B
+S30D08004380000000000000000027
S70508000201EF
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvoptx b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvoptx
index 0b1b0310f..1229f1e4c 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvoptx
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvoptx
@@ -1431,7 +1431,7 @@
Lib/FatFS
- 1
+ 0000
@@ -1547,7 +1547,7 @@
Lib/TinyUSB
- 0
+ 1000
@@ -2243,7 +2243,7 @@
Core/ARMCM4_XMC4
- 0
+ 1000
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvprojx b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvprojx
index 670107fbe..bdf14338c 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvprojx
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/ide/xmc4700.uvprojx
@@ -336,7 +336,7 @@
00
- --diag_suppress=111
+ --diag_suppress=111, --diag_suppress=66, --diag_suppress=188XMC4700_F144x2048 XMC_ETH_PHY_KSZ8081RNB..\..\Boot;..\lib;..\lib\cmsis;..\lib\xmclib\inc;..\lib\FatFS;..\lib\FatFS\SDMMC_BLOCK;..\lib\TinyUSB\cfg;..\lib\TinyUSB\src;..\lib\uip;..\..\..\..\Source;..\..\..\..\Source\ARMCM4_XMC4;..\..\..\..\Source\third_party\fatfs\src;..\..\..\..\Source\third_party\uip\uip;..\..\..\..\Source\third_party\uip\apps\dhcpc
@@ -957,6 +957,57 @@
usb_descriptors.c1..\lib\TinyUSB\cfg\usb_descriptors.c
+
+
+ 2
+ 0
+ 0
+ 0
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 11
+
+
+ 1
+
+
+
+ 2
+ 0
+ 2
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+
+
+
+
+
+
+
+
+ dcd_dwc2.c
@@ -1292,6 +1343,57 @@
usb.c1..\..\..\..\Source\ARMCM4_XMC4\usb.c
+
+
+ 2
+ 0
+ 0
+ 0
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 11
+
+
+ 1
+
+
+
+ 2
+ 0
+ 2
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+ 0
+ 0
+ 2
+ 2
+ 2
+ 2
+ 2
+
+
+
+
+
+
+
+
+
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/tusb_config.h b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/tusb_config.h
index 0dc157b03..e53b1a384 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/tusb_config.h
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/tusb_config.h
@@ -30,6 +30,31 @@
extern "C" {
#endif
+// ================= IMPORTANT - Keil Linker Issue Workaround =================
+// The Keil MDK linker removes certain callback functions, even though they are
+// actually used. It seems to apply to certain callbacks specified with the
+// TU_ATTR_WEAK attribute. For example, the following callbacks are removed:
+//
+// - tud_descriptor_bos_cb (usb_descriptors.c)
+// - tud_vendor_control_xfer_cb (usb_descriptors.c)
+// - tud_mount_cb (usb.c)
+// - tud_umount_cb (usb.c)
+// - tud_suspend_cb (usb.c)
+// - tud_resume_cb (usb.c)
+//
+// To fix this problem, uncheck the One ELF Section per Function" compiler
+// option. Unfortunately, actually unused functions are then also not
+// remmove, resulting in an unnecessarily large ROM footprint. The
+// workaround is to uncheck the "One ELF Section per Function" option for
+// just the affected source-files:
+// - usb_descriptors.c
+// - usb.c
+//
+// You can do so by right-clicking the individual source-file and selecting
+// "Options for file xxx". The go the to "C/C++" tab and uncheck the
+// "One ELF Section per Function" option.
+
+
//--------------------------------------------------------------------+
// Board Specific Configuration
//--------------------------------------------------------------------+
@@ -71,6 +96,11 @@
// require tud_int_handler() to be called continuously in the program's infinite loop.
#define CFG_TUSB_POLLING_ENABLED 1
+// Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+// makes it possible to automatically install WinUSB devices without having to provide
+// a device specific INF file.
+#define CFG_TUD_WINUSB_ENABLED 1
+
/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
* Tinyusb use follows macros to declare transferring memory so that they can be put
* into those specific section.
diff --git a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/usb_descriptors.c b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/usb_descriptors.c
index f90e1e7a2..dc44939b8 100644
--- a/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/usb_descriptors.c
+++ b/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_Kit_Keil/Boot/lib/TinyUSB/cfg/usb_descriptors.c
@@ -24,33 +24,88 @@
*/
#include "tusb.h"
+#include "xmc_common.h"
-/* USB Vendor and Product identifiers. */
-#define USB_VID (0x1d50)
-#define USB_PID (0x60ac)
+
+#define USB_VID 0x1D50 // OpenMoko
+#define USB_PID 0x60AC // OpenBLT Bootloader
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+#define USB_BCD 0x0201 // Needs to be >= 2.01 for BOS
+#else
+#define USB_BCD 0x0200
+#endif
+
+//--------------------------------------------------------------------+
+// Unique ID string
+//--------------------------------------------------------------------+
+// Length of the unique ID in bytes. On the XMC4xxx, the unique chip
+// identifier is 16 bytes.
+#define UID_STR_BYTE_LEN (16U)
+
+// NUL terminated character array for storing the device's unique
+// identifier. Callback function tud_descriptor_string_cb() overwrites
+// its default value with the actual device's unique identifier.
+static char uniqueIdStr[(UID_STR_BYTE_LEN * 2U) + 1U] = "0123456789ABCDEF";
+
+
+// Initializes the string that holds the ASCII representation of the device's
+// unique identifier.
+static void UniqueIdStrInit(void)
+{
+ uint8_t charIdx = 0U;
+ static uint8_t initialized = 0U;
+
+ // Only initialize once.
+ if (initialized == 0U)
+ {
+ // Update flag.
+ initialized = 1U;
+ // Loop through all unique identifier bytes.
+ for (uint8_t idx = 0U; idx < UID_STR_BYTE_LEN; idx++)
+ {
+ // Convert byte value to nibbles.
+ uint8_t nibbles[2];
+ nibbles[0] = (g_chipid[idx] >> 4U) & 0x0F;
+ nibbles[1] = g_chipid[idx] & 0x0F;
+ // Loop through the nibbles.
+ for (uint8_t n = 0U; n < sizeof(nibbles); n++)
+ {
+ // Convert the nibble to an ASCII character.
+ char nibbleChr = (nibbles[n] < 10U) ? nibbles[n] + '0' : nibbles[n] - 10 + 'A';
+ // Store the ASCII character in the string.
+ uniqueIdStr[charIdx] = nibbleChr;
+ // Update indexer for the next character.
+ charIdx++;
+ }
+ }
+ // Add NUL termination.
+ uniqueIdStr[charIdx] = '\0';
+ }
+}
//--------------------------------------------------------------------+
// Device Descriptors
//--------------------------------------------------------------------+
tusb_desc_device_t const desc_device =
{
- .bLength = sizeof(tusb_desc_device_t),
- .bDescriptorType = TUSB_DESC_DEVICE,
- .bcdUSB = 0x0200,
- .bDeviceClass = 0x00,
- .bDeviceSubClass = 0x00,
- .bDeviceProtocol = 0x00,
- .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
-
- .idVendor = USB_VID,
- .idProduct = USB_PID,
- .bcdDevice = 0x0200,
-
- .iManufacturer = 0x01,
- .iProduct = 0x02,
- .iSerialNumber = 0x03,
-
- .bNumConfigurations = 0x01
+ .bLength = sizeof(tusb_desc_device_t),
+ .bDescriptorType = TUSB_DESC_DEVICE,
+ .bcdUSB = USB_BCD,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+
+ .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
+
+ .idVendor = USB_VID,
+ .idProduct = USB_PID,
+ .bcdDevice = 0x0100,
+
+ .iManufacturer = 0x01,
+ .iProduct = 0x02,
+ .iSerialNumber = 0x03,
+
+ .bNumConfigurations = 0x01
};
// Invoked when received GET DEVICE DESCRIPTOR
@@ -78,7 +133,7 @@ enum
uint8_t const desc_fs_configuration[] =
{
// Config number, interface count, string index, total length, attribute, power in mA
- TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
+ TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 150),
// Interface number, string index, EP Out & EP In address, EP size
TUD_VENDOR_DESCRIPTOR(ITF_NUM_VENDOR, 0, EPNUM_VENDOR_OUT, EPNUM_VENDOR_IN, 64),
@@ -94,6 +149,103 @@ uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
return desc_fs_configuration;
}
+#if (CFG_TUD_WINUSB_ENABLED == 1)
+//--------------------------------------------------------------------+
+// BOS Descriptor
+//--------------------------------------------------------------------+
+
+/* Microsoft OS 2.0 registry property descriptor per MS requirements:
+ * https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx
+ * device should create DeviceInterfaceGUID. It can be done by driver and
+ * in case of real PnP solution device should expose MS "Microsoft OS 2.0
+ * registry property descriptor". Such descriptor can insert any record
+ * into Windows registry per device/configuration/interface. In our case it
+ * will insert "DeviceInterfaceGUID" string property.
+ */
+
+#define BOS_TOTAL_LEN (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)
+
+#define MS_OS_20_DESC_LEN 0x9E
+
+#define VENDOR_REQUEST_MICROSOFT 1
+
+// BOS Descriptor is required for MS OS 2.0.
+uint8_t const desc_bos[] =
+{
+ // total length, number of device caps
+ TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),
+
+ // Microsoft OS 2.0 descriptor
+ TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, VENDOR_REQUEST_MICROSOFT)
+};
+
+uint8_t const * tud_descriptor_bos_cb(void)
+{
+ return desc_bos;
+}
+
+uint8_t const desc_ms_os_20[] =
+{
+ // Set header: length, type, windows version, total length
+ U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),
+
+ // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID
+ U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible
+
+ // MS OS 2.0 Registry property descriptor: length, type
+ U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),
+ U16_TO_U8S_LE(0x0001), U16_TO_U8S_LE(0x0028), // wPropertyDataType, wPropertyNameLength and PropertyName "DeviceInterfaceGUID\0" in UTF-16
+ 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,
+ 'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00,
+
+ U16_TO_U8S_LE(0x004E), // wPropertyDataLength
+ //bPropertyData: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0"
+ '{', 0x00, '8', 0x00, '0', 0x00, '7', 0x00, '9', 0x00, '9', 0x00, '9', 0x00, 'C', 0x00, '3', 0x00, '-', 0x00,
+ 'E', 0x00, '4', 0x00, 'E', 0x00, '0', 0x00, '-', 0x00, '4', 0x00, '0', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00,
+ '8', 0x00, '1', 0x00, '8', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '8', 0x00, 'E', 0x00, '8', 0x00, '5', 0x00,
+ '2', 0x00, 'B', 0x00, '5', 0x00, '4', 0x00, 'F', 0x00, '2', 0x00, 'B', 0x00, '}', 0x00, 0x00, 0x00
+};
+
+TU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, "Incorrect size");
+
+bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
+{
+ // nothing to with DATA & ACK stage
+ if (stage != CONTROL_STAGE_SETUP) return true;
+
+ switch (request->bmRequestType_bit.type)
+ {
+ case TUSB_REQ_TYPE_VENDOR:
+ switch (request->bRequest)
+ {
+ case VENDOR_REQUEST_MICROSOFT:
+ if ( request->wIndex == 7 )
+ {
+ // Get Microsoft OS 2.0 compatible descriptor
+ uint16_t total_len;
+ memcpy(&total_len, desc_ms_os_20+8, 2);
+
+ return tud_control_xfer(rhport, request, (void*)(uintptr_t) desc_ms_os_20, total_len);
+ }else
+ {
+ return false;
+ }
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // stall unknown request
+ return false;
+}
+#endif /* (CFG_TUD_WINUSB_ENABLED == 1) */
+
//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+
@@ -104,7 +256,7 @@ char const* string_desc_arr [] =
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"OpenBLT User", // 1: Manufacturer
"WinUSB Bulk Device", // 2: Product
- "123456789012", // 3: Serials, should use chip ID
+ uniqueIdStr, // 3: Serials, use chip ID
};
static uint16_t _desc_str[32];
@@ -117,6 +269,9 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
uint8_t chr_count;
+ // Make sure the unique identifier string is initialized.
+ UniqueIdStrInit();
+
if ( index == 0)
{
memcpy(&_desc_str[1], string_desc_arr[0], 2);
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/.settings/language.settings.xml b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/.settings/language.settings.xml
index 246ac2863..0580664f1 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/.settings/language.settings.xml
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/.settings/language.settings.xml
@@ -5,8 +5,7 @@
-
-
+
@@ -17,11 +16,10 @@
-
-
+
-
+
\ No newline at end of file
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Boot Debug.launch b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Boot Debug.launch
index 4eb0eec69..a1640502b 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Boot Debug.launch
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Boot Debug.launch
@@ -1,73 +1,73 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Debug/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Debug/openblt_stm32f746.srec
index 80b6d11de..aea3972b8 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Debug/openblt_stm32f746.srec
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/Debug/openblt_stm32f746.srec
@@ -1,1413 +1,1457 @@
S01900006F70656E626C745F73746D3332663734362E73726563F8
-S31508000000000005202D070008F9060008FB06000871
-S31508000010FD060008FF0600080107000800000000AA
-S3150800002000000000000000000000000003070008B0
-S315080000300507000800000000070700080907000870
-S315080000407D0700087D0700087D0700087D07000872
-S315080000507D0700087D0700087D0700087D07000862
-S315080000607D0700087D0700087D0700087D07000852
-S315080000707D0700087D0700087D0700087D07000842
-S315080000807D0700087D0700087D0700087D07000832
-S315080000907D0700087D0700087D0700087D07000822
-S315080000A07D0700087D0700087D0700087D07000812
-S315080000B07D0700087D0700087D0700087D07000802
-S315080000C07D0700087D0700087D0700087D070008F2
-S315080000D07D0700087D0700087D0700087D070008E2
-S315080000E07D0700087D0700087D0700087D070008D2
-S315080000F07D0700087D0700087D0700087D070008C2
-S315080001007D0700087D0700087D0700087D070008B1
-S315080001107D0700087D0700087D0700087D070008A1
-S315080001207D0700087D0700087D0700087D07000891
-S315080001307D0700087D0700087D0700087D07000881
-S315080001407D0700087D0700087D0700087D07000871
-S315080001507D0700087D0700087D0700087D07000861
-S315080001607D0700087D0700087D0700087D07000851
-S315080001707D0700087D0700087D07000800000000CD
-S315080001807D0700087D0700087D0700087D07000831
-S315080001907D0700087D0700087D0700087D07000821
-S315080001A07D0700087D0700087D0700087D07000811
-S315080001B07D0700087D0700087D0700087D07000801
-S30D080001C07D0700087D07000811
+S315080000000000052035070008010700080307000857
+S315080000100507000807070008090700080000000090
+S315080000200000000000000000000000000B070008A8
+S315080000300D070008000000000F0700081107000858
+S315080000408507000885070008850700088507000852
+S315080000508507000885070008850700088507000842
+S315080000608507000885070008850700088507000832
+S315080000708507000885070008850700088507000822
+S315080000808507000885070008850700088507000812
+S315080000908507000885070008850700088507000802
+S315080000A085070008850700088507000885070008F2
+S315080000B085070008850700088507000885070008E2
+S315080000C085070008850700088507000885070008D2
+S315080000D085070008850700088507000885070008C2
+S315080000E085070008850700088507000885070008B2
+S315080000F085070008850700088507000885070008A2
+S315080001008507000885070008850700088507000891
+S315080001108507000885070008850700088507000881
+S315080001208507000885070008850700088507000871
+S315080001308507000885070008850700088507000861
+S315080001408507000885070008850700088507000851
+S315080001508507000885070008850700088507000841
+S315080001608507000885070008850700088507000831
+S3150800017085070008850700088507000800000000B5
+S315080001808507000885070008850700088507000811
+S315080001908507000885070008850700088507000801
+S315080001A085070008850700088507000885070008F1
+S315080001B085070008850700088507000885070008E1
+S30D080001C0850700088507000801
S315080001C810B5054C237833B9044B13B10448AFF37B
-S315080001D800800123237010BDC40000200000000021
-S315080001E85C55000808B5034B1BB103490348AFF330
-S315080001F8008008BD00000000C80000205C55000803
-S3150800020808B504F085FC08BD08B504F08FFC08BDE0
+S315080001D800800123237010BD8C0100200000000058
+S315080001E8C856000808B5034B1BB103490348AFF3C3
+S315080001F8008008BD0000000090010020C8560008CD
+S3150800020808B504F0D9FC08BD08B504F0E3FC08BD38
S3150800021808B5054B1B6913F4005F01D0002008BD1B
S3150800022800F03EF80120FAE70008024008B5642005
S3150800023800F008F808BD08B500F00AF808BD7047C8
-S3150800024870477047014B1880704700BFE0000020D0
-S3150800025808B504F01FFA0E4B1B6898420FD30D4BCE
+S3150800024870477047014B1880704700BFA801002007
+S3150800025808B504F067FA0E4B1B6898420FD30D4B86
S315080002681B786BB90B4B01221A700B4B80229A61CB
-S3150800027804F010FA094B1B881844054B186008BD8A
+S3150800027804F058FA094B1B880344054A136008BD5D
S31508000288044B00221A70044B4FF400029A61EFE7F8
-S31508000298E4000020E200002000040240E0000020FC
+S31508000298AC010020AA01002000040240A8010020A1
S315080002A8024B4FF400029A61704700BF00040240EF
-S315080002B870B58CB000240794089409940A940B9492
-S315080002C8234B1A6B42F004021A631A6B02F00402F3
-S315080002D80592059A1A6B42F080021A631A6B02F0A5
-S315080002E880020492049A1A6B42F008021A631A6B7F
-S315080002F802F008020392039A1A6B42F001021A6383
-S315080003081A6B02F001020292029A1A6B42F0020272
-S315080003181A631B6B03F002030193019B0D4E4FF4FE
-S315080003280003B3610CAD4FF4005345F8183D294650
-S31508000338094801F09BFF8023069301230793089435
-S3150800034809940A942946304601F090FF0CB070BD0E
+S315080002B830B58DB0002406940794089409940A94D6
+S315080002C80B94234B1A6B42F004021A631A6B02F05A
+S315080002D804020592059A1A6B42F080021A631A6B91
+S315080002E802F080020492049A1A6B42F008021A6312
+S315080002F81A6B02F008020392039A1A6B42F001027B
+S315080003081A631A6B02F001020292029A1A6B42F0F9
+S3150800031802021A631B6B03F002030193019B0D4D3E
+S315080003284FF40003AB614FF40053069306A90A4835
+S3150800033801F0B8FF802306930123079308940994CC
+S315080003480A9406A9284601F0ADFF0DB030BD00BFD6
S315080003580038024000040240000802402DE9F04136
S3150800036890B0002409940A940B940C940D940E9456
-S315080003780F9406940794274B1A6C42F480221A6441
-S315080003881A6C02F480220292029A1A6B42F0080248
-S315080003981A631B6B03F008030193019B4FF48073E0
-S315080003A803934FF00208CDF8108003270597072610
-S315080003B80896194D03A9284601F058FF4FF400730B
-S315080003C80393CDF81080059706940794089603A911
-S315080003D8284601F04BFF4FF4E13309930A940B942E
-S315080003E80C940C230D930E940F940C4C09A92046D3
-S315080003F802F024FA636823F490436360A36823F041
-S315080004082A03A360236843F00103236010B0BDE8FC
-S31508000418F08100BF00380240000C02400048004046
-S3150800042808B5364A136823F00F0343F00703136029
-S31508000438324B1B6803F00F03072BF9D1304B1A68A8
-S3150800044842F440421A601A6842F480321A6003F588
-S31508000458E4331A6842F480221A601A6842F4803231
-S315080004681A60284B1B6813F4003FFAD0254B5A68C4
-S3150800047825491140254A0A435A605A6824491140B1
-S31508000488244A0A435A601A6842F080721A601D4B59
-S315080004981B6813F0007FFAD01A4B9A6822F0F0020C
-S315080004A89A609A6822F4E05242F4A0529A609A68CE
-S315080004B822F4604242F400429A609A6822F00302E3
-S315080004C842F002029A600F4B9B6803F00C03082B54
-S315080004D8F9D1114802F0DEFF002000F063F9094B54
-S315080004E8D3F8902022F00062C3F89020D3F8902021
-S315080004F822F03002C3F8902008BD00BF003C024035
-S3150800050800700040003802400080BCFF086C4000BC
-S315080005180080BFF0086C400900E6DF0C08B500F05B
-S3150800052867F9FFF77DFFFFF7C3FEFFF717FFFFF72A
-S3150800053867FEFFF769FEFCE782B00A4B1A6C42F0C1
-S3150800054880521A641A6C02F080520092009A5A6C09
-S3150800055842F480425A645B6C03F480430193019B1E
-S3150800056802B070470038024000B589B000230393EB
-S3150800057804930593069307930268144B9A4202D08C
-S3150800058809B05DF804FB03F5EA331A6C42F0007209
-S315080005981A641A6C02F000720192019A1A6B42F0F8
-S315080005A802021A631B6B03F002030293029B4FF4C1
-S315080005B8407303930223049303230693092307939B
-S315080005C803A9034800F0D4FDDAE700BF0064004039
-S315080005D80004024010B588B00023039304930593DA
-S315080005E8069307930368B3F1A04F01D008B010BD6E
-S315080005F8144C236B43F001032363236B03F00103B5
-S315080006080093009B4FF4C0530393022304930323D8
-S3150800061806930A23079303A90B4800F0A9FD636B01
-S3150800062843F080036363636B03F080030193019BC4
-S31508000638636C43F480436364636C03F480430293F6
-S31508000648029BD3E7003802400000024008B5036859
-S31508000658B3F1A04F00D008BD054A536B23F08003B9
-S3150800066853634FF4C051034800F070FEF3E700BF28
-S31508000678003802400000024010B501F08FFE174C02
-S315080006884FF40003A361164801F032FD154801F03E
-S315080006982FFD204601F02CFD134801F029FD134BC8
-S315080006A81A6C22F480221A641A6B22F008021A635A
-S315080006B81A6B22F004021A631A6B22F002021A63F2
-S315080006C81A6B22F001021A631A6C22F080521A6415
-S315080006D85A6C22F480425A6410BD00BF00040240D6
-S315080006E8000C0240000802400000024000380240A0
-S315080006F87047FEE7FEE7FEE7FEE770477047704774
-S3150800070808B500F081F808BD054BD3F8882042F4EF
-S315080007187002C3F888204FF000629A60704700BFDD
-S3150800072800ED00E0DFF834D0002103E00C4B5B58FD
-S31508000738435004310B480C4B42189A42F6D30B4ADD
-S3150800074802E0002342F8043B094B9A42F9D3FFF723
-S31508000758DBFF04F0DBFEFFF7E1FE7047000005202B
-S315080007683457000800000020C4000020C4000020F8
-S31508000778A0100020FEE7000010B5094B4FF0FF3225
-S315080007881A6200241C625A625C621A611C615A6108
-S315080007985C619A619C61FFF76FFF204610BD00BF38
-S315080007A80038024010B504460E4B18784FF47A7391
-S315080007B8B3FBF0F30C4A1068B0FBF3F000F014FB37
-S315080007C868B90F2C01D901200AE0002221464FF00A
-S315080007D8FF3000F0D7FA054B1C60002000E0012026
-S315080007E810BD00BF040000200000002008000020FB
-S315080007F808B5032000F0B4FA0020FFF7D3FFFFF787
-S315080008089BFE002008BD0000034A1168034B1B78AD
-S315080008180B441360704700BF400E002004000020F8
-S3150800082838B5044603F03EFF0546B4F1FF3F02D04B
-S31508000838044B1B781C4403F035FF401BA042FAD32F
-S3150800084838BD00BF04000020002800F0A18038B594
-S31508000858044690F82030D3B12268136823F00203BF
-S31508000868136003F01FFF054623685A6812F0020F43
-S3150800087810D003F017FF401B0A28F5D9636A43F41A
-S3150800088800336362052384F82030012038BDFFF75A
-S315080008986BFEE1E71A6842F001021A6003F002FFEC
-S315080008A8054623685A6812F0010F0DD103F0FAFEBF
-S315080008B8401B0A28F5D9636A43F4003363620523A3
-S315080008C884F820300120E1E7227E012A3DD01A6803
-S315080008D822F080021A60637E012B3BD022681368D7
-S315080008E823F040031360A37E012B39D022681368CE
-S315080008F823F020031360E37E012B37D022681368A0
-S3150800090843F010031360237F012B35D02268136840
-S3150800091823F008031360637F012B33D0226813681A
-S3150800092823F004031360A368E26813432269134398
-S31508000938626913436268013A21681343CB61002050
-S315080009486062012384F82030A0E71A6842F0800222
-S315080009581A60C0E72268136843F040031360C2E7C9
-S315080009682268136843F020031360C4E722681368F3
-S3150800097823F010031360C6E72268136843F00803D8
-S315080009881360C8E72268136843F004031360CAE7CC
-S315080009980120704790F82030013BDBB2012B05D9BE
-S315080009A8436A43F4802343620120704770B4434B7B
-S315080009B8D3F8002242F00102C3F80022D3F8002235
-S315080009C822F47C52C3F80022D3F80022486A42EA85
-S315080009D80022C3F800224A6902F01F02012000FA21
-S315080009E802F2D3F81C42D0430440C3F81C42CB6930
-S315080009F8B3B9324BD3F80C420440C3F80C42CE685C
-S31508000A088D884C6945EA0645483443F834508E685B
-S31508000A180C884D6944EA0644483503EBC5035C600F
-S31508000A28CB69012B1DD08B69002B32D1234CD4F806
-S31508000A3804320340C4F804320B698BBB1F4BD3F846
-S31508000A4814422040C3F814020B6A012B2FD01B4A04
-S31508000A58D2F8003223F00103C2F80032002070BC35
-S31508000A687047164BD3F80C421443C3F80C420E6869
-S31508000A788D884C6945EA0645483443F834508E68EB
-S31508000A888C894D6944EA0644483503EBC5035C601E
-S31508000A98C9E70A4CD4F804321343C4F80432CBE73E
-S31508000AA80648D0F814321343C0F81432CCE7034981
-S31508000AB8D1F81C321A43C1F81C22C8E70064004062
-S31508000AC838B590F82030DBB2012B05D0436A43F4D9
-S31508000AD800234362012038BD0446022380F82030EB
-S31508000AE80268136823F00103136003F0DBFD05466B
-S31508000AF823685B6813F0010F0DD003F0D3FD401B84
-S31508000B080A28F5D9636A43F400336362052384F82F
-S31508000B1820300120DFE700206062DCE770B490F837
-S31508000B2820400568AD68013CE4B2012C06D9436A41
-S31508000B3843F480234362012070BC704715F0E05FD8
-S31508000B485BD0C5F30165022D3ED80124AC401C6074
-S31508000B588B68002B3ED10E68CB68046843EA465674
-S31508000B6805F118031B01E65003680C6905F1180618
-S31508000B7803EB06135C600B7D012B36D0D17993798C
-S31508000B881B0443EA0163517943EA0123147901688E
-S31508000B9823432C012144C1F88C31D17893781B045E
-S31508000BA843EA0163517843EA0123117802680B4343
-S31508000BB82244C2F88831026818352D01535943F082
-S31508000BC8010353510020B7E7436A43F4000343621D
-S31508000BD80120B1E74C6843EAC403CC680668234396
-S31508000BE805F1180424013351BEE7036803EB06131D
-S31508000BF8596841F480715960C0E7436A43F40013A1
-S31508000C084362012098E790F82030013BDBB2012BBC
-S31508000C1801D90020704703689B68890631EA0303EF
-S31508000C2801D0012070470020704730B490F8204062
-S31508000C38013CE4B2012C06D9436A43F48023436293
-S31508000C48012030BC704700296FD10468E46814F0A5
-S31508000C58030F64D0056801F11B0424012C5904F01C
-S31508000C6804049460002C6BD1056801F11B04240167
-S31508000C782C59640D1460056801F11B0424012D59CB
-S31508000C8805F00205D560056825446D6805F00F0569
-S31508000C981561056825446D68C5F3072595610568D6
-S31508000CA82C446468240C546104680A011444D4F872
-S31508000CB8B8411C7004681444D4F8B841C4F307242E
-S31508000CC85C7004681444D4F8B841C4F307449C70AB
-S31508000CD804681444D4F8B841240EDC700468144433
-S31508000CE8D4F8BC411C7104681444D4F8BC41C4F354
-S31508000CF807245C7104681444D4F8BC41C4F3074457
-S31508000D089C7104682244D2F8BC21120EDA71F9B92A
-S31508000D180268D36843F02003D360002091E7436A4A
-S31508000D2843F40013436201208BE70468246914F02E
-S31508000D38030F8FD1436A43F400134362012080E707
-S31508000D48056801F11B0424012C59E408546092E74C
-S31508000D580268136943F020031361002071E7000055
-S31508000D680649CB6823F4E0631B041B0C000200F455
-S31508000D78E0600343024A1A43CA60704700ED00E080
-S31508000D880000FA0530B4154BDB68C3F30223C3F138
-S31508000D980704042C28BF04241D1D062D14D9033B5B
-S31508000DA84FF0FF3505FA04F421EA0401994005FADB
-S31508000DB803F322EA03031943002807DB0901C9B22A
-S31508000DC8074B195430BC70470023E9E700F00F00B9
-S31508000DD80901C9B2034B1954F4E700BF00ED00E056
-S31508000DE800E400E014ED00E00138B0F1807F0AD293
-S31508000DF8064B5860064AF02182F8231000209860AE
-S31508000E0807221A6070470120704700BF10E000E00B
-S31508000E1800ED00E010B40A490C6924F440740C612A
-S31508000E280C6944F440740C610C6944F001040C61C3
-S31508000E3802604360BFF34F8F5DF8044B704700BFED
-S31508000E48003C0240084B1A6922F440721A611A6972
-S31508000E5842F400721A611A6942F001021A610160C5
-S31508000E68BFF34F8F704700BF003C0240084B1A6912
-S31508000E7822F440721A611A6942F480721A611A6970
-S31508000E8842F001021A610180BFF34F8F704700BF15
-S31508000E98003C0240074B1A6922F440721A611A6923
-S31508000EA81A611A6942F001021A610170BFF34F8F7D
-S31508000EB8704700BF003C02401A4BDB6813F0020F6C
-S31508000EC804D0194A936943F020039361154BDB68EC
-S31508000ED813F0100F04D0144A936943F01003936172
-S31508000EE8104BDB6813F0200F04D00F4A936943F0C0
-S31508000EF8080393610B4BDB6813F0400F04D00A4ACA
-S31508000F08936943F004039361064BDB6813F0800F7B
-S31508000F1804D0054A936943F002039361014BF22210
-S31508000F28DA607047003C0240440E0020094B1B69F2
-S31508000F38002B01DB00207047064B074A5A6002F16E
-S31508000F4888325A601B69002B01DB00207047012094
-S31508000F58704700BF003C024023016745034A1369EE
-S31508000F6843F0004313610020704700BF003C02406D
-S31508000F7838B50446164B00229A6103F093FB0546DA
-S31508000F88144BDB6813F4803F0AD0B4F1FF3FF7D05F
-S31508000F98CCB103F087FB401BA042F1D903200DE032
-S31508000FA80C4BDB6813F0F20F09D10A4BDB6813F018
-S31508000FB8010F0AD0074B0122DA60002038BDFFF777
-S31508000FC87BFF0120FAE70320F8E70020F6E700BFD1
-S31508000FD8440E0020003C0240F8B51E4C247D012C26
-S31508000FE835D01F4616460D4604461A4B01221A7571
-S31508000FF84CF25030FFF7BCFF014698B9032C07D8C6
-S31508001008DFE804F002151A1FF1B22846FFF742FF77
-S315080010184CF25030FFF7ACFF01460F4A136923F02C
-S31508001028010313610B4B00221A750846F8BDB1B2C5
-S315080010382846FFF71BFFEBE731462846FFF702FF6E
-S31508001048E6E732463B462846FFF7E4FEE0E7022194
-S31508001058EBE700BF440E0020003C0240084B1A6923
-S3150800106822F440721A611A6942F004021A611A696E
-S3150800107842EA002040F480301861BFF34F8F70476A
-S31508001088003C024010B449B1012923D0022902D0F4
-S315080010984FF4407403E04FF4007400E000240F4B4B
-S315080010A8196921F4407119611A6922431A611A6982
-S315080010B822F0F8021A611A6942EAC00040F00200F2
-S315080010C818611A6942F480321A61BFF34F8F5DF8C6
-S315080010D8044B70474FF48074E1E700BF003C0240B8
-S315080010E8214B1B7D012B3CD070B50E4604461E4B82
-S315080010F801221A754CF25030FFF73AFF024658BBE0
-S315080011084FF0FF3333602368012B16D06568A36850
-S3150800111861680B44AB421FD9217B2846FFF7B2FF0B
-S315080011284CF25030FFF724FF104A136923F07A036C
-S315080011381361024678B90135E9E7207BFFF78EFF88
-S315080011484CF25030FFF714FF024608490B6923F0A2
-S3150800115804030B6100E03560034B0021197510463E
-S3150800116870BD022210467047440E0020003C02401B
-S3150800117800230F2B00F2E180F0B583B039E009228D
-S3150800118800E00022B2403A4302346C4E46F8242066
-S315080011986B4A1468EA4302EA04064F6817F4803F64
-S315080011A801D045EA0406664C2660646802EA040625
-S315080011B84F6817F4003F01D045EA0406604C66609C
-S315080011C8A46802EA04064F6817F4801F01D045EAA6
-S315080011D804065B4CA660E46822404E6816F4001FB5
-S315080011E801D045EA0402564CE26001330F2B00F29F
-S315080011F8A28001229A400C6804EA0205AA42F4D1A0
-S315080012084C68661E112C18BF012E01D9122C12D152
-S3150800121886685F000324BC4026EA0406CC68BC40FE
-S3150800122834438460466826EA02064C68C4F300120A
-S315080012389A4032434260C2685F000326BE40F643BE
-S3150800124832408C68BC401443C4604A68122A18BFE6
-S31508001258022A13D1DC08083450F824E003F0070200
-S315080012684FEA820C0F2202FA0CF22EEA020E0A69DB
-S3150800127802FA0CF242EA0E0240F8242002681640E6
-S315080012884A6802F00302BA40324302604A6812F01A
-S31508001298805FAAD02B4A546C44F480445464526C38
-S315080012A802F480420192019A9C08A61C234A52F825
-S315080012B8267003F0030296000F22B24027EA0207B7
-S315080012C8214A90423FF45DAF02F58062904222D0EF
-S315080012D802F58062904220D002F5806290421ED0C4
-S315080012E802F5806290421CD002F5806290421AD0BC
-S315080012F802F58062904218D002F58062904216D0B4
-S3150800130802F58062904214D002F5806290423FF45A
-S3150800131836AF0A2236E7012234E7022232E70322E9
-S3150800132830E704222EE705222CE706222AE70722B9
-S3150800133828E7082226E703B0F0BD704700380140C1
-S31508001348003C0140003802400000024000230F2BF1
-S3150800135800F29480F0B529E0092700E0002707FA8B
-S3150800136805F5B54271D005685E000324B440E44328
-S3150800137825400560DD08083550F8256003F007079D
-S315080013884FEA870C0F2707FA0CF726EA070640F8EC
-S315080013982560C5682540C560456825EA0202426099
-S315080013A882681440846001330F2B66D801229A405C
-S315080013B802EA0104A242F6D14FEA930E0EF102069A
-S315080013C82F4D55F8266003F00305AD004FF00F0CB6
-S315080013D80CFA05FC0CEA06062A4FB842BED007F5F1
-S315080013E88067B84221D007F58067B8421FD007F54D
-S315080013F88067B8421DD007F58067B8421BD007F545
-S315080014088067B84219D007F58067B84217D007F53C
-S315080014188067B84215D007F58067B84213D007F534
-S315080014288067B84298D00A2799E7012797E70227DD
-S3150800143895E7032793E7042791E705278FE7062704
-S315080014488DE707278BE7082789E70F4D2E68E443BA
-S3150800145826402E606E6826406E60AE682640AE60EE
-S31508001468EE683440EC60064E0EF1020456F8245035
-S3150800147825EA0C0546F8245075E7F0BD704700BF05
-S315080014880038014000000240003C01402DE9F047C1
-S3150800149882B00768CA00521A930003445A6D1B6D36
-S315080014A89A4257D8B8469B1AC1EBC104A20002440F
-S315080014B8526C9A4200D31A460C46064602F1030AAB
-S315080014C84FEA9A0A16E009F1030A4FEA9A0AE3006C
-S315080014D81B1B9D003544A96C337C00931FFA89F3BE
-S315080014E8E2B2384601F086FDAB6C4B44AB646B6DD3
-S315080014F84B446B6508EB441303F510639B699BB271
-S31508001508534513D3E3001B1B9A003244516D136DE0
-S3150800151899420BD253B15B1AC4EBC4018A00324410
-S31508001528D2F844909945CED39946CCE7E3001B1BDD
-S3150800153898000644326D736D9A420FD804F00F046A
-S315080015480121A140D7F8344824EA0104C7F83448E9
-S31508001558002000E0012002B0BDE8F0870020FAE785
-S31508001568F0B58BB0002800F091800446056890F81D
-S31508001578BD3323B3032384F8BD33EB6B13F4807FA1
-S3150800158801D100232361206801F0C4FA254655F8DD
-S31508001598107B6E460FCD0FC60FCD0FC695E8030014
-S315080015A886E80300231D0ECB384601F0F9F958B131
-S315080015B8022384F8BD33012528460BB0F0BD80F810
-S315080015C8BC33FFF707F8D5E70021206801F0A8FA29
-S315080015D8002315E0D900C81A82002244012082F89F
-S315080015E83D0082F83C30A2F84230002082F83F00DD
-S315080015F850649064CA1A9100214408650133DBB225
-S315080016086568AB42E6D3002315E0D800C11A8A00FC
-S315080016182244002182F8FD1182F8FC3182F8FF1174
-S31508001628C2F80412C2F80812C21A90002044C0F878
-S3150800163810120133DBB29D42E7D8254655F8107BD0
-S315080016486E460FCD0FC60FCD0FC695E8030086E880
-S315080016580300231D0ECB384601F0A8FA054660B9E3
-S31508001668002384F83830012384F8BD33636A012BD4
-S3150800167808D0206801F08DFE9EE7022384F8BD3362
-S31508001688012599E7204600F017FDF2E7012593E7BB
-S3150800169890F8BC33012B0ED010B50446012380F808
-S315080016A8BC33006801F069FE206801F02DFA0020B5
-S315080016B884F8BC0310BD0220704738B590F8BC33CF
-S315080016C8012B18D00446012380F8BC33006801F0C2
-S315080016D821FA206801F01DFE054628B1002384F882
-S315080016E8BC330125284638BD206801F052FE002380
-S315080016F884F8BC33F6E70225F4E768B110B5044662
-S31508001708032380F8BD33FFF7D8FF2046FEF79EFF70
-S31508001718002084F8BD0310BD0120704770B5044643
-S315080017280D460068066C00EB411303F530639A68AA
-S315080017382169012911D037498E4254D03DB9C5EBE4
-S31508001748C50293002344D3F81032002B5CD0E9B2C3
-S31508001758204603F0ABFD002070BD12F0080F09D033
-S315080017682D498E42F7D912F4004FF4D04FF40042AF
-S315080017789A60F0E712F0200F28D112F0280FEAD164
-S3150800178825498E4202D912F4004F22D1E900491B95
-S315080017988A002244D2F804121B69C3F31203C91A31
-S315080017A8C2F81412D2F80412D2F808320B44C2F856
-S315080017B8083235B9C5EBC50293002344D3F810326D
-S315080017C85BB1E9B2204603F071FDC4E720229A60AE
-S315080017D8C1E74FF400429A60BDE704F5717201212A
-S315080017E801F028FEEDE712F4004F09D112F0200F98
-S315080017F801D020229A60E9B2204603F057FDAAE7ED
-S315080018084FF400429A60A6E704F57172002101F0C8
-S3150800181811FE9CE70A31544F0A30544F38B504462E
-S3150800182803681D6C03EB4111D1F8082B0E4B9D423A
-S3150800183807D901F5306112F4004F02D04FF400437E
-S315080018488B60204603F02AFD074B9D4202D923697F
-S31508001858012B01D0002038BD04F5717201212068DA
-S3150800186801F0E8FDF6E700BF0A30544F2DE9F84FB6
-S3150800187804460568284601F0C9FD08B1BDE8F88F91
-S315080018882F460646206801F090FD0028F6D0206805
-S3150800189801F08BFD10F0020F04D02268536903F09B
-S315080018A802035361206801F080FD10F0100F15D06F
-S315080018B82268936923F010039361D5F8208008F00D
-S315080018C80F09C8F34343022B00F08580062B00F066
-S315080018D8A5802268936943F010039361206801F094
-S315080018E864FD10F4002F40F0AD80206801F05DFD1E
-S315080018F810F4802F40F0F180206801F056FD00288A
-S31508001908C0F25F81206801F050FD10F4006F0AD01C
-S31508001918D5F8083813F0010F40F06D81226853692D
-S3150800192803F400635361206801F03FFD10F0006F6F
-S3150800193815D02268536903F00063536194F8F433A9
-S31508001948002B40F05C81012184F8F41323685B6D51
-S31508001958C3F38303C4F8F833204600F0C1FB2068B4
-S3150800196801F023FD10F4805F40F04D81206801F0F6
-S315080019781CFD10F4005F40F0AB81206801F015FDEE
-S3150800198810F0080F40F0BC81206801F00EFD10F435
-S31508001998801F40F0BE81206801F007FD10F4001F83
-S315080019A840F0C181206801F000FD10F0804F40F03A
-S315080019B8C481206801F0F9FC10F0040F3FF45EAF0B
-S315080019C823685D6815F0040F40F0C08122685368E3
-S315080019D82B43536052E747F6F07318EA030F3FF4B0
-S315080019E878AF4FEAC90BABEB09034FEA830AA2445F
-S315080019F84FEA1818C8F30A02DAF80812284601F056
-S31508001A0819FCC8F30A08DAF808324344CAF808324F
-S31508001A18DAF814324344CAF814325AE7082204F5A5
-S31508001A287171284601F006FCC8F30A184FEAC9037B
-S31508001A38A3EB09018A002244D2F814324344C2F8B7
-S31508001A48143246E7206801F0B4FC8046B14617E030
-S31508001A5807EB49130122C3F8082B49462046FFF726
-S31508001A685DFE1DE007EB49130822C3F8082B494613
-S31508001A782046FFF7D3FE16E009F101094FEA580890
-S31508001A88B8F1000F3FF431AF18F0010FF4D05FFA40
-S31508001A9889F1206801F09DFC824610F0010FD7D124
-S31508001AA81AF0080FDED11AF0100F04D007EB491305
-S31508001AB81022C3F8082B1AF0200F04D007EB491395
-S31508001AC82022C3F8082B1AF4005FD5D007EB491370
-S31508001AD84FF40052C3F8082BCEE7206801F071FCD2
-S31508001AE88046B1462AE05946204603F0EBFB1AF031
-S31508001AF8080F04D007EB49130822C3F808291AF077
-S31508001B08100F04D007EB49131022C3F808291AF056
-S31508001B18400F04D007EB49134022C3F808291AF0E6
-S31508001B28020F04D007EB49130222C3F808291AF052
-S31508001B38800F41D109F101094FEA5808B8F1000F99
-S31508001B483FF4DAAE18F0010FF4D05FFA89FB59466C
-S31508001B58206801F047FC824610F0010FC7D009F04B
-S31508001B680F03012101FA03F2D7F8343823EA0203EE
-S31508001B78C7F8343807EB4913C3F8081923698B42A1
-S31508001B88B1D14FEAC902A2EB090293002344596C62
-S31508001B989A6C0A449A64B9F1000FA4D1C9EBC90230
-S31508001BA8930023441B6D002B9DD104F57172012106
-S31508001BB8206801F03FFC96E749462046FFF766FC91
-S31508001BC8B8E7D5F8043823F00103C5F8043894F8BB
-S31508001BD8F433012B08D0204603F0BAFB2268536970
-S31508001BE803F0004353618DE6002184F8F413204678
-S31508001BF800F076FAF2E7204603F090FB8EE62046D8
-S31508001C0803F08CFBABE605F50068D8F8043023F03A
-S31508001C180103C8F804301021206800F099FF20E075
-S31508001C2807EB46134FF67F31C3F80819D3F800298E
-S31508001C3822F40012C3F80029D3F8002942F00062FA
-S31508001C48C3F80029C3F8081BD3F8002B22F400129E
-S31508001C58C3F8002BD3F8002B42F00062C3F8002B18
-S31508001C6801366368B342DBD8D8F81C3043F0011351
-S31508001C78C8F81C30236BEBB1D8F8843043F00B0353
-S31508001C88C8F88430D8F8443043F00B03C8F8443011
-S31508001C98D5F8003823F4FE63C5F8003804F57172E0
-S31508001CA8217C206801F0C6FB2268536903F4805337
-S31508001CB853615BE6D8F8142042F22B031343C8F89D
-S31508001CC81430D8F8103043F00B03C8F81030DFE7A3
-S31508001CD8206801F09FFB206801F03AF8E060256863
-S31508001CE800F000FA227B0146284600F097FE2046B7
-S31508001CF803F0FAFA2268536903F4005353613CE681
-S31508001D08204603F0EAFA2268536903F00803536188
-S31508001D183AE60021204603F02AFB2268536903F4B1
-S31508001D288013536137E60021204603F01AFB226820
-S31508001D38536903F40013536134E6204603F01DFB88
-S31508001D482268536903F08043536132E6204603F05C
-S31508001D581EFB3BE690F8BC33012B0BD010B50446A6
-S31508001D68012380F8BC33006801F007FB002084F8DB
-S31508001D78BC0310BD0220704790F8BC33012B0BD06A
-S31508001D8810B50446012380F8BC33006801F001FB4E
-S31508001D98002084F8BC0310BD0220704790F8BC33B5
-S31508001DA8012B0DD010B50446012380F8BC3380F802
-S31508001DB83810006801F0D1FA002084F8BC0310BD79
-S31508001DC802207047F8B511F0800F28D101F00F06E8
-S31508001DD8F500AF1BBC00274604F5FC74044404341C
-S31508001DE83E460644002586F8FD5101F00F0121708C
-S31508001DF8A260E370627802B1E180022B1ED090F8E7
-S31508001E08BC33012B1DD00546012380F8BC33214677
-S31508001E18006800F0ADFF002085F8BC03F8BD01F0A6
-S31508001E280F06F500AF1BBC002746383404440434B3
-S31508001E383E460644012586F83D50D6E70023237119
-S31508001E48DDE70220EAE738B511F0800F21D101F065
-S31508001E580F05EA00541BA3001C4603F5FC7303444C
-S31508001E68043325460544002285F8FD2101F00F01B3
-S31508001E78197090F8BC23012A1AD00446012280F862
-S31508001E88BC231946006800F0BBFF002084F8BC0391
-S31508001E9838BD01F00F04E200151BAB001D463833A8
-S31508001EA8034404332C460444012284F83D20DDE724
-S31508001EB80220EDE770B501F00F05EE00711B8C00E6
-S31508001EC804F5FC740444211D761BB4000444C4F8C4
-S31508001ED80822C4F810320023C4F8143284F8FD31F5
-S31508001EE884F8FC510369012B06D065B1DAB200689B
-S31508001EF801F094F8002070BDC5EBC506B40004448B
-S31508001F08C4F80C22F1E7DAB2006800F0E7FFF1E757
-S31508001F1801F00F01C1EBC1018B001844D0F8140277
-S31508001F28704770B501F00F05EE00711B8C00383448
-S31508001F380444211D761BB4000444A26423650023C7
-S31508001F486365012384F83D3084F83C500369012B06
-S31508001F5806D05DB1DAB2006801F060F8002070BDFD
-S31508001F68C5EBC506B4000444E264F2E7DAB20068D1
-S31508001F7800F0B4FFF2E738B501F00F0543689D4253
-S31508001F8836D811F0800F20D1CA00541AA3001C466F
-S31508001F9803F5FC730344043322460244002182F8FD
-S31508001FA8FD1101229A701D7090F8BC23012A21D0D0
-S31508001FB80446012280F8BC231946006801F04EF948
-S31508001FC87DB1002084F8BC0313E0EA00511B8B009E
-S31508001FD819463833034404330144012281F83D2065
-S31508001FE8DFE704F57172217C206801F023FAE8E737
-S31508001FF8012038BD0220FCE710B501F00F0443683C
-S315080020089C422CD811F0800F1DD1E3001A1B9100B1
-S315080020180A4601F5FC71014404310244002382F89A
-S31508002028FD3100238B700C7090F8BC33012B18D047
-S315080020380446012380F8BC33006801F03CF9002007
-S3150800204884F8BC030CE0E3001A1B91000A463831F1
-S31508002058014404310244012382F83D30E1E70120B6
-S3150800206810BD0220FCE730B40468606A29B10D4641
-S31508002078A36A00EB134000230CE040EA0240A06282
-S3150800208812E003F1400104EB8101496800EB1140B5
-S315080020980133DBB2691E8B42F3D340EA024005F1ED
-S315080020A83F0104EB81014860002030BC7047036893
-S315080020B85962002070470000024603680121C0F8EB
-S315080020C8FC13002082F8F4039A6942F000629A61C8
-S315080020D8596D024A0A435A65704700BF0300001043
-S315080020E870470000014B1868704700BF00000020C1
-S315080020F8534B98421FD0534B984228D0524B98427C
-S3150800210831D0524B98423AD0514B984243D0514B12
-S3150800211898424CD0504B984255D0504B98425ED076
-S315080021284F4B984267D04F4B984270D04E4B9842C7
-S3150800213879D00120704703F560531A6942F0010205
-S315080021481A611A6922F001021A610020704703F51C
-S3150800215850531A6942F002021A611A6922F00202F9
-S315080021681A610020704703F540531A6942F00402C1
-S315080021781A611A6922F004021A610020704703F5E9
-S3150800218830531A6942F008021A611A6922F00802DD
-S315080021981A610020704703F520531A6942F01002A5
-S315080021A81A611A6922F010021A610020704703F5AD
-S315080021B810531A6942F020021A611A6922F020029D
-S315080021C81A610020704703F500531A6942F0400265
-S315080021D81A611A6922F040021A610020704703F54D
-S315080021E8E0531A6942F080021A611A6922F08002DD
-S315080021F81A610020704703F5C0531A6942F48072C1
-S315080022081A611A6922F480721A610020704703F568
-S31508002218A0531A6942F400721A611A6922F4007204
-S315080022281A610020704703F580531A6942F48062E0
-S315080022381A611A6922F480621A610020704700BF81
-S31508002248000002400004024000080240000C024058
-S31508002258001002400014024000180240001C024008
-S31508002268002002400024024000280240F0B40A6810
-S3150800227892FAA2F2B2FA82F22DE00E69C46893FACB
-S31508002288A3F5B5FA85F56D00032707FA05F524EAD7
-S31508002298050493FAA3F5B5FA85F56D0006FA05F56A
-S315080022A82C43C4604C68022C40D04C68056893FAE5
-S315080022B8A3F6B6FA86F67600032707FA06F625EA97
-S315080022C8060593FAA3F3B3FA83F35B0004FA03F358
-S315080022D82B43036001320B6833FA02F45AD00124FF
-S315080022E894402340F6D04C68013C012CC5D88E682A
-S315080022F8846893FAA3F5B5FA85F56D00032707FAF6
-S3150800230805F524EA050493FAA3F5B5FA85F56D00EB
-S3150800231806FA05F52C4384600E68CD68446824EAF5
-S31508002328060405FB06F52C434460A6E793FAA3F4CE
-S31508002338B4FA84F4072C15D84E69046A93FAA3F5F7
-S31508002348B5FA85F5AD000F2707FA05F524EA050459
-S3150800235893FAA3F5B5FA85F5AD0006FA05F52C4303
-S315080023680462A2E74D69466A1C0A94FAA4F7B7FA02
-S3150800237887F7BF004FF00F0C0CFA07F726EA07068F
-S3150800238894FAA4F4B4FA84F4A40005FA04F43443D9
-S3150800239844628AE70020F0BC7047000082B0224AEF
-S315080023A8136843F0010313601F4B1B6813F0020FF1
-S315080023B8FAD01D4B00229A601A68019201991B4AA5
-S315080023C80A400192019A1A601A6822F0F80242F045
-S315080023D880021A60144B1B6813F0007FFAD1124B5F
-S315080023E81B6813F0006FFAD10F4B1B6813F0005FD8
-S315080023F8FAD10D4B0E4A5A60103AC3F88420C3F82E
-S315080024088820DA6822F4FE42DA60DA6842F47F0243
-S31508002418DA605A6F22F001025A675A6F42F08072E0
-S315080024285A67002002B0704700380240FFFFF2EAF8
-S3150800243810300024034B9B68C3F30313024AD35C8A
-S31508002448D84070470038024074550008034B9B680B
-S31508002458C3F38223024AD35CD84070470038024047
-S3150800246884550008034B9B68C3F34233024AD35C7E
-S31508002478D840704700380240845500080D4B5B6801
-S3150800248803F480030BB90C4800E00C48094A536862
-S3150800249803F03F03B0FBF3F35068C0F3881000FB62
-S315080024A803F05368C3F3014301335B00B0FBF3F051
-S315080024B8704700BF003802400024F40000127A0072
-S315080024C808B5074B9B6803F00C03042B06D0082BAA
-S315080024D801D0044808BDFFF7D1FFFBE70248F9E732
-S315080024E8003802400024F40000127A0010B50446A9
-S315080024F8FFF7E6FF2060FFF79DFF6060FFF7A6FF7E
-S31508002508A0606068FFF7AEFFE06010BD08B5032855
-S3150800251808D00C282DD0B0F5406F51D0302877D088
-S31508002528002008BD584BD3F89030034043EA0040D2
-S31508002538564B98420FD0B0F1031F13D0013B98426F
-S3150800254806D0FFF7BDFFFFF775FFFFF78BFFE8E734
-S31508002558FFF7B6FFE5E74C4B1B6813F0020F7ED171
-S315080025680020DEE7484B1B6F13F0020F79D10020D5
-S31508002578D7E7454BD3F89030034043EA0040444B2D
-S3150800258898420FD0B0F10C1F13D0043B984206D0DE
-S31508002598FFF796FFFFF74EFFFFF758FFC1E7FFF76C
-S315080025A88FFFBEE7384B1B6813F0020F5CD100207B
-S315080025B8B7E7354B1B6F13F0020F57D10020B0E76A
-S315080025C8314BD3F89030034043EA0040314B9842E8
-S315080025D810D0B0F10C2F14D0A3F58063984206D01A
-S315080025E8FFF76EFFFFF726FFFFF73CFF99E7FFF7B0
-S315080025F867FF96E7244B1B6813F0020F39D10020B2
-S315080026088FE7214B1B6F13F0020F34D1002088E7A0
-S315080026181D4BD3F89030034043EA00401E4B9842BE
-S315080026280FD0B0F1301F13D0103B984206D0FFF7F1
-S3150800263847FFFFF7FFFEFFF709FF72E7FFF740FFBF
-S315080026486FE7114B1B6813F0020F17D1002068E7D4
-S315080026580D4B1B6F13F0020F12D1002061E70F48CC
-S315080026685FE74FF400405CE70C485AE74FF4004030
-S3150800267857E70A4855E74FF4004052E7074850E736
-S315080026884FF400404DE700BF00380240020003003F
-S3150800269808000C000008000C200030000024F40094
-S315080026A808B5C0280AD0B0F5407F2FD0B0F5405FEE
-S315080026B854D0B0F5404F79D0002008BD594BD3F80F
-S315080026C89030034043EA0040574B98420FD0B0F188
-S315080026D8C01F14D0403B984206D0FFF7F1FEFFF71B
-S315080026E8A9FEFFF7B3FEE8E7FFF7EAFEE5E74D4B75
-S315080026F81B6813F0020F40F081800020DDE7494B84
-S315080027081B6F13F0020F7BD10020D6E7454BD3F891
-S315080027189030034043EA0040444B984210D0B0F149
-S31508002728032F14D0A3F58073984206D0FFF7C8FE86
-S31508002738FFF780FEFFF78AFEBFE7FFF7C1FEBCE793
-S31508002748384B1B6813F0020F5DD10020B5E7354BEF
-S315080027581B6F13F0020F58D10020AEE7314BD3F8A0
-S315080027689030034043EA0040314B984210D0B0F10C
-S31508002778302F14D0A3F58053984206D0FFF7A0FE51
-S31508002788FFF758FEFFF762FE97E7FFF799FE94E70B
-S31508002798244B1B6813F0020F3AD100208DE7214B12
-S315080027A81B6F13F0020F35D1002086E71D4BD3F8AF
-S315080027B89030034043EA00401E4B984210D0B0F1CF
-S315080027C8C02F14D0A3F58043984206D0FFF778FEA9
-S315080027D8FFF730FEFFF73AFE6FE7FFF771FE6CE783
-S315080027E8104B1B6813F0020F17D1002065E70D4B35
-S315080027F81B6F13F0020F12D100205EE70E485CE744
-S315080028084FF4004059E70C4857E74FF4004054E79F
-S31508002818094852E74FF400404FE707484DE74FF499
-S3150800282800404AE7003802408000C0000002000362
-S3150800283800200030008000C00024F40038B5036882
-S3150800284813F0010F75D10D46044603683C4A1A4031
-S315080028584B68C9680B4329690B43A9690B4313439A
-S315080028680360AB68426822F44052134343606B69BD
-S31508002878826822F4407213438360324B984216D01A
-S31508002888314B984227D0314B984228D0304B984242
-S3150800289829D0304B98422AD02F4B98422CD02F4B10
-S315080028A898422ED02E4B984230D0012042E0032081
-S315080028B8FFF72CFE00283ED02B68002B3DD0AA69CE
-S315080028C8B2F5004F27D000EB5300B0FBF3F080B207
-S315080028D8E06000202EE00C20FFF718FEEAE730201B
-S315080028E8FFF714FEE6E7C020FFF7DAFEE2E74FF443
-S315080028F84070FFF7D5FEDDE74FF44060FFF706FEA8
-S31508002908D8E74FF44050FFF7CBFED3E74FF44040E3
-S31508002918FFF7C6FECEE75A0802EB4000B0FBF3F015
-S315080029284FF6F0730340C0F342001843E0600020F6
-S3150800293800E0012038BD0120FCE70120FAE700BFC6
-S31508002948F369FFEF001001400044004000480040CA
-S31508002958004C004000500040001401400078004038
-S31508002968007C0040002301330C4A934211D80269BF
-S31508002978002AF8DA036943F00103036100230133E7
-S31508002988064A934207D8026912F0010FF7D10020C8
-S315080029987047032070470320704700BF400D0300A7
-S315080029A884B010B5044603A880E80E00089B012BDE
-S315080029B81DD1A36B23F48033A363E268164B134037
-S315080029C8E360E36823F44013E3600F9B012B09D007
-S315080029D82046FFF7C7FF069B012B14D0BDE8104019
-S315080029E804B07047E36843F48013E360F0E7E368EC
-S315080029F843F04003E3602046FFF7B4FFA36B43F4B4
-S31508002A088033A363E7E7A36843F00603A360A368D4
-S31508002A1843F02003A360E1E7BFFFBDFF022A0AD0FF
-S31508002A280921C26822F47052C260C36843EA812346
-S31508002A38C36000207047274B0B44274A934239D96D
-S31508002A48264B0B44264A934236D9264B0B44264A2C
-S31508002A58934233D9254B0B4402F5C332A03293422D
-S31508002A682ED9234B0B44234A93422BD9224B0B448A
-S31508002A7802F5922202F57872934225D91F4B0B4428
-S31508002A8802F5C32202F5207293421FD91C4B0B4448
-S31508002A9802F5B71202F55872934219D9194B0B4425
-S31508002AA802F5122202F5F862934201D90621B8E71F
-S31508002AB80721B6E70F21B4E70E21B2E70D21B0E7E3
-S31508002AC80C21AEE70B21ACE70A21AAE70921A8E7FA
-S31508002AD80821A6E7405327FFFF340C00401E1BFFBA
-S31508002AE83F420F0000DC0BFF7F4F1200808CF9FE77
-S31508002AF860B6E5FE5FE3160000D3CEFEC05BB3FE04
-S31508002B0800CA91FEE05459FE836843F001038360C6
-S31508002B1800207047836823F001038360002070470C
-S31508002B2808B5C36823F0C043C360012909D069B949
-S31508002B38C36843F08043C3603220FDF771FE002066
-S31508002B4808BDC36843F00053C360F5E70120F7E7FB
-S31508002B58890141F02001016100230133054A9342A6
-S31508002B6805D8026912F0200FF7D100207047032014
-S31508002B78704700BF400D030010230361002301338B
-S31508002B88054A934205D8026912F0100FF7D10020BA
-S31508002B9870470320704700BF400D0300D0F800387F
-S31508002BA81943C0F8001800207047000084B02DE9C2
-S31508002BB8F041044607A880E80E002546002306E0EB
-S31508002BC803F1400204EB82020021516001330E2B07
-S31508002BD8F6D9119B33BBD4F8043843F00203C4F87A
-S31508002BE80438A36B23F40013A363236843F0400354
-S31508002BF82360236843F0800323600023C4F8003E5B
-S31508002C0804F50066D4F80038C4F800380C9B012B84
-S31508002C180DD0032B1CD1099BABB900212046FFF721
-S31508002C28BDFF19E0A36B43F40013A363E5E7099B0B
-S31508002C3823B900212046FFF7B1FF0DE00121204600
-S31508002C48FFF7ACFF08E001212046FFF7A7FF03E0DE
-S31508002C5803212046FFF7A2FF10212046FFF778FF39
-S31508002C68804608B14FF001082046FFF785FF08B1EE
-S31508002C784FF00108002333617361F3610AE0C3B9B1
-S31508002C884FF00060C2F8000900220A614FF67F3249
-S31508002C988A6001330799994210D905EB431202F560
-S31508002CA81061D2F800090028E9DB0020C2F80009FB
-S31508002CB8EAE74FF09040C2F80009E5E700230AE082
-S31508002CC8BBB14FF09047C2F8007B002202614FF66D
-S31508002CD87F3282600133994210D905EB431202F517
-S31508002CE83060D2F8007B002FEADB0027C2F8007BA9
-S31508002CF8EBE74FF00067C2F8007BE6E7336923F491
-S31508002D08807333610023A3616FF0804363610A9B74
-S31508002D181BB9A36943F01003A361A2690A4B1343BD
-S31508002D28A3610D9B1BB1A36943F00803A361119B1B
-S31508002D38012B04D04046BDE8F04104B07047A269AB
-S31508002D48024B1343A361F5E700383C8004000040B2
-S31508002D58D0F8083813F0060305D0062B18BF022B3F
-S31508002D6803D102207047002070470F2070470000E3
-S31508002D7870B40B784A78012A20D0D0F81C2803F0BA
-S31508002D880F060124B44042EA0442C0F81C2800EBA6
-S31508002D984310D0F8003B13F4004F0CD1D0F8002BA1
-S31508002DA88B68C3F30A03C97843EA81431343134A72
-S31508002DB81A43C0F8002B002070BC7047D0F81C488E
-S31508002DC803F00F06B24092B22243C0F81C2800EB63
-S31508002DD84310D0F8002912F4004FECD1D0F8004976
-S31508002DE88A68C2F30A02C97842EA814242EA8353E8
-S31508002DF82343024A1A43C0F80029DCE7008000107A
-S31508002E0830B40B784A78012A24D000EB4313D3F858
-S31508002E18002B002A50DBD0F83C580A7802F00F023B
-S31508002E28012404FA02F225EA0242C0F83C28D0F83E
-S31508002E381C28097801F00F018C4022EA0444C0F8DE
-S31508002E481C48D3F8001B234A0A40C3F8002B002065
-S31508002E5830BC704700EB4313D3F80029002A1EDB61
-S31508002E68D0F83C580A7802F00F02012404FA02F254
-S31508002E7892B225EA0202C0F83C28D0F81C2809783C
-S31508002E8801F00F018C40A4B222EA0404C0F81C48D9
-S31508002E98D3F80019104A0A40C3F80029D7E7D3F827
-S31508002EA8002942F00062C3F80029D3F8002942F045
-S31508002EB88042C3F80029D3E7D3F8002B42F0006212
-S31508002EC8C3F8002BD3F8002B42F08042C3F8002B36
-S31508002ED8A1E700BF0078F3EF007833EC70B40B78FD
-S31508002EE84C78012C24D000EB431000F530631D699B
-S31508002EF83E4C2C401C611D693D4C2C401C614C699C
-S31508002F080CB18C684C611C6944F400241C611C696A
-S31508002F188D68C5F312052C431C61012A61D0D0F8C7
-S31508002F28003B43F00443C0F8003B002070BC7047E0
-S31508002F384C695CBB00EB4314D4F810692C4D35403A
-S31508002F48C4F81059D4F8105945F40025C4F810598E
-S31508002F58D4F81069254D3540C4F81059012A31D0DE
-S31508002F6800EB4313D3F8002942F00442C3F80029BA
-S31508002F784B69002BD9D0D0F83428097801F00F040A
-S31508002F880121A1400A43C0F83428CEE700EB4314D0
-S31508002F9804F510642669154D354025612669144DD2
-S31508002FA8354025614E698D68AE4200D94D6125695F
-S31508002FB845F40025256125694E69C6F31206354389
-S31508002FC82561CBE70A691AB100EB4311C1F8142940
-S31508002FD800EB4310D0F8002942F00442C0F8002953
-S31508002FE8A3E7CA68002A9AD05A6198E70000F8FF4A
-S31508002FF8FFFF07E070B49DF80C4064B903339D08D9
-S3150800300807E000EB023303F5805351F8046B1E60A2
-S315080030180134AC42F5D3002070BC7047F0B583B0D4
-S315080030280B784C78012C29D000EB431303F5306450
-S3150800303826697D4D3540256126697C4D35402561D3
-S315080030484D69002D40F0C18025698E68C6F31206C1
-S3150800305835432561256945F400252561012A00F0CF
-S31508003068C980CA78012A00F0CB80D3F8002B42F031
-S315080030780442C3F8002B002003B0F0BD4C6974BBAA
-S3150800308800EB4314D4F81069684D3540C4F8105954
-S31508003098D4F8105945F40025C4F81059D4F810691D
-S315080030A8614D3540C4F81059012A4AD000EB43133C
-S315080030B8D3F8004944F00444C3F80049CC78012CF5
-S315080030C868D04B69002BD6D0D0F83428097801F097
-S315080030D80F040121A1400A43C0F83428CBE700EBC6
-S315080030E84314D4F81069504D3540C4F81059D4F82B
-S315080030F810694E4D3540C4F81059D4F810694D6911
-S315080031088F683D44013DB5FBF7F5494F07EAC545C4
-S315080031183543C4F81059D4F810594E69C6F312063F
-S315080031283543C4F8105904F51064CD78012DBBD180
-S31508003138256925F0C0452561256945F000552561AD
-S31508003148B2E70A691AB100EB4314C4F81429CA7815
-S31508003158012A08D000EB4313D3F8002942F00442A9
-S31508003168C3F8002987E7D0F8082812F4807F08D121
-S3150800317800EB4311D1F8002942F00052C1F80029A2
-S31508003188E8E700EB4311D1F8002942F08052C1F86C
-S315080031980029DFE7D0F8084814F4807F0ED1D3F861
-S315080031A8004944F00054C3F8004914460B46C96858
-S315080031B81A789B8A0094FFF71DFF5CE7D3F8004945
-S315080031C844F08054C3F80049EFE78E683544013D5A
-S315080031D8B5FBF6F52669164F07EAC5473E43266145
-S315080031E827698E68ADB206FB05F5C5F312053D439A
-S315080031F8256133E7CA68002A3FF433AF626130E7CE
-S31508003208D0F8082812F4807F06D1D3F8002B42F0AC
-S315080032180052C3F8002B28E7D3F8002B42F0805257
-S31508003228C3F8002B21E700BF0000F8FFFFFF07E0FF
-S315080032380000F81F03329208002393420CD210B4F8
-S3150800324800F58054246841F8044B01339342F7D3B8
-S3150800325808465DF8044B7047084670470B784A7865
-S31508003268012A14D000EB4310D0F8002B002A06DBFD
-S315080032782BB1D0F8003B23F08043C0F8003BD0F8C8
-S31508003288003B43F40013C0F8003B0020704700EBEE
-S315080032984310D0F80029002A06DB2BB1D0F80039EC
-S315080032A823F08043C0F80039D0F8003943F40013F6
-S315080032B8C0F80039E9E70B784A78012A0ED000EBFE
-S315080032C84310D0F8003B23F40013C0F8003BCB7832
-S315080032D8023BDBB2012B15D90020704700EB4310DF
-S315080032E8D0F8003923F40013C0F80039CB78023B2C
-S315080032F8DBB2012BF0D8D0F8003943F08053C0F878
-S315080033080039E9E7D0F8003B43F08053C0F8003BA2
-S31508003318E2E738B505460446002208E004EB4213FE
-S315080033284FF67F31C3F80819C3F8081B01320E2A6D
-S31508003338F4D90022C5F81028C5F81428C5F81C2899
-S315080033482846FFF719FC034608B1184638BD102168
-S315080033582846FFF7FDFB0346F7E7D0F8003823F4BD
-S31508003368FE63C0F80038D0F80038090101F4FE6198
-S315080033780B43C0F800380020704708B5D0F8043861
-S3150800338823F00203C0F804380320FDF749FA0020A1
-S3150800339808BD08B5D0F8043843F00203C0F8043865
-S315080033A80320FDF73DFA002008BD426980691040F0
-S315080033B87047D0F8183800F50060C0691840000C46
-S315080033C87047D0F8183800F50060C069184080B210
-S315080033D8704700EB4111D1F8082B00F500604069E9
-S315080033E81040704710B4D0F81048D0F8343801F0B7
-S315080033F80F02D340DB01DBB2234300EB411000F593
-S315080034081060806818405DF8044B7047406900F002
-S3150800341801007047D0F80029054B1340C0F8003959
-S31508003428D0F8043843F48073C0F80438002070478D
-S3150800343800F8FFFF10B4046C154B9C4203D9D0F86A
-S31508003448003B002B16DB0024C0F8104BD0F8104BB5
-S3150800345844F40024C0F8104BD0F8104B44F0180474
-S31508003468C0F8104BD0F8104B44F0C044C0F8104BC5
-S31508003478012903D000205DF8044B7047C0F8142BC7
-S31508003488D0F8003B43F08023C0F8003BF2E700BFC2
-S315080034980A30544F014B1860704700BF00000020DF
-S315080034A8C0B108B50346D0F8B80210B10020C3F871
-S315080034B8B802D3F8CC0210B10020C3F8CC0209B17F
-S315080034C8C3F8B4121846012380F89C32027001F03A
-S315080034D869FF08BD0320704710B50446012380F824
-S315080034E89C32D0F8B83213B15B6801799847D4F89A
-S315080034F8CC3213B10023C4F8CC32204601F0C2FFFF
-S31508003508034608B1184610BD204601F0ABFF03462E
-S31508003518F8E710B582B00023ADF8063059B104466D
-S31508003528C4F8B812CB6A0DF106009847C4F8CC025D
-S31508003538002002B010BD0320FBE708B501F09AFF8A
-S3150800354808BD08B5D0F8B83213B11B68984708BD46
-S315080035580320FCE708B5D0F8B8320BB15B68984782
-S31508003568002008BD38B5044600F2AA25284600F00A
-S315080035782DF90123C4F89432B4F8B032C4F8983255
-S3150800358894F8AA1201F01F03012B0DD03BB1022BA8
-S315080035980FD001F08001204601F08FFF03E029468D
-S315080035A8204600F0CEFA38BD2946204600F004FB2E
-S315080035B8F9E72946204600F033FBF4E710B5044638
-S315080035C829BB1346D0F89422032A01D0002029E003
-S315080035D8D0F85C11D0F8602191420DD8D0F8B832ED
-S315080035E81B6923B190F89C22032A00D198472046E4
-S315080035F800F067FC002015E0891AC0F85C118A42B9
-S3150800360828BF0A46194600F054FC00200AE00A4674
-S31508003618D0F8B8329B6933B190F89C12032904D1C3
-S315080036281146984710BD0320FCE70320FAE710B5B2
-S315080036380446002946D11346D0F89422022A05D012
-S3150800364894F8A032012B39D0002046E0C269016AF5
-S315080036588A4213D88A421DD0D4F8B832DB682BB10F
-S3150800366894F89C22032A01D12046984780212046AF
-S3150800367801F023FF204600F02FFCE1E7521AC26149
-S31508003688194600F00EFC00231A461946204601F092
-S3150800369834FFD5E783699942DED8D0F89822934251
-S315080036A8DAD20022114600F0FCFB0021C4F8981271
-S315080036B80B460A46204601F020FFC1E7002084F899
-S315080036C8A0020AE00A46D0F8B8325B6933B190F826
-S315080036D89C12032904D11146984710BD0320FCE71C
-S315080036E80320FAE770B50446012380F89C320023C4
-S315080036F8C0F894324360C0F8A432D0F8BC3223B17B
-S31508003708D0F8B8325B680021984740230022114652
-S31508003718204601F0BFFE0126A4F864614025C4F8D6
-S3150800372860512B4600228021204601F0B3FEA6846C
-S315080037382562002070BD01740020704790F89C32FD
-S3150800374880F89D32042380F89C320020704790F850
-S315080037589C32042B01D00020704790F89D3280F8DF
-S315080037689C32F8E708B590F89C32032B01D0002064
-S3150800377808BDD0F8B832DB69002BF8D09847F6E7C9
-S3150800378800207047002070470020704708B50123BD
-S3150800379880F89C32D0F8B83213B15B68017998473B
-S315080037A8002008BD002302E00133DBB201300278AD
-S315080037B8002AF9D11846704708B54B88012B00D05E
-S315080037C808BDC0F8A43200F07CFBF9E70B78037053
-S315080037D84B7843708B78CA7843EA022343800B797F
-S315080037E84A7943EA022383808B79CA7943EA022312
-S315080037F8C380704710B50446802101F05EFE00219B
-S31508003808204601F05AFE10BD30B583B004460D4671
-S315080038180023ADF806304A88130A013B062B00F246
-S31508003828AB80DFE803F0041F33A9A98D9A00D0F806
-S31508003838B4321B680DF10601007C9847EA88002A0D
-S3150800384800F0A380BDF80630002B00F099809A4254
-S3150800385828BF1A46ADF806200146204600F014FB94
-S3150800386803B030BD037C43B9D0F8B8329B6A0DF172
-S315080038780600984702234370E0E7D0F8B832DB6AB7
-S315080038880DF10600984702234370D7E7D2B2052AF6
-S3150800389852D8DFE802F003101D2A3744D0F8B432AC
-S315080038A85B6823B10DF10601007C9847C6E72946EF
-S315080038B8FFF7A0FFD4E7D0F8B4329B6823B10DF11F
-S315080038C80601007C9847B9E72946FFF793FFC7E73B
-S315080038D8D0F8B432DB6823B10DF10601007C9847AD
-S315080038E8ACE72946FFF786FFBAE7D0F8B4321B6972
-S315080038F823B10DF10601007C98479FE72946FFF793
-S3150800390879FFADE7D0F8B4325B6923B10DF106014A
-S31508003918007C984792E72946FFF76CFFA0E7D0F89E
-S31508003928B4329B6923B10DF10601007C984785E7F7
-S315080039382946FFF75FFF93E72946FFF75BFF8FE7FF
-S31508003948037C33B9D0F8B8325B6B0DF1060098479B
-S3150800395874E72946FFF74EFF82E7037C43B9D0F898
-S31508003968B8321B6B0DF1060098470723437065E7C5
-S315080039782946FFF73FFF73E72946FFF73BFF6FE73F
-S3150800398829462046FFF736FF6AE7204600F099FAE7
-S3150800399866E738B504468B88F3B9CB88E3B94B880C
-S315080039A87F2B19D803F07F0590F89C32032B0CD08F
-S315080039B880F89E52294601F090FD204600F081FACB
-S315080039C835B1022384F89C3209E0FFF713FF06E0B5
-S315080039D8012384F89C3202E02046FFF70BFF38BD26
-S315080039E870B504460D4689782E4B197001290FD8EB
-S315080039F890F89C32022B11D0032B25D02946FFF7C5
-S31508003A08F9FE284B19782046FFF7A4FD032603E09C
-S31508003A182946FFF7EFFE0326304670BD81B141609F
-S31508003A28FFF78FFD064620B129462046FFF7E2FE36
-S31508003A38F2E7204600F045FA032384F89C32EBE7C0
-S31508003A4800F03FFA0026E7E7C9B14368994225D04E
-S31508003A58D9B2FFF77FFD134B197861602046FFF747
-S31508003A6870FD0646B0B129462046FFF7C3FE217900
-S31508003A782046FFF76FFD022384F89C32CCE7022321
-S31508003A8880F89C324160FFF765FD204600F019FA78
-S31508003A980026C1E7204600F014FABDE700F011FA3F
-S31508003AA80026B9E7E800002008B5CB88012B0BD11A
-S31508003AB890F89C329BB1022B09D9032B0FD101220E
-S31508003AC8011D00F0E1F901E0FFF794FE08BD014683
-S31508003AD8002341F8083F012200F0D6F9F6E7FFF778
-S31508003AE889FEF3E708B590F89C32013B022B12D8F9
-S31508003AF8CB88022B0CD10123C360D0F8A4320BB1B2
-S31508003B080323C360022200F10C0100F0BDF908BDC9
-S31508003B18FFF770FEFBE7FFF76DFEF8E708B590F8C4
-S31508003B289C32013B022B09D84B88012B00D008BDD3
-S31508003B380023C0F8A43200F0C4F9F8E7FFF75AFEE4
-S31508003B48F5E708B50B7803F06003202B06D0402B61
-S31508003B5804D043B1FFF74EFE002003E0D0F8B83290
-S31508003B689B68984708BD4B78092B21D8DFE803F0EE
-S31508003B78141C201820090520100DFFF745FE002003
-S31508003B88F0E7FFF706FF0020ECE7FFF729FFE9E76C
-S31508003B98FFF78AFF0020E5E7FFF7A4FF0020E1E723
-S31508003BA8FFF70AFE0020DDE7FFF7B8FF0020D9E790
-S31508003BB8FFF720FE0020D5E770B505460C460B78BA
-S31508003BC803F06003202B07D0402B05D023B1FFF75D
-S31508003BD811FE0026304670BD95F89C32013B022B33
-S31508003BE818D82379012B0FD8D5F8B8329B682146FF
-S31508003BF8284698470646E388002BEBD10028E9D1E2
-S31508003C08284600F05EF9E5E721462846FFF7F2FD63
-S31508003C180026DFE721462846FFF7ECFD0026D9E708
-S31508003C2838B505460C468A880B7803F06003202BBE
-S31508003C3808D0D1B2402B05D05BB12146FFF7DAFD93
-S31508003C48002005E0D5F8B8329B68214628469847EB
-S31508003C5838BD6378012B38D0002B6BD0032B40F086
-S31508003C68F08090F89C32022B06D0032B19D02146F7
-S31508003C78FFF7C0FD0020EBE7B1F1800318BF012369
-S31508003C88002908BF00233BB101F017FC802128460C
-S31508003C9801F013FC0020DBE72146FFF7ABFD002007
-S31508003CA8D6E763884BB9B1F1800318BF0123002909
-S31508003CB808BF00230BB1E38823B1284600F001F9B1
-S31508003CC80020C5E701F0F9FBF7E790F89C32022BCC
-S31508003CD806D0032B19D02146FFF78CFD0020B7E73D
-S31508003CE8B1F1800318BF0123002908BF00233BB19F
-S31508003CF801F0E3FB8021284601F0DFFB0020A7E757
-S31508003D082146FFF777FD0020A2E76388002B40F0DD
-S31508003D189D8011F07F0F0AD1284600F0D2F8D5F811
-S31508003D28B8329B68214628469847002090E701F054
-S31508003D38CCFBF1E790F89C32022B06D0032B2FD048
-S31508003D482146FFF757FD002082E7B1F1800318BF27
-S31508003D580123002908BF00239BB912F0800F15D14B
-S31508003D6801F07F0101EB81018B0003F5A87101447D
-S31508003D78043100240C600222284600F085F8204603
-S31508003D8866E72146FFF736FD002061E701F07F0167
-S31508003D9801EB81018B0003F1100101440431E8E7C6
-S31508003DA852B2002A24DB01F00F0303EB83039800C1
-S31508003DB82844B0F8643153B3002A2EDB01F07F0299
-S31508003DC802EB8202930003F5A8742C440434802974
-S31508003DD814BF00230123002908BF01233BB300238E
-S31508003DE8236002222146284600F04EF800202FE7D5
-S31508003DF801F00F0303EB830398002844838C002BF8
-S31508003E08DAD121462846FFF7F5FC002020E72146A7
-S31508003E182846FFF7EFFC00201AE701F07F0202EBBD
-S31508003E288202930003F110042C440434CFE7284691
-S31508003E3801F0F2FA10B101232360D2E700232360C8
-S31508003E48CFE72146FFF7D6FC002001E70020FFE66A
-S31508003E58C8B170B50D4616460446FFF7A3FC0130EF
-S31508003E6840003080287003236B70022307E0EA5469
-S31508003E7801345A1CD2B20021A9540233DBB2227883
-S31508003E88002AF4D170BD704710B513460222C0F84F
-S31508003E9894228361C3610A46002101F026FB0020AB
-S31508003EA810BD08B513460A46002101F01EFB00207E
-S31508003EB808BD08B513460A46002101F01EFB002076
-S31508003EC808BD08B50423C0F8943200231A461946D3
-S31508003ED801F00BFB002008BD08B50523C0F894328D
-S31508003EE800231A46194601F008FB002008BD72B6D9
-S31508003EF8704762B6704700002DE9F04184B0044661
-S31508003F080D46174698466846FEF7F0FA0299164B84
-S31508003F18A3FB01318909002201E00132D2B2112A34
-S31508003F281DD8124B13F8120003EB420393F801C08D
-S31508003F3800EB0C0303FB0443B1FBF3FE03FB1E165D
-S31508003F48002EEAD11FFA8EF32B80013B9BB2B3F5FC
-S31508003F58806FE2D2387088F800C0012000E000209F
-S31508003F6804B0BDE8F08100BFD34D6210C8550008FB
-S31508003F7870B58CB00022ADF82E208DF82D200CAB2C
-S31508003F8803F8042D0DF12D020DF12E014FF4FA70E8
-S31508003F98FFF7B2FF002835D01D4C1E4B23600025BD
-S31508003FA825766576A5760126E67625776577A5606A
-S31508003FB8E5609DF82D30013B1B0423619DF82C30E4
-S31508003FC8013B1B056361BDF82E3063602046FCF78C
-S31508003FD83BFC0695079508964CF6E043019302952F
-S31508003FE84FF6E073039304230493059509960E2365
-S31508003FF80A9301A92046FCF7CDFC2046FCF760FD8C
-S315080040080CB070BDB521044800F034FDC4E700BF04
-S31508004018EC000020006400408C55000810B588B0F4
-S3150800402840F2E1730293002304930593069101ABCA
-S31508004038024602A90B48FCF771FD08B108B010BD85
-S3150800404800F028FB00F1320401990648FCF7DBFD6D
-S315080040580028F3D000F018FE00F01CFBA042F3D9A4
-S31508004068ECE700BFEC00002010B588B00C46034604
-S3150800407801AA00210A48FCF7D8FD60B9019A40F25E
-S3150800408867639A4201D0002006E0039B33B9059B73
-S315080040982370012000E0002008B010BD0020FBE7CF
-S315080040A8EC00002008B5FFF722FF08BD10B500F0A0
-S315080040B8FFF900B910BDFCF7ABF80028FAD000F0F4
-S315080040C88DFDFCF759FB00F0BBFA00F0F5F9054B36
-S315080040D80340054A936000F0EFF94468FFF709FFC3
-S315080040E8A047E7E780FFFF1F00ED00E070B508E08E
-S315080040F84D1C461C0B78037000F0C6FD3046294651
-S315080041082246531E9CB2002AF2D170BD38B5054620
-S31508004118002401E00134E4B2062C15D800F0B4FDF9
-S3150800412804EB44029300094AD358AB42F2D804EB8D
-S3150800413844029100054A0A4452681344AB42E9D935
-S31508004148024B0B44187A00E0FF2038BDEC550008EE
-S3150800415808B5C1F3080353B903688B4209D040F878
-S31508004168041B4FF40072FFF7C1FF012000E000208E
-S3150800417808BD0120FCE72DE9F0410746FCF7D6FE05
-S3150800418800247F2C14D83E68A30006EB03083B449A
-S315080041985D6800F079FD2A46002341460220FCF7AF
-S315080041A81BFF38B956F82430AB4209D10134E8E781
-S315080041B8012400E00024FCF7D1FE2046BDE8F08182
-S315080041C80024F8E738B50D460C4B984211D004463A
-S315080041D80B4B994207D1094C29462046FFF7B8FFE9
-S315080041E848B1204638BDFFF7C6FF0028F4D1002499
-S315080041F8F7E7044CF0E70024F3E700BF18030020AC
-S3150800420800800008140100202DE9F04106460C46F6
-S3150800421817461D46DFF8748001EA08080368B3F1F3
-S31508004228FF3F07D0336843450BD13368E41A344453
-S31508004238043415E04146FFF78BFF03460028F1D101
-S315080042481FE041463046FFF7BDFF06460028ECD179
-S31508004258002316E017F8013B04F8013B013D0FD08F
-S3150800426800F012FD331DE31AB3F5007FF2D308F503
-S3150800427800713046FFF7A6FF064628B1041DE9E790
-S3150800428801231846BDE8F0810023FAE700FEFFFF80
-S3150800429870B586B004460E4600230193884219D89D
-S315080042A80125ECB1072E1FD8DDB10023029302239E
-S315080042B8059301230493FCF739FEB4420DD800F0A0
-S315080042C8E3FC039401A902A8FCF70AFF20B9013404
-S315080042D8E4B2F2E70025E4E70025FCF73FFE00E034
-S315080042E80025284606B070BD0025FAE74FF0FF33CB
-S315080042F8024A1360024A1360704700BF140100207F
-S315080043081803002070B54B1E144C241AA34201D971
-S31508004318002070BD16460D460446FFF7F7FEFF282F
-S3150800432818D028190138FFF7F1FEFF2814D00C4BCE
-S3150800433823400C4A934206D02B46324621460A4861
-S31508004348FFF762FFE5E72B46324621460748FFF79F
-S315080043585BFFDEE70020DCE70020DAE7FFFF0F084F
-S3150800436800FEFFFF00800008140100201803002043
-S315080043784A1E0D4B1B1A9A4201D90020704770B580
-S315080043880C460546FFF7C2FE064660190138FFF7D0
-S31508004398BDFEFF2818BFFF2E01D1002070BD0146BB
-S315080043A83046FFF775FFF9E7FFFF0F08104B1B6844
-S315080043B8B3F1FF3F1AD000B583B00D4A5368916828
-S315080043C80B44D1680B4411690B4451690B44916934
-S315080043D80B44D26913445B4202AA42F8043D0421FD
-S315080043E80448FFF78FFF03B05DF804FB0120704708
-S315080043F818030020C88100080D4B1B680D4A12686F
-S315080044081A440D4B1B6813440C4A126813440C4A89
-S3150800441812681A440B4B1B681A440B4B1B68134447
-S315080044280A4A1268DA4201D000207047012070470C
-S315080044380080000804800008088000080C8000082E
-S31508004448108000081480000818800008C881000831
-S3150800445808B50D4B1B68B3F1FF3F0BD10B4B1B6817
-S31508004468B3F1FF3F0DD00948FFF785FE034648B16B
-S31508004478012307E00448FFF77EFE03460028EDD12E
-S3150800448800E00123184608BD18030020140100207F
-S31508004498004870470080000808B5FFF727FF08BDE1
-S315080044A808B5FFF72FFF08BD08B5FFF761FF08BD78
-S315080044B808B5FFF7A1FF08BD08B5FFF7E9FF08BD6E
-S315080044C808B5FFF773FF034608B9184608BDFFF78E
-S315080044D8BFFF0346F9E70000054BDB6913F0200F19
-S315080044E804D0034B5B6A03700120704700207047AD
-S315080044F80048004010B5094B986200F0CBF800F167
-S315080045080A04064BDB6913F0800F05D100F0BCFBE3
-S3150800451800F0C0F8A042F4D910BD00BF004800401A
-S3150800452810B588B00C4C236823F0010323604FF4B8
-S315080045386143019300230293039304930C22059283
-S315080045480693079301A92046FEF778F9236843F0EE
-S315080045580103236008B010BD0048004070B5064640
-S315080045680D46402904D82846FFF7C4FF00240BE067
-S315080045788321074800F07EFAF5E700F085FB305DF1
-S31508004588FFF7B8FF0134A4B2ABB2A342F5D870BDA1
-S315080045984056000870B5254B1C78BCB92448FFF767
-S315080045A89BFF012801D0204670BD214B1B78013B93
-S315080045B8DBB23F2BF7D800F06DF81E4B18601E4B80
-S315080045C800221A70194B01221A70ECE706460D46A6
-S315080045D8194B1B78013316481844FFF77DFF044624
-S315080045E8012815D1144B1A780132D2B21A70104B19
-S315080045F81B789A4201D00024D5E710493046FFF7C0
-S3150800460875FD0A4B00221A700B4B1B782B70CAE7EC
-S3150800461800F040F8074B1B686433984203D9002416
-S31508004628024B1C70BFE70024BDE700BF5D050020EC
-S315080046381C050020600500205E0500201D050020D9
-S31508004648024B00221A605A609A60704710E000E030
-S3150800465808B5FFF7F5FF054B054A5A6000229A6028
-S3150800466805211960034B1A6008BD00BF10E000E079
-S31508004678BF4B030064050020044B1B6813F4803FF6
-S3150800468803D0034A136801331360704710E000E04B
-S315080046986405002008B5FFF7EFFF014B186808BD49
-S315080046A86405002008B5FFF7F5FF08BD094B03F1B7
-S315080046B81801002232B19A7400225A61064B054A3B
-S315080046C81A6070479A745961183318310132D2B290
-S315080046D8F0E700BFA8050020D80500200A4B1B688C
-S315080046E883B110B45C69084A146019749860D86074
-S315080046F800225A741860013908445860987C5DF895
-S31508004708044B7047FF207047D805002038B5044683
-S315080047180D4601281CD862002244D100114B0B44CF
-S315080047285A7C1B7C9A4219D00E4B0B44DA681570D2
-S315080047385A7C01325A74DA680132DA605B689A423E
-S315080047480ED9084A084651580244D160012038BD96
-S315080047584FF4E071044800F08DF9DCE70020F6E72D
-S315080047680120F4E7A80500208056000808B5014688
-S31508004778024B1878FFF7CAFF08BD00BFDC05002002
-S3150800478838B504460D4601281ED804EB4403DA005A
-S31508004798124B13445B7CEBB162002244D1000F4BE9
-S315080047A80B449A6812782A705A7C013A5A749A689D
-S315080047B801329A605B689A420ED9084A08465158E7
-S315080047C802449160012006E04FF4F171044800F0B4
-S315080047D851F9DAE7002038BD0120FCE7A8050020D2
-S315080047E88056000808B50146024B1878FFF7C8FF37
-S315080047F808BD00BF2006002010B50446012804D9C4
-S3150800480840F20221044800F035F904EB4404E200BA
-S31508004818024B1344587C10BD80560008A805002092
-S3150800482838B5FFF743FF1A4C4021601CFFF756FFBF
-S315080048382070184D4021681CFFF750FF2870237810
-S31508004848FF2B1BD0FF2819D0134C002213492046EA
-S31508004858FEF726FE12492046FEF75BFE0120FBF707
-S31508004868EEFC2046FEF769FED4F8C402FDF772FA94
-S3150800487800F02CF9B0F5FA6F05D338BD852109483B
-S3150800488800F0F8F8E0E74FF4FA6000F019F9F4E7F1
-S31508004898DC0500202006002064060020740000209D
-S315080048A8100000208056000810B5064CD4F8C4023B
-S315080048B8FDF762FA2046FEF70FFE0020FBF7BFFC5D
-S315080048C810BD00BF6406002070B506460D463F2990
-S315080048D806D82846FFF74AFF012806D100240BE028
-S315080048E8B9210D4800F0C6F8F3E7BD210A4800F0DB
-S315080048F8C1F8F3E70134A4B2ABB2A3420BD900F06E
-S31508004908C3F9305DFFF732FF0128F3D0C621024804
-S3150800491800F0B0F8EEE770BD8056000870B5064698
-S315080049280D461F4BD3F8C402FCF7A0FF1D4B1C7895
-S315080049389CB91D48FFF756FF012801D0204670BDCF
-S31508004948194B1B78013BDBB23E2BF7D8154B0122D6
-S315080049581A70164B00221A70F0E7144B1B780133AD
-S3150800496811481844FFF73EFF0446012801D00024E1
-S31508004978E4E70E4B1A780132D2B21A700A4B1B7842
-S315080049889A4201D00024D9E709493046FFF7AEFB19
-S31508004998044B00221A70054B1B782B70CEE700BF14
-S315080049A864060020740900203409002075090020CF
-S315080049B83509002030B583B0144B1878FFF71CFF6B
-S315080049C808B30546402800D94025002405E09DF887
-S315080049D807200F4B1A550134E4B2A5420DD90DF13B
-S315080049E807010A4B1878FFF7CBFE0128EFD04FF4DA
-S315080049F8A371084800F03EF8E9E72B46044A8121E6
-S31508004A08054800F072FD03B030BD00BFDC05002084
-S31508004A1868050020805600086406002070B504461C
-S31508004A2800F0A8FB064621460F4800F00CFD85B2A3
-S31508004A38002401E00134A4B2AC420CD2315D0B4B20
-S31508004A481878FFF763FE0128F4D04FF4B4710848C4
-S31508004A5800F010F8EEE700F08DFB4023024601212E
-S31508004A68014800F04AFD70BD6406002020060020B3
-S31508004A788056000808B500F007F9FCE708B500F005
-S31508004A88F7F8012803D00B4B1B78012B00D008BD7B
-S31508004A98FFF700FE084B1B68084A1268134403F51B
-S31508004AA8FA739842F3D3034B00221A70FFF7FEFAFB
-S31508004AB8EDE700BF7C09002078090020800900205E
-S31508004AC8014B1860704700BF78090020014B186829
-S31508004AD8704700BF7809002008B5054B1B78012BDD
-S31508004AE800D008BDFFF7D6FD024B1860F9E700BFEE
-S31508004AF87C0900208009002008B5044B01221A7099
-S31508004B08FFF7EAFFFFF7BAFF08BD00BF7C090020D8
-S31508004B1808B5FFF7C7FA00F0B3F8FFF799FDFFF7EE
-S31508004B28BBFC00F00DF8FFF7E7FF08BD08B500F075
-S31508004B38ABF8FFF7A1FD00F017F8FFF79FFF08BDD0
-S31508004B4810B500F00FFAFFF713FA064C0123237085
-S31508004B58FFF7E6FC00232370FFF762FE02232370A3
-S31508004B6810BD00BF0C00002000B583B00DF1070189
-S31508004B781848FFF779FA012810D00DF107011548EA
-S31508004B88FFF708FD012812D00DF107011148FFF7B4
-S31508004B98C5FE012814D003B05DF804FB0E4B0122AC
-S31508004BA81A709DF807100B4800F0FCF9E5E70A4B60
-S31508004BB800221A709DF80710064800F0F3F9E3E793
-S31508004BC8054B02221A709DF80710024800F0EAF908
-S31508004BD8E1E700BF840900200C00002008B5FFF7AC
-S31508004BE863FE08BD38B504460D460E4B1B78012BE7
-S31508004BF809D00C4B1B7853B10A4B1B78022B0BD0E8
-S31508004C0800F0C8F938BDC9B2FFF708FAF1E7E9B202
-S31508004C182046FFF7A3FCEFE7E9B22046FFF754FE64
-S31508004C28EEE700BF0C000020074B1B78022B05D0C7
-S31508004C38032B05D0012B05D0402070473F2070472D
-S31508004C4800207047082070470C000020074B1B7887
-S31508004C58022B05D0032B05D0012B05D04020704721
-S31508004C683F20704700207047082070470C00002036
-S31508004C7808B500F085F9034600B10123184608BDB2
-S31508004C8808B5FBF7D3FA08BD08B5FBF7D4FA08BD8B
-S31508004C98014B00225A707047C4090020034BFE22B4
-S31508004CA8DA7018710222A3F844207047C409002054
-S31508004CB810B5054C00232370FFF7EAFFFF23E370BE
-S31508004CC80123A4F8443010BDC4090020064BFF226E
-S31508004CD8DA7000221A71597859719A71DA711A724A
-S31508004CE80622A3F844207047C409002008B5002006
-S31508004CF8FFF7D4FF08BD0000074BFF22DA70074A02
-S31508004D089A6400221A715A719A710722C3F8072001
-S31508004D180822A3F844207047C4090020BC56000896
-S31508004D28044BFF22DA7042689A640122A3F84420E9
-S31508004D38704700BFC409002008B53120FFF7AEFF49
-S31508004D4808BD000038B5084CFF23E3700025257117
-S31508004D586571FFF769FFA071E5712572657207230A
-S31508004D68A4F8443038BD00BFC409002038B5FFF799
-S31508004D788FFF0E4C01252570FF23E370102323713E
-S31508004D8800236371FFF750FFA071FFF75FFFE0711B
-S31508004D98FFF75CFFC0F3072020726572A572082327
-S31508004DA8A4F84430FFF778FB38BD00BFC4090020D3
-S31508004DB838B505464478FFF737FF0138844210DCD2
-S31508004DC80A4C6A78A16C201DFFF790F9FF23E37057
-S31508004DD86A78A36C1344A3646B780133A4F8443047
-S31508004DE838BD2220FFF75AFFFAE700BFC40900209A
-S31508004DF838B504464578FFF717FF0138854211DCB0
-S31508004E0861680A4DA9646278281DFFF76FF9FF23C0
-S31508004E18EB706278AB6C1344AB6463780133A5F81E
-S31508004E28443038BD2220FFF739FFFAE7C4090020C5
-S31508004E38F8B505461746002406E015F8013B1C4454
-S31508004E48E4B2FFF721FF31464E1E0029F5D13C6032
-S31508004E580120F8BD10B5084CFF23E370E21D416830
-S31508004E68A06CFFF7E5FF207100236371A37108237F
-S31508004E78A4F8443010BD00BFC409002038B505465B
-S31508004E880D4B9C6CFFF7D0FE6A1C411E2046FFF7A7
-S31508004E9807FB60B1084CFF23E370FFF7C5FE01382E
-S31508004EA8A36C0344A3640123A4F8443038BD312015
-S31508004EB8FFF7F4FEFAE700BFC409002038B5044630
-S31508004EC84578FFF7B1FE023885420EDC114BFF2202
-S31508004ED8DA700122A3F84420617851B9FFF7F0FA8D
-S31508004EE830B93120FFF7DAFE02E02220FFF7D6FEB6
-S31508004EF838BDA21C074B986CFFF7D2FA28B161781F
-S31508004F08044A936C0B449364F2E73120FFF7C6FE14
-S31508004F18EEE700BFC409002008B54168074B986C3E
-S31508004F28FFF7C2FA30B1054BFF22DA700122A3F85F
-S31508004F38442008BD3120FFF7B1FEFAE7C40900206E
-S31508004F4808B5FFF7B3F8034BFF22DA700122A3F876
-S31508004F58442008BDC409002008B589B2FFF742FEF7
-S31508004F6808BD0000054B00221A709A6483F843208E
-S31508004F78A3F844209A705A70704700BFC4090020E5
-S31508004F88034B1B780BB1012070470020704700BF00
-S31508004F98C4090020024B002283F84320704700BF4B
-S31508004FA8C409002008B50378FF2B04D0354A1278BF
-S31508004FB8012A14D008BDFFF7D9FE324B93F84330BF
-S31508004FC8012B5AD02F4BB3F944100029F2DD1846A5
-S31508004FD8012380F843300330FFF7BEFFEAE7C93BF1
-S31508004FE8352B46D8DFE803F03345454245453F3675
-S31508004FF83C39454545454545454545454545454560
-S31508005008454545454545454545454545454545453A
-S315080050184545241E1B2145454527452A2D30FFF7BA
-S31508005028C7FECAE7FFF7E4FEC7E7FFF779FEC4E756
-S31508005038FFF710FFC1E7FFF75FFEBEE7FFF756FE6B
-S31508005048BBE7FFF743FEB8E7FFF732FEB5E7FFF71A
-S3150800505815FFB2E7FFF732FFAFE7FFF773FEACE7D6
-S31508005068FFF75AFFA9E7FFF76BFFA6E7FFF764FE06
-S31508005078A3E72020FFF712FE9FE71020FFF70EFE92
-S31508005088A0E700BFC4090020202303800048704712
-S31508005098480000200A23038000487047680000205B
-S315080050A808B590F89C32032B01D0002008BDFFF7FD
-S315080050B881FCFAE708B5FFF77DFC002008BD08B5AE
-S315080050C80846FFF7ABFC002008BD000008B50B78BA
-S315080050D813F0600F06D14B780A2B14D00B2B17D078
-S315080050E8062B01D0002008BD4B881B0A212B04D0AB
-S315080050F80B491722FEF7C8FEF4E7CA88172A28BFFD
-S3150800510817220849F6E701220749FEF7BDFEE9E72F
-S315080051188B7813B9044A1360E4E7FEF76BFBE1E7FB
-S31508005128510000205A000020100A002010B5044635
-S31508005138812100F0BAF90121204600F0B6F90020CD
-S3150800514810BD000010B5044640230222812100F054
-S31508005158A1F9402302220121204600F09BF94023A9
-S31508005168034A0121204600F0C8F9002010BD00BFF7
-S31508005178600E002000487047600E002012230B803E
-S31508005188004870479000002004230B8000487047A9
-S31508005198A40000200023934216D230B40BE037341B
-S315080051A801F8134000015C00013400250D55013350
-S315080051B8DBB2934206D2040F092CF0D8303401F832
-S315080051C81340EFE730BC70477047000038B50A4B04
-S315080051D8186804331C6804331B68C01800D138BD26
-S315080051E8064D0822A91CFFF7D5FF042205F112016E
-S315080051F82046FFF7CFFFF2E720F4F01FA8000020AB
-S3150800520808B51A230B80FFF7E1FF014808BD00BF60
-S31508005218A800002008B50A4628B105490548FEF73A
-S3150800522817FE034808BD02490248FEF711FEF8E7CB
-S31508005238A00E0020F456000810B5044C0A4621466C
-S315080052480348FEF705FE204610BD00BFA00E002045
-S31508005258E456000808B50A4628B105490548FEF780
-S31508005268F7FD034808BD02490248FEF7F1FDF8E7CD
-S31508005278A00E0020C456000808B50A4628B10549F4
-S315080052880548FEF7E5FD034808BD02490248FEF74A
-S31508005298DFFDF8E7A00E0020CC56000808B500F593
-S315080052A87171D0F80004FEF75DF908BD08B5C1EBC1
-S315080052B8C10293000344D3F80822D0F80004FEF785
-S315080052C87DF908BD08B5C1EBC102930003449A6C81
-S315080052D8D0F80004FEF7ABF908BD08B5D0F8000405
-S315080052E8FEF740FA08BD000010B50446C3683BB18E
-S315080052F8022B0FD091210848FFF7BCFB012100E0DB
-S315080053080021D4F80004FEF716FAD4F80004FEF7CC
-S31508005318E9F910BD0121F4E70857000810B5044655
-S31508005328D0F80004FEF70AFA2268D2F8003E43F0DD
-S315080053380103C2F8003E236A23B1044A136943F0FD
-S3150800534806031361FAF77CFF10BD00BF00ED00E005
-S3150800535810B50446FAF775FFD4F80004FEF7F7F90E
-S3150800536810BD08B5D0F80004FEF70CFA08BD08B554
-S31508005378D0F80004FEF704FA08BD10B50446012063
-S31508005388FAF75DFFD4F80004FEF7FEF910BD10B56C
-S3150800539804460020FAF753FFD4F80004FEF7F6F996
-S315080053A810BD000003780BB10020704710B50346FE
-S315080053B81748C0F80034C3F8C4024FF0A043036086
-S315080053C8062343600222C260002303618261012228
-S315080053D8C26103624362C3620363FCF7C1F880B91A
-S315080053E80B4C80212046FCF762FE4022002120460D
-S315080053F8FCF739FE802201212046FCF734FE0020FE
-S3150800540810BD40F225110348FFF734FBE8E700BF53
-S31508005418140A002008570008D0F8C43211F0800F83
-S3150800542808D101F07F01C1EBC1018A00134493F842
-S31508005438FE01704701F07F01C1EBC1018A001344E0
-S3150800544893F83E00704708B5D0F8C402FCF760FD2B
-S3150800545808BD18B1022803D00320704700207047FA
-S315080054680120704708B5D0F8C402FCF746F9FFF7DB
-S31508005478F0FF08BD08B5D0F8C402FCF709F9FFF72C
-S31508005488E8FF08BD08B5D0F8C402FCF716F9FFF717
-S31508005498E0FF08BD10B51C4613462246D0F8C402DC
-S315080054A8FCF790FCFFF7D5FF10BD08B5D0F8C40285
-S315080054B8FCF7C9FCFFF7CDFF08BD08B5D0F8C4024C
-S315080054C8FCF759FDFFF7C5FF08BD08B5D0F8C402B3
-S315080054D8FCF792FDFFF7BDFF08BD08B5D0F8C40272
-S315080054E8FCF75CFCFFF7B5FF08BD08B5D0F8C402A1
-S315080054F8FCF717FDFFF7ADFF08BD08B5D0F8C402DD
-S31508005508FCF7D8FCFFF7A5FF08BD000070B50D4EDF
-S315080055180D4CA41BA4100025A54209D10B4E0C4C12
-S3150800552800F018F8A41BA4100025A54205D170BDE3
-S3150800553856F8253098470135EEE756F82530984746
-S315080055480135F2E72C5700082C5700082C57000895
-S3150800555830570008F8B500BFF8BC08BC9E46704727
-S31108005568F8B500BFF8BC08BC9E467047AA
-S3150800557400000000000000000102030406070809F1
-S315080055840000000001020304433A2F576F726B2F81
-S31508005594736F6674776172652F4F70656E424C54EB
-S315080055A42F5461726765742F536F757263652F4143
-S315080055B4524D434D375F53544D333246372F63614B
-S315080055C46E2E630005020602060307030803090391
-S315080055D409040A040B040C040C050D050E050F0535
-S315080055E40F06100610071008008000080080000047
-S315080055F4010000000000010800800000020000000D
-S315080056040080010800800000030000000000020872
-S315080056140000020004000000000004080000040062
-S315080056240500000000000808000004000600000049
-S3150800563400000C080000040007000000433A2F5736
-S315080056446F726B2F736F6674776172652F4F70650F
-S315080056546E424C542F5461726765742F536F75727A
-S3150800566463652F41524D434D375F53544D3332468C
-S31508005674372F72733233322E63000000433A2F57A2
-S315080056846F726B2F736F6674776172652F4F7065CF
-S315080056946E424C542F5461726765742F536F75723A
-S315080056A463652F41524D434D375F53544D3332464C
-S315080056B4372F7573622E63004F70656E424C540023
-S315080056C444656661756C740057696E555342204289
-S315080056D4756C6B20496E74657266616365000000BB
-S315080056E44F70656E424C5420557365720000000075
-S315080056F457696E5553422042756C6B20446576692A
-S31508005704636500002E2E2F5553425F444556494380
-S31508005714452F5461726765742F757362645F636F8E
-S30D080057246E662E63000000000A
-S3090800572CED01000875
-S30908005730C901000895
-S315080057340024F4000100000010000000040000002A
-S315080057444D51000835510008D550000800000000E6
-S3150800575400000000BD500008C7500008A950000802
-S31508005764000000000000000000000000915000083E
-S31508005774000000009D50000809022000010100C035
-S31508005784320904000002FF000000070581024000F8
-S31508005794FF070501024000FF0A0600020000004058
-S315080057A40100000085510008915100084152000883
-S315080057B41D520008095200085D520008815200086B
-S315080057C41201000200000040501DAC6000020102F4
-S315080057D403010000040309041A0300000000000082
-S315080057E400000000000000000000000000000000A7
-S309080057F400000000A3
-S7050800072DBE
+S315080003780F94039404940594069407940894274BB9
+S315080003881A6C42F480221A641A6C02F480220292C9
+S31508000398029A1A6B42F008021A631B6B03F00803E9
+S315080003A80193019B4FF4807303934FF00208CDF82D
+S315080003B810800327059707260896194D03A9284686
+S315080003C801F070FF4FF400730393CDF8108005977A
+S315080003D806940794089603A9284601F063FF4FF484
+S315080003E8E13309930A940B940C940C230D930E94F9
+S315080003F80F940C4C09A9204602F032FA636823F4D4
+S3150800040890436360A36823F02A03A360236843F034
+S315080004180103236010B0BDE8F08100BF0038024030
+S31508000428000C02400048004008B5364A136823F015
+S315080004380F0343F007031360324B1B6803F00F03DF
+S31508000448072BF9D1304B1A6842F440421A601A68E9
+S3150800045842F480321A6003F5E4331A6842F48022BB
+S315080004681A601A6842F480321A60284B1B6813F41B
+S31508000478003FFAD0254B5A6825491140254A0A43B0
+S315080004885A605A6824491140244A0A435A601A6825
+S3150800049842F080721A601D4B1B6813F0007FFAD071
+S315080004A81A4B9A6822F0F0029A609A6822F4E05287
+S315080004B842F4A0529A609A6822F4604242F40042D2
+S315080004C89A609A6822F0030242F002029A600F4B79
+S315080004D89B6803F00C03082BF9D1114802F0FAFFC0
+S315080004E8002000F063F9094BD3F8902022F0006247
+S315080004F8C3F89020D3F8902022F03002C3F8902051
+S3150800050808BD00BF003C02400070004000380240A9
+S315080005180080BCFF086C40000080BFF0086C4009EA
+S3150800052800E6DF0C08B500F067F9FFF77DFFFFF76F
+S31508000538BFFEFFF713FFFFF763FEFFF765FEFCE74D
+S3150800054882B00A4B1A6C42F080521A641A6C02F08E
+S3150800055880520092009A5A6C42F480425A645B6C44
+S3150800056803F480430193019B02B0704700380240A8
+S3150800057800B589B00023039304930593069307935C
+S315080005880268144B9A4202D009B05DF804FB03F5D9
+S31508000598EA331A6C42F000721A641A6C02F0007296
+S315080005A80192019A1A6B42F002021A631B6B03F056
+S315080005B802030293029B4FF44073039302230493A6
+S315080005C8032306930923079303A9034800F0E8FDC4
+S315080005D8DAE700BF006400400004024010B588B09E
+S315080005E80023039304930593069307930368B3F1CB
+S315080005F8A04F01D008B010BD144C236B43F001037B
+S315080006082363236B03F001030093009B4FF4C05345
+S31508000618039302230493032306930A23079303A940
+S315080006280B4800F0BDFD636B43F080036363636B9F
+S3150800063803F080030193019B636C43F4804363646E
+S31508000648636C03F480430293029BD3E700380240A5
+S315080006580000024008B50368B3F1A04F00D008BDF2
+S31508000668054A536B23F0800353634FF4C05103487C
+S3150800067800F088FEF3E700BF003802400000024099
+S3150800068810B501F0B9FE174C4FF40003A3611648DC
+S3150800069801F04AFD154801F047FD204601F044FDE2
+S315080006A8134801F041FD134B1A6C22F480221A6490
+S315080006B81A6B22F008021A631A6B22F004021A63EC
+S315080006C81A6B22F002021A631A6B22F001021A63E5
+S315080006D81A6C22F080521A645A6C22F480425A64C0
+S315080006E810BD00BF00040240000C0240000802408A
+S315080006F800000240003802407047FEE7FEE7FEE7C2
+S31508000708FEE770477047704708B500F081F808BDDE
+S31508000718054BD3F8882042F47002C3F888204FF0B6
+S3150800072800629A60704700BF00ED00E0DFF834D039
+S31508000738002103E00C4B5B58435004310B480C4B23
+S3150800074842189A42F6D30B4A02E0002342F8043BC1
+S31508000758094B9A42F9D3FFF7DBFF04F08DFFFFF741
+S31508000768E1FE704700000520305900080000002007
+S315080007788C0100208C01002004120020FEE70000EE
+S3150800078810B5094B4FF0FF321A6200241C625A62F0
+S315080007985C621A611C615A615C619A619C61FFF727
+S315080007A86FFF204610BD00BF0038024010B504464A
+S315080007B80E4B18784FF47A73B3FBF0F30C4A1068AB
+S315080007C8B0FBF3F000F032FB68B90F2C01D9012011
+S315080007D80AE0002221464FF0FF3000F0F1FA054BF7
+S315080007E81C60002000E0012010BD00BF04000020A6
+S315080007F8000000200800002008B5032000F0CEFA03
+S315080008080020FFF7D3FFFFF79BFE002008BD000076
+S31508000818034A1168034B1B780B441360704700BFE3
+S31508000828B40500200400002038B5044603F082FF0A
+S315080008380546B4F1FF3F02D0044B1B781C4403F06D
+S3150800084879FF401BA042FAD338BD00BF0400002038
+S31508000858002800F0A18038B5044690F82030D3B1B6
+S315080008682268136823F00203136003F063FF054642
+S3150800087823685A6812F0020F10D003F05BFF401B7A
+S315080008880A28F5D9636A43F400336362052384F8B2
+S315080008982030012038BDFFF76BFEE1E71A6842F001
+S315080008A801021A6003F046FF054623685A6812F0E3
+S315080008B8010F0DD103F03EFF401B0A28F5D9636ADC
+S315080008C843F400336362052384F820300120E1E706
+S315080008D8227E012A3DD01A6822F080021A60637EB9
+S315080008E8012B3BD02268136823F040031360A37ECC
+S315080008F8012B39D02268136823F020031360E37E9E
+S31508000908012B37D02268136843F010031360237F3E
+S31508000918012B35D02268136823F008031360637F18
+S31508000928012B33D02268136823F004031360A368E5
+S31508000938E268134322691343626913436268013AFA
+S3150800094821681343CB6100206062012384F82030B4
+S31508000958A0E71A6842F080021A60C0E7226813689E
+S3150800096843F040031360C2E72268136843F0200384
+S315080009781360C4E72268136823F010031360C6E7F8
+S315080009882268136843F008031360C8E722681368E7
+S3150800099843F004031360CAE70120704790F8203033
+S315080009A8013BDBB2012B05D9436A43F48023436232
+S315080009B80120704730B5464BD3F8002242F00102B1
+S315080009C8C3F80022D3F8002222F47C52C3F8002286
+S315080009D8D3F80022486A42EA0022C3F800224A6984
+S315080009E802F01F02012000FA02F2D3F81C026FEA8D
+S315080009F8020C20EA0200C3F81C02CB69C3B9344BBF
+S31508000A08D3F80C020CEA0000C3F80C028C88486973
+S31508000A18CD6844EA0544483043F830408C6808886D
+S31508000A2840EA04404C6904F1480E03EBCE035860CB
+S31508000A38CB69012B1ED08B69002B33D12448D0F8FB
+S31508000A4804320CEA0303C0F804320B698BBB20484E
+S31508000A58D0F814320CEA0303C0F814320B6A012BD7
+S31508000A682ED01B4AD2F8003223F00103C2F800320E
+S31508000A78002030BD164BD3F80C021043C3F80C02FD
+S31508000A888C8848690D6844EA0544483043F830407C
+S31508000A9888894C698D6840EA0540483403EBC403E5
+S31508000AA85860C8E70A48D0F804321343C0F8043235
+S31508000AB8CBE70748D0F814321343C0F81432CDE709
+S31508000AC80349D1F81C321A43C1F81C22C9E700BFEA
+S31508000AD80064004070B5044690F82050EDB2012D28
+S31508000AE806D0436A43F4002343620125284670BDAD
+S31508000AF8022380F820300268136823F00103136084
+S31508000B0803F018FE064623685B6813F0010F0CD03D
+S31508000B1803F010FE831B0A2BF5D9636A43F40033E6
+S31508000B286362052384F82030E0E700256562DDE77F
+S31508000B3830B590F820C00468A4680CF1FF3C5FFA49
+S31508000B488CFCBCF1010F6BD814F0E05F62D0C4F3DB
+S31508000B58016CBCF1020F05D9436A43F400034362EA
+S31508000B68012062E0012404FA0CF41C608B68002B4F
+S31508000B783DD10D68CB68046843EA45550CF118035E
+S31508000B881B01E55003680C690CF1180E03EB0E13EC
+S31508000B985C600B7D012B35D0D17993791B0443EA28
+S31508000BA80163517943EA012314790168234301EB68
+S31508000BB80C11C1F88C31D17893781B0443EA016388
+S31508000BC8517843EA0123117802680B4302EB0C12A9
+S31508000BD8C2F8883102680CF1180C4FEA0C1C52F856
+S31508000BE80C3043F0010342F80C3000201DE04C6835
+S31508000BF843EAC403CC6823430CF1180424010568A6
+S31508000C082B51BFE7036803EB0E13596841F480714B
+S31508000C185960C1E7436A43F400134362012004E0BC
+S31508000C28436A43F480234362012030BD90F820309C
+S31508000C38013BDBB2012B01D90020704703689B688A
+S31508000C4803EA8163B3EB816F01D001207047002066
+S31508000C58704790F820C00CF1FF3C5FFA8CFCBCF199
+S31508000C68010F00F2958030B451B90468E46814F0AD
+S31508000C78030F10D1436A43F400134362012077E057
+S31508000C880468246914F0030F05D1436A43F4001372
+S31508000C98436201206CE001F11B04240105682C5904
+S31508000CA804F004049460002C64D101F11B042401A7
+S31508000CB805682C59640D1460046801F11B0C4FEA89
+S31508000CC80C1C54F80C4004F00204D460046864440C
+S31508000CD8646804F00F041461046864446468C4F31F
+S31508000CE807249461046864446468240C546102689F
+S31508000CF802EB0112D2F8B8211A70026802EB011247
+S31508000D08D2F8B821C2F307225A70026802EB011218
+S31508000D18D2F8B821C2F307429A70026802EB0112A8
+S31508000D28D2F8B821120EDA70026802EB0112D2F86C
+S31508000D38BC211A71026802EB0112D2F8BC21C2F36F
+S31508000D4807225A71026802EB0112D2F8BC21C2F3D3
+S31508000D5807429A71026802EB0112D2F8BC21120EF8
+S31508000D68DA7179B90268D36843F02003D3600020A2
+S31508000D7830BC704701F11B04240105682C59E408A6
+S31508000D88546099E70268136943F020031361EEE794
+S31508000D98436A43F480234362012070470649CB68B7
+S31508000DA823F4E0631B041B0C000200F4E060034311
+S31508000DB8024A1A43CA60704700ED00E00000FA05C7
+S31508000DC800B5174BDB68C3F30223C3F1070CBCF164
+S31508000DD8040F28BF4FF0040C03F1040EBEF1060FEA
+S31508000DE814D9033B4FF0FF3E0EFA0CFC21EA0C011E
+S31508000DF899400EFA03F322EA03031943002807DB8E
+S31508000E080901C9B2074B19545DF804FB0023E9E741
+S31508000E1800F00F000901C9B2034B1954F4E700BFE3
+S31508000E2800ED00E000E400E014ED00E00138B0F160
+S31508000E38807F0BD24FF0E0235861054AF02182F8EB
+S31508000E4823100020986107221A617047012070470D
+S31508000E5800ED00E010B40A490C6924F440740C61EA
+S31508000E680C6944F440740C610C6944F001040C6183
+S31508000E7802604360BFF34F8F5DF8044B704700BFAD
+S31508000E88003C0240084B1A6922F440721A611A6932
+S31508000E9842F400721A611A6942F001021A61016085
+S31508000EA8BFF34F8F704700BF003C0240084B1A69D2
+S31508000EB822F440721A611A6942F480721A611A6930
+S31508000EC842F001021A610180BFF34F8F704700BFD5
+S31508000ED8003C0240074B1A6922F440721A611A69E3
+S31508000EE81A611A6942F001021A610170BFF34F8F3D
+S31508000EF8704700BF003C02401A4BDB6813F0020F2C
+S31508000F0804D0194A936943F020039361154BDB68AB
+S31508000F1813F0100F04D0144A936943F01003936131
+S31508000F28104BDB6813F0200F04D00F4A936943F07F
+S31508000F38080393610B4BDB6813F0400F04D00A4A89
+S31508000F48936943F004039361064BDB6813F0800F3B
+S31508000F5804D0054A936943F002039361014BF222D0
+S31508000F68DA607047003C0240B8050020094B1B6947
+S31508000F78002B01DB00207047064B074A5A6002F12E
+S31508000F8888325A601B69002B01DB00207047012054
+S31508000F98704700BF003C024023016745034A1369AE
+S31508000FA843F0004313610020704700BF003C02402D
+S31508000FB838B50446154B00229A6103F0BBFB054673
+S31508000FC8134BDB6813F4803F0AD0B4F1FF3FF7D020
+S31508000FD824B103F0AFFB401BA042F1D903200DE072
+S31508000FE80B4BDB6813F0F20F09D1094BDB6813F0DA
+S31508000FF8010F08D0064B0122DA60002038BDFFF73A
+S315080010087BFF0120FAE70020F8E700BFB8050020B3
+S31508001018003C0240F8B516461B4A127D012A31D013
+S3150800102804460D461F46184B01221A754CF25030D5
+S31508001038FFF7BEFF90B9032C07D8DFE804F00213C0
+S31508001048181DF1B22846FFF745FF4CF25030FFF756
+S31508001058AFFF0E4A136923F0010313610A4B0022F6
+S315080010681A75F8BDB1B22846FFF720FFEDE73146F5
+S315080010782846FFF707FFE8E732463B462846FFF7C4
+S31508001088E9FEE2E70220ECE7B8050020003C02404A
+S31508001098084B196921F440711961196941F004016D
+S315080010A819611A6942EA002242F480321A61BFF3CA
+S315080010B84F8F7047003C024049B1012923D00229C5
+S315080010C802D04FF4407C04E04FF4007C01E04FF076
+S315080010D8000C0E4B196921F4407119611A6942EA24
+S315080010E80C021A611A6922F0F8021A611A6942EAA8
+S315080010F8C00040F0020018611A6942F480321A6189
+S31508001108BFF34F8F70474FF4807CE2E7003C0240FC
+S31508001118214B1B7D012B3CD070B504460E461E4B51
+S3150800112801221A754CF25030FFF742FF014658BBA8
+S315080011384FF0FF3333602368012B16D06568A36820
+S3150800114862681344AB421FD9217B2846FFF7B4FFD0
+S315080011584CF25030FFF72CFF104A136923F07A0334
+S315080011681361014678B90135E9E7207BFFF790FF57
+S315080011784CF25030FFF71CFF0146084A136923F062
+S315080011880403136100E03560034B00221A7508460C
+S3150800119870BD022108467047B8050020003C024089
+S315080011A800230F2B00F2E480F0B583B03AE0092259
+S315080011B800E00022AA40324302346E4D45F8242046
+S315080011C86D4A14686FEA0C0224EA0C054E6816F490
+S315080011D8803F01D04CEA0405674C2560646802EA3A
+S315080011E804054E6816F4003F01D04CEA0405624C23
+S315080011F86560A46802EA04054E6816F4801F01D0E3
+S315080012084CEA04055C4CA560E46822404D6815F470
+S31508001218001F01D04CEA0402574CE26001330F2B39
+S3150800122800F2A48001229A400C6804EA020C32EA09
+S315080012380404F3D14C68651E112C18BF012D01D979
+S31508001248122C12D185685E000324B44025EA0405E9
+S31508001258CC68B4402C438460456825EA02054C6886
+S31508001268C4F300129A402A434260C5684FEA430EFF
+S31508001278032404FA0EF4E24325EA04058C6804FA02
+S315080012880EF42C43C4604C68122C18BF022C0FD1DC
+S31508001298DD08083550F8257003F00704A6000F2462
+S315080012A8B44027EA04070C69B4403C4340F8254093
+S315080012B8046814404A6802F0030202FA0EF222434E
+S315080012C802604A6812F0805FA8D02C4A546C44F42D
+S315080012D880445464526C02F480420192019A9C0834
+S315080012E8A51C244A52F8256003F0030295000F222C
+S315080012F8AA4026EA0206224A90423FF45AAF02F565
+S315080013088062904222D002F58062904220D002F58F
+S31508001318806290421ED002F5806290421CD002F587
+S31508001328806290421AD002F58062904218D002F57F
+S315080013388062904216D002F58062904214D002F577
+S31508001348806290423FF433AF0A2233E7012231E73D
+S3150800135802222FE703222DE704222BE7052229E795
+S31508001368062227E7072225E7082223E703B0F0BD68
+S31508001378704700BF00380140003C01400038024071
+S315080013880000024000230F2B00F29B80F0B52DE0E9
+S31508001398092500E0002505FA0CFCA44575D0046863
+S315080013A85D004FF0030C0CFA05FC24EA0C040460F3
+S315080013B84FEAD30E0EF1080E50F82E4003F0070533
+S315080013C8AE000F25B54024EA050440F82E40C46847
+S315080013D824EA0C04C460446824EA0202426082686B
+S315080013E822EA0C02826001330F2B69D801229A403F
+S315080013F802EA010632EA0104F5D14FEA930E0EF124
+S315080014080205304C54F8254003F0030C4FEA8C0CBF
+S315080014180F2505FA0CF73C402B4DA842BAD005F51E
+S315080014288065A84221D005F58065A8421FD005F534
+S315080014388065A8421DD005F58065A8421BD005F52C
+S315080014488065A84219D005F58065A84217D005F524
+S315080014588065A84215D005F58065A84213D005F51C
+S315080014688065A84294D00A2595E7012593E70225C1
+S3150800147891E703258FE704258DE705258BE70625DC
+S3150800148889E7072587E7082585E7104C256825EAAB
+S3150800149806052560656825EA06056560A56825EADE
+S315080014A80605A560E56825EA0606E660054E0EF116
+S315080014B8020456F8245025EA070546F824506EE72C
+S315080014C8F0BD70470038014000000240003C01406A
+S315080014D82DE9F04383B0D0F80080C1EBC10300EBD7
+S315080014E883035A6D1B6D9A4254D807460C469B1AB5
+S315080014F8C1EBC10200EB8202526C9A4200D31A462B
+S3150800150802F103094FEA990915E006F103094FEABA
+S315080015189909C4EBC40507EB8505A96C3B7C0093C0
+S31508001528B3B2E2B2404601F07BFDAB6C3344AB6420
+S315080015386B6D33446B6508EB441303F510639B69BD
+S315080015489BB24B4512D3C4EBC40207EB8202516D1A
+S31508001558136D99420AD24BB15B1AC4EBC40207EB66
+S315080015688202566C9E42D0D31E46CEE7C4EBC40010
+S3150800157807EB80073A6D7B6D9A420FD804F00F0483
+S315080015880123A340D8F8344824EA0304C8F83448A1
+S31508001598002000E0012003B0BDE8F0830020FAE748
+S315080015A870B58AB0002800F097800546046890F858
+S315080015B8BD333BB3032385F8BD33E36B13F4807F50
+S315080015C801D100232B61286801F0B0FA2C4654F89B
+S315080015D8106BEC460FCCACE80F000FCCACE80F004C
+S315080015E894E803008CE803002B1D0ECB304601F067
+S315080015F8E7F9044658B1022385F8BD330124204685
+S315080016080AB070BD80F8BC33FEF7E8FFD2E70021C0
+S31508001618286801F091FA234616E0C3EBC30205EBE6
+S315080016288202012182F83D1082F83C30A2F8423045
+S31508001638002182F83F1051649164C3EBC30205EB9D
+S31508001648820211650133DBB269688B42E5D316E07D
+S31508001658C4EBC40305EB8303002283F8FD2183F852
+S31508001668FC4183F8FF21C3F80422C3F80822C4EB17
+S31508001678C40305EB8303C3F810220134E4B2A1427C
+S31508001688E6D82C4654F8106BEC460FCCACE80F009D
+S315080016980FCCACE80F0094E803008CE803002B1D78
+S315080016A80ECB304601F08EFA044660B9002385F859
+S315080016B83830012385F8BD336B6A012B08D02868B2
+S315080016C801F086FE9BE7022385F8BD33012496E7D9
+S315080016D8284600F00DFDF2E7012490E790F8BC33A0
+S315080016E8012B0ED010B50446012380F8BC330068D8
+S315080016F801F062FE206801F013FA002084F8BC03A2
+S3150800170810BD0220704738B590F8BC33012B18D0A5
+S315080017180446012380F8BC33006801F007FA2068FC
+S3150800172801F01AFE054628B1002384F8BC330125C2
+S31508001738284638BD206801F04BFE002384F8BC33E0
+S31508001748F6E70225F4E768B110B50446032380F8DE
+S31508001758BD33FFF7D8FF2046FEF77CFF002084F844
+S31508001768BD0310BD0120704770B504460D460068D4
+S31508001778066C00EB411303F530639A682169012961
+S3150800178811D034498E424ED03DB9C5EBC50304EB9A
+S315080017988303D3F81032002B56D0E9B2204603F05B
+S315080017A83BFE002070BD12F0080F09D02A498E4268
+S315080017B8F7D912F4004FF4D04FF400429A60F0E7D4
+S315080017C812F0200F02D020229A60EAE712F0280FBA
+S315080017D8E7D121498E4206D912F4004F03D04FF4B7
+S315080017E800429A60DDE7C5EBC50204EB8202D2F82F
+S315080017F804121B69C3F31203CB1AC2F81432D2F8BF
+S3150800180808320B44C2F8083215B9D2F8103223B197
+S31508001818E9B2204603F000FEC3E704F57172012118
+S3150800182801F028FEF4E712F4004F03D04FF4004203
+S315080018389A60B6E712F0200F01D020229A60E9B222
+S31508001848204603F0E9FDACE704F57172002101F0C2
+S3150800185811FEA2E70A31544F0A30544F38B50446E8
+S3150800186803681D6C03EB4113D3F8081B0E4A95420F
+S3150800187807D903F5306311F4004F02D04FF400423C
+S315080018889A60204603F0C0FD074B9D4202D923699A
+S31508001898012B01D0002038BD04F57172012120689A
+S315080018A801F0E8FDF6E700BF0A30544F2DE9F84F76
+S315080018B804460568284601F0C8FD08B1BDE8F88F52
+S315080018C80646206801F090FD0028F7D0206801F048
+S315080018D88BFD10F0020F04D02268536903F0020347
+S315080018E85361206801F080FD10F0100F14D02268AB
+S315080018F8936923F0100393612F6A07F00F08C7F35B
+S315080019084343022B00F08580062B00F0A18022684D
+S31508001918936943F010039361206801F065FD10F49C
+S31508001928002F40F0A780206801F05EFD10F4802F94
+S3150800193840F0E980206801F057FD0028C0F253817D
+S31508001948206801F051FD10F4006F0AD0D5F8083860
+S3150800195813F0010F40F061812268536903F40063AC
+S315080019685361206801F040FD10F0006F15D0226819
+S31508001978536903F00063536194F8F433002B40F07D
+S315080019885081012184F8F41323685B6DC3F383033C
+S31508001998C4F8F833204600F0BFFB206801F024FDA0
+S315080019A810F4805F40F04181206801F01DFD10F4B5
+S315080019B8005F40F09581206801F016FD10F0080FC9
+S315080019C840F0A681206801F00FFD10F4801F40F052
+S315080019D8A881206801F008FD10F4001F40F0AB81CB
+S315080019E8206801F001FD10F0804F40F0AE812068B4
+S315080019F801F0FAFC10F0040F3FF460AF23685D6845
+S31508001A0815F0040F40F0AA81226853682B435360E7
+S31508001A1854E747F6F0731F423FF479AF4FEA171BAE
+S31508001A28C8EBC80904EB8909C7F30A12D9F80812DA
+S31508001A38284601F027FCCBF30A02D9F808321344E2
+S31508001A48C9F80832D9F814321A44C9F814225EE7D4
+S31508001A58082204F57171284601F014FCC7F30A1721
+S31508001A68C8EBC80204EB8202D2F814321F44C2F843
+S31508001A7814724CE7206801F0BBFC0746B04616E02E
+S31508001A8805EB48130122C3F8082B41462046FFF701
+S31508001A986BFE1BE005EB48130822C3F8082B4146E2
+S31508001AA82046FFF7DBFE14E008F101087F08002F3F
+S31508001AB83FF439AF17F0010FF6D05FFA88F12068BE
+S31508001AC801F0A6FC814610F0010FD9D119F0080FCC
+S31508001AD8E0D119F0100F04D005EB48131022C3F80B
+S31508001AE8082B19F0200F04D005EB48132022C3F859
+S31508001AF8082B19F4005FD7D005EB48134FF40052AA
+S31508001B08C3F8082BD0E7206801F07AFC0746B046E8
+S31508001B1829E05146204603F08BFC19F0080F04D03B
+S31508001B2805EB48130822C3F8082919F0100F04D042
+S31508001B3805EB48131022C3F8082919F0400F04D0FA
+S31508001B4805EB48134022C3F8082919F0020F04D0F8
+S31508001B5805EB48130222C3F8082919F0800F3DD16E
+S31508001B6808F101087F08002F3FF4E4AE17F0010FCB
+S31508001B78F6D05FFA88FA5146206801F052FC814689
+S31508001B8810F0010FC9D008F00F03012101FA03F27A
+S31508001B98D5F8343823EA0203C5F8343805EB481370
+S31508001BA8C3F8081923698B42B3D1C8EBC80304EBF9
+S31508001BB88303596C9A6C0A449A64B8F1000FA8D141
+S31508001BC8C8EBC80304EB83031B6D002BA1D104F5EE
+S31508001BD871720121206801F04DFC9AE741462046BA
+S31508001BE8FFF776FCBCE7D5F8043823F00103C5F8F7
+S31508001BF8043894F8F433012B08D0204603F05EFC29
+S31508001C082268536903F00043536199E6002184F872
+S31508001C18F413204600F080FAF2E7204603F034FC75
+S31508001C289AE6204603F030FCB7E605F500677B68B8
+S31508001C3823F001037B601021206800F095FF20E05F
+S31508001C4805EB46134FF67F31C3F80819D3F8002970
+S31508001C5822F40012C3F80029D3F8002942F00062DA
+S31508001C68C3F80029C3F8081BD3F8002B22F400127E
+S31508001C78C3F8002BD3F8002B42F00062C3F8002BF8
+S31508001C8801366368B342DBD8FB6943F00113FB618D
+S31508001C98236BDBB1D7F8843043F00B03C7F88430DD
+S31508001CA87B6C43F00B037B64D5F8003823F4FE639A
+S31508001CB8C5F8003804F57172217C206801F0DAFB52
+S31508001CC82268536903F4805353616DE67A6942F2D0
+S31508001CD82B0313437B613B6943F00B033B61E3E743
+S31508001CE8206801F0B7FB206801F03EF8E060256837
+S31508001CF800F014FA0146227B284600F09FFE20468B
+S31508001D0803F0A8FB2268536903F40053536152E6AB
+S31508001D18204603F098FB2268536903F008035361C9
+S31508001D2850E60021204603F0D8FB2268536903F4DD
+S31508001D38801353614DE60021204603F0C8FB22684C
+S31508001D48536903F4001353614AE6204603F0CBFBB4
+S31508001D582268536903F08043536148E6204603F036
+S31508001D68CCFB51E690F8BC33012B0BD010B50446D2
+S31508001D78012380F8BC33006801F01EFB002084F8B4
+S31508001D88BC0310BD0220704790F8BC33012B0BD05A
+S31508001D9810B50446012380F8BC33006801F018FB27
+S31508001DA8002084F8BC0310BD0220704790F8BC33A5
+S31508001DB8012B0DD010B50446012380F8BC3380F8F2
+S31508001DC83810006801F0E8FA002084F8BC0310BD52
+S31508001DD80220704738B505468C4611F0800F29D180
+S31508001DE801F00F0ECEEBCE04A40004F5FC740444EF
+S31508001DF8211DCEEBCE0E00EB8E0E00208EF8FD01CF
+S31508001E080CF00F0C81F800C08A60CB704A780AB1CA
+S31508001E18A1F806C0022B1DD095F8BC33012B1CD09F
+S31508001E28012385F8BC33286800F0AEFF002085F842
+S31508001E38BC0338BD01F00F00C0EBC001890038317A
+S31508001E4829440431C0EBC00005EB8000012480F862
+S31508001E583D40D5E700230B71DEE70220E9E710B518
+S31508001E6804460A4611F0800F20D101F00F00C0EB96
+S31508001E78C0039B0003F5FC732344191DC0EBC0007F
+S31508001E8804EB8000002380F8FD3102F00F020A7087
+S31508001E9894F8BC33012B19D0012384F8BC33206885
+S31508001EA800F0C0FF002084F8BC0310BD01F00F0045
+S31508001EB8C0EBC0039B0038332344191DC0EBC00090
+S31508001EC804EB8000012380F83D30DEE70220ECE7CA
+S31508001ED810B501F00F04C4EBC401890001F5FC71C3
+S31508001EE801440431C4EBC40C00EB8C0CCCF8082272
+S31508001EF8CCF810320023CCF814328CF8FD318CF863
+S31508001F08FC410369012B06D064B9DAB2006800F00F
+S31508001F18F9FF002010BDC4EBC40C00EB8C0CCCF800
+S31508001F280C22F1E7DAB2006801F092F8F1E701F05D
+S31508001F380F01C1EBC10100EB8101D1F8140270470A
+S31508001F4810B501F00F04C4EBC40189003831014407
+S31508001F580431C4EBC40C00EB8C0CCCF84820CCF844
+S31508001F6850300023CCF8543001238CF83D308CF8D7
+S31508001F783C400369012B06D064B9DAB2006800F060
+S31508001F88C1FF002010BDC4EBC40C00EB8C0CCCF8C8
+S31508001F984C20F1E7DAB2006801F05AF8F1E738B5EB
+S31508001FA801F00F054268954239D804460B4611F0E8
+S31508001FB8800F1FD1C1EBC101890001F5FC710144ED
+S31508001FC80431C3EBC30300EB8303002283F8FD2126
+S31508001FD801238B700D7094F8BC33012B21D0012393
+S31508001FE884F8BC33206801F05CF98DB1002084F8C8
+S31508001FF8BC0338BDC5EBC501890038310144043135
+S31508002008C5EBC50300EB8303012283F83D20DFE710
+S3150800201804F57172217C206801F02CFAE6E70120A4
+S31508002028E7E70220E5E701F00F034268934231D853
+S3150800203810B5044611F0800F1ED1C3EBC301890001
+S3150800204801F5FC7101440431C3EBC30200EB8202BB
+S31508002058002082F8FD0100228A700B7094F8BC33C0
+S31508002068012B19D0012384F8BC33206801F046F9FE
+S31508002078002084F8BC0310BDC3EBC30189003831BE
+S3150800208801440431C3EBC30200EB8202012082F843
+S315080020983D00E0E7012070470220ECE710B4046829
+S315080020A8606A31B940EA0240A06200205DF8044B34
+S315080020B870478C46A36A00EB1340002308E003F137
+S315080020C8400104EB8101496800EB11400133DBB29A
+S315080020D80CF1FF318B42F2D340EA02400CF13F0182
+S315080020E804EB81014860E0E70368596200207047FD
+S315080020F8034602680121C0F8FC13002083F8F4039C
+S31508002108936943F000639361516D024B0B43536522
+S31508002118704700BF0300001070470000014B18689D
+S31508002128704700BF00000020534B98421FD0534BFE
+S31508002138984228D0524B984231D0524B98423AD0BE
+S31508002148514B984243D0514B98424CD0504B9842E9
+S3150800215855D0504B98425ED04F4B984267D04F4B5C
+S31508002168984270D04E4B984279D00120704703F5B3
+S3150800217860531A6942F001021A611A6922F00102CB
+S315080021881A610020704703F550531A6942F0020293
+S315080021981A611A6922F002021A610020704703F5CB
+S315080021A840531A6942F004021A611A6922F00402B5
+S315080021B81A610020704703F530531A6942F008027D
+S315080021C81A611A6922F008021A610020704703F595
+S315080021D820531A6942F010021A611A6922F010028D
+S315080021E81A610020704703F510531A6942F0200255
+S315080021F81A611A6922F020021A610020704703F54D
+S3150800220800531A6942F040021A611A6922F040021C
+S315080022181A610020704703F5E0531A6942F08002F4
+S315080022281A611A6922F080021A610020704703F5BC
+S31508002238C0531A6942F480721A611A6922F48072C4
+S315080022481A610020704703F5A0531A6942F4007210
+S315080022581A611A6922F400721A610020704703F598
+S3150800226880531A6942F480621A611A6922F48062F4
+S315080022781A610020704700BF0000024000040240AF
+S3150800228800080240000C02400010024000140240F8
+S3150800229800180240001C02400020024000240240A8
+S315080022A8002802400B6893FAA3F3B3FA83FC57E0B5
+S315080022B88D68826893FAA3F4B4FA84F464004FF03C
+S315080022C8030E0EFA04F422EA040293FAA3F4B4FA03
+S315080022D884F4640005FA04F4224382600C68CD6825
+S315080022E8426822EA040205FB04F42243426045E0F8
+S315080022F893FAA3F2B2FA82F2072A15D84D69026A46
+S3150800230893FAA3F4B4FA84F4A4000F2606FA04F49C
+S3150800231822EA040293FAA3F4B4FA84F4A40005FAA8
+S3150800232804F42243026241E04C69456A1A0A92FAA1
+S31508002338A2FEBEFA8EFE4FEA8E0E0F2606FA0EFE8D
+S3150800234825EA0E0592FAA2F2B2FA82F2920004FA85
+S3150800235802F22A43426229E0002070BD0CF1010C02
+S315080023680B6833FA0CF244D0012202FA0CF2134035
+S31508002378F4D070B54A68013A012A99D9C26893FA1D
+S31508002388A3F4B4FA84F46400032505FA04F422EAEB
+S31508002398040293FAA3F4B4FA84F464000D6905FAFE
+S315080023A804F42243C2604A68022AA1D04A6804682B
+S315080023B893FAA3FEBEFA8EFE4FEA4E0E032505FAD9
+S315080023C80EFE24EA0E0E93FAA3F3B3FA83F35B0020
+S315080023D802FA03F34EEA030303600CF1010C0B68D7
+S315080023E833FA0CF2B8D0012202FA0CF21340F4D0F0
+S315080023F8C0E700207047000082B0224A136843F0FD
+S31508002408010313601F4B1B6813F0020FFAD01D4B0C
+S3150800241800229A601A68019201991B4A0A40019299
+S31508002428019A1A601A6822F0F80242F080021A60C5
+S31508002438144B1B6813F0007FFAD1124B1B6813F074
+S31508002448006FFAD10F4B1B6813F0005FFAD10D4BDA
+S315080024580E4A5A60103AC3F88420C3F88820DA6806
+S3150800246822F4FE42DA60DA6842F47F02DA605A6FCA
+S3150800247822F001025A675A6F42F080725A670020A2
+S3150800248802B0704700380240FFFFF2EA1030002415
+S31508002498034B9B68C3F30313024AD35CD8407047BF
+S315080024A800380240E0560008034B9B68C3F38223B2
+S315080024B8024AD35CD840704700380240F0560008F4
+S315080024C8034B9B68C3F34233024AD35CD840704730
+S315080024D800380240F05600080D4B5B6803F4800389
+S315080024E89BB90C480A4B5A6802F03F02B0FBF2F057
+S315080024F85A68C2F3881202FB00F05B68C3F301430B
+S3150800250801335B00B0FBF3F070470348EAE700BF06
+S31508002518003802400024F40000127A0008B5074B78
+S315080025289B6803F00C03042B04D0082B04D1FFF78F
+S31508002538D3FF02E0024800E0024808BD003802401E
+S3150800254800127A000024F40010B50446FFF7E6FFE7
+S315080025582060FFF79DFF6060FFF7A6FFA060606830
+S31508002568FFF7AEFFE06010BD08B5032808D00C28B1
+S315080025782ED0B0F5406F53D030287AD0002008BD49
+S31508002588514BD3F89030034043EA00404F4B9842EA
+S315080025980FD0B0F1031F13D0013B984206D0FFF7BE
+S315080025A8BDFFFFF775FFFFF78BFFE8E7FFF7B6FFF5
+S315080025B8E5E7454B186810F00200E0D04448DEE726
+S315080025C8414B186F10F00200D9D04FF40040D6E7F7
+S315080025D83D4BD3F89030034043EA00403D4B9842C0
+S315080025E80FD0B0F10C1F13D0043B984206D0FFF762
+S315080025F895FFFFF74DFFFFF757FFC0E7FFF78EFF79
+S31508002608BDE7314B186810F00200B8D03048B6E775
+S315080026182D4B186F10F00200B1D04FF40040AEE70A
+S31508002628294BD3F89030034043EA00402A4B984296
+S3150800263810D0B0F10C2F14D0A3F58063984206D0B9
+S31508002648FFF76CFFFFF724FFFFF73AFF97E7FFF757
+S3150800265865FF94E71C4B186810F002008FD01C48D9
+S315080026688DE7194B186F10F0020088D04FF4004018
+S3150800267885E7154BD3F89030034043EA0040174BDB
+S3150800268898420FD0B0F1301F14D0103B984206D0AC
+S31508002698FFF744FFFFF7FCFEFFF706FF6FE7FFF7B4
+S315080026A83DFF6CE7084B186810F002003FF467AF67
+S315080026B8074864E7044B186F10F002003FF45FAF51
+S315080026C84FF400405BE700BF0038024002000300F1
+S315080026D80024F40008000C000008000C2000300054
+S315080026E808B5C0280AD0B0F5407F2FD0B0F5405FAE
+S315080026F855D0B0F5404F7BD0002008BD524BD3F8D3
+S315080027089030034043EA0040504B98420FD0B0F14E
+S31508002718C01F13D0403B984206D0FFF7FFFEFFF7CD
+S31508002728B7FEFFF7C1FEE8E7FFF7F8FEE5E7464B11
+S31508002738186810F00200E0D04548DEE7424B186FEB
+S3150800274810F00200D9D04FF40040D6E73E4BD3F834
+S315080027589030034043EA00403E4B984210D0B0F10F
+S31508002768032F14D0A3F58073984206D0FFF7D6FE38
+S31508002778FFF78EFEFFF798FEBFE7FFF7CFFEBCE729
+S31508002788314B186810F00200B7D03148B5E72E4B20
+S31508002798186F10F00200B0D04FF40040ADE72A4B8E
+S315080027A8D3F89030034043EA00402B4B984210D0A8
+S315080027B8B0F1302F14D0A3F58053984206D0FFF70E
+S315080027C8ADFEFFF765FEFFF76FFE96E7FFF7A6FE75
+S315080027D893E71D4B186810F002008ED01C488CE74A
+S315080027E8194B186F10F0020087D04FF4004084E7A1
+S315080027F8154BD3F89030034043EA0040174B9842EC
+S3150800280810D0B0F1C02F15D0A3F58043984206D052
+S31508002818FFF784FEFFF73CFEFFF746FE6DE7FFF776
+S315080028287DFE6AE7084B186810F002003FF465AFAA
+S31508002838074862E7044B186F10F002003FF45DAFD3
+S315080028484FF4004059E700BF003802408000C00036
+S315080028580024F4000002000300200030008000C0B5
+S3150800286838B5036813F0010F75D104460D46036899
+S315080028783B4A1A404B68C9680B4329690B43A9693F
+S315080028880B4313430360AB68426822F44052134370
+S3150800289843606B69826822F4407213438360314B44
+S315080028A8984216D0304B98421CD0304B98421DD0CF
+S315080028B82F4B98421ED02F4B98421FD02E4B98422A
+S315080028C821D02E4B984223D02D4B984225D0012053
+S315080028D842E00320FFF748FE00283ED02B680BBBD2
+S315080028E8012039E00C20FFF73FFEF5E73020FFF717
+S315080028F83BFEF1E7C020FFF7F3FEEDE74FF4407023
+S31508002908FFF7EEFEE8E74FF44060FFF72DFEE3E732
+S315080029184FF44050FFF7E4FEDEE74FF44040FFF778
+S31508002928DFFED9E7AA69B2F5004F07D000EB5300D6
+S31508002938B0FBF3F39BB2E36000200DE05A0802EB04
+S315080029484000B0FBF3F34FF6F0721A40C3F34203A4
+S315080029581343E360F0E7012038BD0120FCE700BF18
+S31508002968F369FFEF001001400044004000480040AA
+S31508002978004C004000500040001401400078004018
+S31508002988007C0040002301330C4A934211D802699F
+S31508002998002AF8DA036943F00103036100230133C7
+S315080029A8064A934207D8026912F0010FF7D10020A8
+S315080029B87047032070470320704700BF400D030087
+S315080029C884B010B5044603A880E80E00089B012BBE
+S315080029D81DD1A36B23F48033A363E268164B134017
+S315080029E8E360E36823F44013E3600F9B012B09D0E7
+S315080029F82046FFF7C7FF069B012B14D0BDE81040F9
+S31508002A0804B07047E36843F48013E360F0E7E368CB
+S31508002A1843F04003E3602046FFF7B4FFA36B43F493
+S31508002A288033A363E7E7A36843F00603A360A368B4
+S31508002A3843F02003A360E1E7BFFFBDFF022A0AD0DF
+S31508002A480921C26822F47052C260C36843EA812326
+S31508002A58C36000207047204B0B44204A934229D96B
+S31508002A681F4B0B441F4A934226D91F4B0B441F4A38
+S31508002A78934223D91E4B0B441E4A934220D31E4B1E
+S31508002A880B441E4A93421DD91D4B0B441D4A9342BB
+S31508002A981AD31D4B0B441D4A934217D31C4B0B44A0
+S31508002AA81C4A934214D31C4B0B441C4A934211D21A
+S31508002AB80721C6E70F21C4E70E21C2E70D21C0E7A3
+S31508002AC80C21BEE70B21BCE70A21BAE70921B8E7BA
+S31508002AD80821B6E70621B4E7405327FFFF340C0060
+S31508002AE8401E1BFF3F420F0000DC0BFF7F4F120002
+S31508002AF8808CF9FE20D6130060B6E5FE5FE3160063
+S31508002B0800D3CEFE40771B00C05BB3FEC091210000
+S31508002B1800CA91FE20753800E05459FEE09C410031
+S31508002B28836843F00103836000207047836823F0B5
+S31508002B38010383600020704708B5C36823F0C043C3
+S31508002B48C360012909D069B9C36843F08043C360E3
+S31508002B583220FDF769FE002008BDC36843F000531C
+S31508002B68C360F5E70120F7E7890141F02001016113
+S31508002B7800230133054A934205D8026912F0200F4B
+S31508002B88F7D1002070470320704700BF400D0300A7
+S31508002B981023036100230133054A934205D80269C5
+S31508002BA812F0100FF7D1002070470320704700BFB6
+S31508002BB8400D0300D0F800381943C0F80018002063
+S31508002BC87047000084B02DE9F041044607A880E85C
+S31508002BD80E00002306E003F1400204EB82020021FE
+S31508002BE8516001330E2BF6D9119F37BBD4F8043838
+S31508002BF843F00203C4F80438A36B23F40013A36351
+S31508002C08236843F040032360236843F08003236066
+S31508002C180023C4F8003E04F50065D4F80038C4F863
+S31508002C2800380C9B012B0DD0032B1CD1099BABB983
+S31508002C3800212046FFF7BEFF19E0A36B43F40013F3
+S31508002C48A363E5E7099B23B900212046FFF7B2FFEE
+S31508002C580DE001212046FFF7ADFF08E001212046D7
+S31508002C68FFF7A8FF03E003212046FFF7A3FF10217B
+S31508002C782046FFF779FF804608B14FF0010820463D
+S31508002C88FFF786FF08B14FF0010800232B616B6137
+S31508002C98EB610AE0C3B94FF00060C2F800090022E8
+S31508002CA80A614FF67F328A6001330799994210D92B
+S31508002CB804EB431202F51061D2F800090028E9DB93
+S31508002CC80020C2F80009EAE74FF09040C2F8000968
+S31508002CD8E5E700230AE0C3B14FF0904CC2F800CBF1
+S31508002CE8002202614FF67F3282600133994211D978
+S31508002CF804EB431202F53060D2F8006B002EEADBCB
+S31508002D084FF0000CC2F800CBEAE74FF0006CC2F8A7
+S31508002D1800CBE5E72B6923F480732B610023A361B5
+S31508002D286FF0804363610A9B1BB9A36943F01003DC
+S31508002D38A361A2690A4B1343A3610D9B1BB1A3693F
+S31508002D4843F00803A361012F04D04046BDE8F041CB
+S31508002D5804B07047A269034B1343A361F5E700BFA4
+S31508002D6800383C8004000040D0F8083813F0060301
+S31508002D7805D0062B18BF022B03D102207047002066
+S31508002D8870470F207047000010B591F800C04B78BF
+S31508002D98012B21D000F5006ED0F81C380CF00F0472
+S31508002DA80122A24043EA0243C0F81C3800EB4C1043
+S31508002DB8D0F8003B13F4004F0CD1D0F8002B8B68E1
+S31508002DC8C3F30A03C97843EA81431343144A1A43E7
+S31508002DD8C0F8002B002010BDD0F81C280CF00F0EE8
+S31508002DE803FA0EF39BB21343C0F81C3800EB4C10D9
+S31508002DF8D0F8003913F4004FECD1D0F800298B68C5
+S31508002E08C3F30A03C97843EA814343EA8C5C42EA76
+S31508002E180C0C034B4CEA0303C0F80039DAE700BF89
+S31508002E280080001030B40B784A78012A26D000EBC7
+S31508002E384313D3F8002B002A52DBD0F83C480A780B
+S31508002E4802F00F024FF0010C0CFA02F224EA0242D1
+S31508002E58C0F83C28D0F81C28097801F00F010CFAAC
+S31508002E6801FC22EA0C42C0F81C28D3F8001B234AA6
+S31508002E780A40C3F8002B002030BC704700EB431308
+S31508002E88D3F80029002A1EDBD0F83C580A7802F045
+S31508002E980F02012404FA02F292B225EA0202C0F8E5
+S31508002EA83C28D0F81C28097801F00F018C40A4B2F8
+S31508002EB822EA0404C0F81C48D3F80019104A0A4044
+S31508002EC8C3F80029D7E7D3F8002942F00062C3F807
+S31508002ED80029D3F8002942F08042C3F80029D3E72D
+S31508002EE8D3F8002B42F00062C3F8002BD3F8002B66
+S31508002EF842F08042C3F8002B9FE700BF0078F3EF43
+S31508002F08007833EC70B40B784C78012C25D000EB9C
+S31508002F18431000F530631D693F4C2C401C611D6940
+S31508002F283E4C2C401C614C690CB18C684C611C6980
+S31508002F3844F400241C611C698D68C5F3120C44EA24
+S31508002F480C041C61012A62D0D0F8003B43F0044304
+S31508002F58C0F8003B002070BC70474C695CBB00EBAE
+S31508002F684314D4F810692D4D3540C4F81059D4F8CF
+S31508002F78105945F40025C4F81059D4F81069264D97
+S31508002F883540C4F81059012A32D000EB4313D3F858
+S31508002F98002942F00442C3F800294B69002BD9D00E
+S31508002FA8D0F834380A7802F00F0101228A40134310
+S31508002FB8C0F83438CEE700EB431404F510642669E4
+S31508002FC8154D354025612669144D354025618D68AE
+S31508002FD84E69AE4200D94D61256945F4002525613B
+S31508002FE825694E69C6F3120C45EA0C052561CAE738
+S31508002FF80A691AB100EB4311C1F8142900EB43100A
+S31508003008D0F8002942F00442C0F80029A2E7CA68A5
+S31508003018002A99D05A6197E70000F8FFFFFF07E0F2
+S3150800302810B59DF8084084B903334FEA930E4FF05C
+S31508003038000C08E000EB023303F5805351F8044B03
+S315080030481C600CF1010CF445F4D3002010BD0000F7
+S31508003058F0B583B00B784C78012C31D000EB4313CC
+S3150800306803F5306CDCF81050834C2C40CCF8104033
+S31508003078DCF81050814C2C40CCF810404C69002CD8
+S3150800308840F0C680DCF810408D68C5F312052C435D
+S31508003098CCF81040DCF8104044F40024CCF8104072
+S315080030A8012A00F0CF80CA78012A00F0D280D3F826
+S315080030B8002B42F00442C3F8002B002003B0F0BDF1
+S315080030C84C6974BB00EB4314D4F810696B4D354052
+S315080030D8C4F81059D4F8105945F40025C4F81059FD
+S315080030E8D4F81069644D3540C4F81059012A4DD0F2
+S315080030F800EB4313D3F8004944F00444C3F80049E5
+S31508003108CC78012C6BD04B69002BD6D0D0F8343844
+S315080031180A7802F00F0101228A401343C0F83438AE
+S31508003128CBE700EB4314D4F81069534D3540C4F87F
+S315080031381059D4F81069514D3540C4F81059D4F8C7
+S3150800314810598E684F6907EB060C0CF1FF3CBCFB5F
+S31508003158F6FC4B4E06EACC4C45EA0C05C4F8105961
+S31508003168D4F810594E69C6F312063543C4F81059EF
+S3150800317804F51064CD78012DB8D1256925F0C04528
+S315080031882561256945F000552561AFE70A691AB131
+S3150800319800EB4314C4F81429CA78012A08D000EBAE
+S315080031A84313D3F8002942F00442C3F8002984E7F8
+S315080031B8D0F8082812F4807F08D100EB4311D1F81B
+S315080031C8002942F00052C1F80029E8E700EB43114C
+S315080031D8D1F8002942F08052C1F80029DFE7D0F873
+S315080031E8084814F4807F0CD1D3F8004944F00054F9
+S315080031F8C3F8004900928B8A0A78C968FFF710FF56
+S315080032085BE7D3F8004944F08054C3F80049F1E76E
+S315080032188D682C44013CB4FBF5F4DCF810501FFA11
+S3150800322884FE174E06EAC4442543CCF81050DCF849
+S3150800323810508C680EFB04F4C4F312042C43CCF823
+S3150800324810402DE7CA68002A3FF42DAFCCF81420A1
+S3150800325829E7D0F8082812F4807F06D1D3F8002B7E
+S3150800326842F00052C3F8002B21E7D3F8002B42F0AE
+S315080032788052C3F8002B1AE70000F8FFFFFF07E0A3
+S315080032880000F81F84460846D11C8908002305E073
+S315080032980CF58052126840F8042B01338B42F7D399
+S315080032A870470B784A78012A14D000EB4310D0F8F7
+S315080032B8002B002A06DB2BB1D0F8003B23F080430D
+S315080032C8C0F8003BD0F8003B43F40013C0F8003BB5
+S315080032D80020704700EB4310D0F80029002A06DBC7
+S315080032E82BB1D0F8003923F08043C0F80039D0F85C
+S315080032F8003943F40013C0F80039E9E70B784A782F
+S31508003308012A0ED000EB4310D0F8003B23F4001333
+S31508003318C0F8003BCB78023BDBB2012B15D900205D
+S31508003328704700EB4310D0F8003923F40013C0F8AF
+S315080033380039CB78023BDBB2012BF0D8D0F800393C
+S3150800334843F08053C0F80039E9E7D0F8003B43F06A
+S315080033588053C0F8003BE2E710B50446002208E0AF
+S3150800336804EB42134FF67F31C3F80819C3F8081B54
+S3150800337801320E2AF4D90022C4F81028C4F81428F1
+S31508003388C4F81C282046FFF703FC00B110BD10211D
+S315080033982046FFF7E9FBF9E7D0F8003823F4FE637F
+S315080033A8C0F80038D0F80038090101F4FE6119435D
+S315080033B8C0F800180020704708B5D0F8043823F07C
+S315080033C80203C0F804380320FDF72EFA002008BDCA
+S315080033D808B5D0F8043843F00203C0F804380320C7
+S315080033E8FDF722FA002008BD426980691040704737
+S315080033F8D0F8183800F50060C0691840000C704706
+S31508003408D0F8183800F50060C069184080B27047CF
+S3150800341800EB4111D1F8082B00F50060406910400F
+S31508003428704710B4D0F81048D0F8343801F00F02B5
+S31508003438D340DB01DBB2234300EB411000F51060F3
+S31508003448806818405DF8044B7047406900F0010031
+S3150800345870470000D0F80029054B1340C0F800391A
+S31508003468D0F8043843F48073C0F80438002070474D
+S3150800347800F8FFFF10B4046C154B9C4203D9D0F82A
+S31508003488003B002B16DB0024C0F8104BD0F8104B75
+S3150800349844F40024C0F8104BD0F8104B44F0180434
+S315080034A8C0F8104BD0F8104B44F0C044C0F8104B85
+S315080034B8012903D000205DF8044B7047C0F8142B87
+S315080034C8D0F8003B43F08023C0F8003BF2E700BF82
+S315080034D80A30544F014B1860704700BF000000209F
+S315080034E8C0B108B50346D0F8B80210B10020C3F831
+S315080034F8B802D3F8CC0210B10020C3F8CC0209B13F
+S31508003508C3F8B412012183F89C121A70184601F000
+S31508003518FFFF08BD0320704710B50446012380F84D
+S315080035289C32D0F8B83213B15B6801799847D4F859
+S31508003538CC3213B10023C4F8CC32204602F059F82D
+S3150800354800B110BD204602F044F8FAE710B582B07B
+S315080035580023ADF8063059B10446C0F8B812CB6A4C
+S315080035680DF106009847C4F8CC02002002B010BD39
+S315080035780320FBE708B502F034F808BD08B5D0F80B
+S31508003588B83213B11B68984708BD0320FCE708B58D
+S31508003598D0F8B8320BB15B689847002008BD38B533
+S315080035A8044600F2AA25284600F02EF90123C4F895
+S315080035B89432B4F8B032C4F8983294F8AA1201F0E2
+S315080035C81F03012B0DD0022B10D02BB101F080015F
+S315080035D8204602F029F803E02946204600F0E0FADA
+S315080035E838BD2946204600F013FBF9E72946204648
+S315080035F800F042FBF4E738B504460D4631BB1346DE
+S31508003608D0F89422032A01D0084638BDD0F85C11B0
+S31508003618D0F8602191420CD8D0F8B8321B691BB192
+S3150800362890F89C22032A0FD0204600F054FC28461E
+S31508003638EBE7891AC0F85C118A4228BF0A46194678
+S3150800364800F041FC2846E0E79847EDE7D0F8B8329D
+S315080036589B692BB190F89C22032A03D19847D4E793
+S315080036680320D2E70320D0E738B504460D460029DB
+S3150800367848D11346D0F89422022A05D094F8A032E5
+S31508003688012B3AD0284638BDC269016A8A4211D840
+S315080036988A421BD0D4F8B832DB681BB194F89C224E
+S315080036A8032A27D08021204601F0BEFF204600F0D5
+S315080036B81DFCE3E7521AC261194600F0FCFB002319
+S315080036C81A461946204601F0CFFFD7E7836999427B
+S315080036D8E0D8D0F898229342DCD20022114600F0AE
+S315080036E8EAFB0021C4F898120B460A46204601F060
+S315080036F8BBFFC3E720469847D4E7002384F8A032DF
+S315080037082846C0E7D0F8B8325B692BB190F89C22F6
+S31508003718032A03D19847B6E70320B4E70320B2E79C
+S3150800372870B50446012380F89C320023C0F8943209
+S315080037384360C0F8A432D0F8BC3223B1D0F8B83206
+S315080037485B6800219847402300221146204601F06D
+S3150800375858FF0126A4F864614025C4F860512B4631
+S3150800376800228021204601F04CFFA684256200200D
+S3150800377870BD01740020704790F89C3280F89D321D
+S31508003788042380F89C320020704790F89C32042B5A
+S3150800379801D00020704790F89D3280F89C32F8E7EF
+S315080037A808B590F89C32032B01D0002008BDD0F844
+S315080037B8B832DB69002BF8D09847F6E7002070473F
+S315080037C8002070470020704708B5012380F89C320E
+S315080037D8D0F8B83213B15B6801799847002008BD5C
+S315080037E80346002002E00130C0B201331A78002AE5
+S315080037F8F9D1704708B54B88012B00D008BDC0F829
+S31508003808A43200F068FBF9E70B7803704B7843702D
+S315080038188B78CA7843EA022343800B794A7943EAC4
+S31508003828022383808B79CA7943EA0223C3807047C7
+S3150800383810B50446802101F0F7FE0021204601F064
+S31508003848F3FE10BD30B583B004460D460023ADF827
+S3150800385806304A88130A013B0E2B00F2BC80DFE8C3
+S3150800386803F0153044BABA9EABBABABABABABABAF3
+S315080038780800D0F8B432DB6923B10DF10601007CE3
+S3150800388898470AE02946FFF7D3FF18E0D0F8B4327C
+S315080038981B680DF10601007C9847EA88002A00F0A3
+S315080038A8A380BDF80630002B00F099809A4228BFFD
+S315080038B81A46ADF806200146204600F0EFFA03B08E
+S315080038C830BD037C43B9D0F8B8329B6A0DF10600BF
+S315080038D8984702234370E0E7D0F8B832DB6A0DF15F
+S315080038E80600984702234370D7E7D2B2052A52D86A
+S315080038F8DFE802F003101D2A3744D0F8B4325B68B3
+S3150800390823B10DF10601007C9847C6E72946FFF75B
+S315080039188FFFD4E7D0F8B4329B6823B10DF10601BE
+S31508003928007C9847B9E72946FFF782FFC7E7D0F82A
+S31508003938B432DB6823B10DF10601007C9847ACE781
+S315080039482946FFF775FFBAE7D0F8B4321B6923B1E1
+S315080039580DF10601007C98479FE72946FFF768FF9F
+S31508003968ADE7D0F8B4325B6923B10DF10601007CE6
+S31508003978984792E72946FFF75BFFA0E7D0F8B432E5
+S315080039889B6923B10DF10601007C984785E729460E
+S31508003998FFF74EFF93E72946FFF74AFF8FE7037CB1
+S315080039A833B9D0F8B8325B6B0DF10600984774E75F
+S315080039B82946FFF73DFF82E7037C43B9D0F8B832BA
+S315080039C81B6B0DF1060098470723437065E72946E0
+S315080039D8FFF72EFF73E72946FFF72AFF6FE7294601
+S315080039E82046FFF725FF6AE7204600F074FA66E7DF
+S315080039F838B504468B88F3B9CB88E3B94B887F2B4F
+S31508003A0819D803F07F0590F89C32032B0CD080F860
+S31508003A189E52294601F018FE204600F05CFA35B198
+S31508003A28022384F89C3209E0FFF702FF06E0012327
+S31508003A3884F89C3202E02046FFF7FAFE38BD0000FB
+S31508003A4870B504460E468D782D4B1D70012D0FD87E
+S31508003A5890F89C32022B0FD0032B23D0FFF7E8FEF1
+S31508003A68274B19782046FFF792FD0325284670BD8F
+S31508003A78FFF7DEFE0325F9E78DB145602946FFF70E
+S31508003A887DFD054620B131462046FFF7D1FEEDE714
+S31508003A98204600F020FA032384F89C32E6E700F073
+S31508003AA81AFAE3E7CDB141688D4225D0C9B2FFF7C6
+S31508003AB86EFD134B197861602046FFF75FFD0546D2
+S31508003AC8B0B131462046FFF7B3FE21792046FFF705
+S31508003AD85EFD022384F89C32C8E7022380F89C32EC
+S31508003AE845602946FFF753FD204600F0F4F9BDE77F
+S31508003AF8204600F0F0F9B9E700F0EDF90025B5E73A
+S31508003B08D405002008B5CB88012B0AD190F89C3239
+S31508003B18022B09D9032B09D10122011D00F0BEF990
+S31508003B2801E0FFF785FE08BD5BB213B9FFF780FE13
+S31508003B38F9E70146002341F8083F012200F0AEF9EB
+S31508003B48F1E708B590F89C32013B022B12D8CB88CE
+S31508003B58022B0CD10123C360D0F8A4320BB103237E
+S31508003B68C360022200F10C0100F098F908BDFFF7BE
+S31508003B785FFEFBE7FFF75CFEF8E708B590F89C32AE
+S31508003B88013B022B09D84B88012B00D008BD00231E
+S31508003B98C0F8A43200F09FF9F8E7FFF749FEF5E701
+S31508003BA838B50C7804F06004202C06D0402C04D0D4
+S31508003BB854B1FFF73DFE002404E0D0F8B8329B68FC
+S31508003BC898470446204638BD4D78092D1DD8DFE8A4
+S31508003BD805F012191C161C08051C0F0BFFF732FEF8
+S31508003BE8F0E7FFF705FFEDE7FFF72AFF0446E9E7E1
+S31508003BF8FFF788FFE6E7FFF7A4FF2C46E2E7FFF79B
+S31508003C08F9FDDFE7FFF7B9FFDCE7FFF711FED9E7AC
+S31508003C1870B505460C460B7803F06003202B07D0D1
+S31508003C28402B05D023B1FFF703FE0026304670BDAA
+S31508003C3895F89C32013B022B18D82379012B0FD80B
+S31508003C48D5F8B8329B682146284698470646E38839
+S31508003C58002BEBD10028E9D1284600F03CF9E5E726
+S31508003C6821462846FFF7E4FD0026DFE721462846D1
+S31508003C78FFF7DEFD0026D9E7F8B506460D468B8818
+S31508003C880C7804F06004202C08D0D9B2402C05D052
+S31508003C986CB12946FFF7CCFD002406E0D6F8B83201
+S31508003CA89B6829463046984704462046F8BD6F78EB
+S31508003CB8012F2FD0032F05D0002F57D02946FFF7FD
+S31508003CC8B7FDF2E790F89C32022B05D0032B12D0E9
+S31508003CD82946FFF7ADFDE8E7002918BF802906D071
+S31508003CE801F0A2FC8021304601F09EFCDDE729465A
+S31508003CF8FFF79EFDD9E76B882BB9002918BF8029DD
+S31508003D0801D0EB881BB1304600F0E5F8CDE701F0A5
+S31508003D188BFCF8E790F89C32022B05D0032B12D0BF
+S31508003D282946FFF785FDC0E7002918BF802906D070
+S31508003D3801F07AFC8021304601F076FCB5E7294681
+S31508003D48FFF776FDB1E76B88002BAED111F07F0F30
+S31508003D5809D1304600F0BFF8D6F8B8329B6829462C
+S31508003D6830469847A1E701F067FCF2E790F89C22ED
+S31508003D78022A06D0032A2AD02946FFF759FD3C46C7
+S31508003D8893E7002918BF802913D113F0800F15D19E
+S31508003D9801F07F0101EB8101890001F5A871014451
+S31508003DA8043100230B600222304600F077F83C46BF
+S31508003DB87BE72946FFF73CFD3C4676E701F07F019D
+S31508003DC801EB81018900103101440431E9E75BB24E
+S31508003DD8002B20DB01F00F0202EB820200EB8202C5
+S31508003DE8B2F864212AB3002B28DB01F07F0303EB22
+S31508003DF883039C0004F5A87434440434802918BF46
+S31508003E08002924D10023236002222146304600F0E7
+S31508003E1845F83C4649E701F00F0202EB820200EB3F
+S31508003E288202928C002ADED12946FFF701FD3C461C
+S31508003E383BE72946FFF7FCFC3C4636E701F07F03DB
+S31508003E4803EB83039C00103434440434D6E7304625
+S31508003E5801F098FB10B101232360D5E700232360FE
+S31508003E68D2E7D0B170B50D4616460446FFF7B8FC3A
+S31508003E78431C5B009BB233802B7003236B700223B1
+S31508003E8807E0EA5401345A1CD2B20021A954023375
+S31508003E98DBB22278002AF4D170BD704708B51346FC
+S31508003EA80222C0F894228361C3610A46002101F000
+S31508003EB8D3FB002008BD08B513460A46002101F0C1
+S31508003EC8CBFB002008BD08B513460A46002101F0B9
+S31508003ED8CBFB002008BD08B50423C0F8943200239C
+S31508003EE81A46194601F0B8FB002008BD08B505238F
+S31508003EF8C0F8943200231A46194601F0B5FB00208B
+S31508003F0808BD72B6704762B6704700002DE9F041E1
+S31508003F1884B004460D46174698466846FEF714FBCD
+S31508003F280299174BA3FB01318909002301E00133E4
+S31508003F38DBB2112B1FD8134A12F8130002EB4302FF
+S31508003F48527800EB020C0CFB044CB1FBFCFE0CFB94
+S31508003F581E16002EEBD11FFA8EFCA5F800C00CF130
+S31508003F68FF3C1FFA8CFCBCF5806FE0D2387088F8E5
+S31508003F780020012000E0002004B0BDE8F08100BF61
+S31508003F88D34D62104857000870B58CB00023ADF8B9
+S31508003F982E308DF82D308DF82C300BAB0DF12D0207
+S31508003FA80DF12E014FF4FA70FFF7B0FF002835D04F
+S31508003FB81D4C1E4B2360002525766576A5760126B9
+S31508003FC8E67625776577A560E5609DF82D30013B8F
+S31508003FD81B0423619DF82C30013B1B056361BDF862
+S31508003FE82E3063602046FCF733FC0695079508963D
+S31508003FF84CF6E043019302954FF6E07303930423C6
+S315080040080493059509960E230A9301A92046FCF7F9
+S31508004018C5FC2046FCF75EFD0CB070BDB52104480A
+S3150800402800F07CFDC4E700BFD80500200064004006
+S31508004038F856000810B588B0024640F2E1730293B4
+S31508004048002304930593069101AB02A90B48FCF7D4
+S315080040586FFD08B108B010BD00F064FB00F132042A
+S3150800406801990648FCF7E2FD0028F3D000F05EFE49
+S3150800407800F058FBA042F3D9ECE700BFD8050020AA
+S3150800408810B588B003460C4601AA00210848FCF773
+S31508004098E0FD50B9019A40F267639A4206D1039B3C
+S315080040A823B9059B2370012000E0002008B010BD45
+S315080040B8D805002008B5FFF724FF08BD10B500F09D
+S315080040C845FA00B910BDFCF7A3F80028FAD000F0A5
+S315080040D8D9FDFCF755FB00F0FDFA00F03BFA054B55
+S315080040E80340054A936000F035FA4468FFF70BFF6A
+S315080040F8A047E7E780FFFF1F00ED00E070B50D4613
+S31508004108044606E015F8013B04F8013B00F00EFEEC
+S315080041183246531E9EB2002AF4D170BD012070475C
+S3150800412838B50546002401E00134E4B2062C17D850
+S3150800413800F0FCFD04EB44030A4A52F82330AB426C
+S31508004148F2D804EB4402074901EB82025268134489
+S31508004158AB42E9D904EB440001EB8000007A00E0A1
+S31508004168FF2038BDC057000808B5C1F3080353B97E
+S3150800417803688B4209D040F8041B4FF40072FFF716
+S31508004188BDFF012008BD0020FCE70120FAE72DE95C
+S31508004198F0410746FFF7C2FF804610B94046BDE81A
+S315080041A8F081FCF7E3FE00247F2C15D83E6806EB61
+S315080041B8840807EB84035D6800F0B8FD2A460023E7
+S315080041C841460220FCF726FF804640B956F82430B7
+S315080041D8AB4206D10134E7E74FF0010801E04FF09A
+S315080041E80008FCF7DBFED9E738B50D460C4B9842B4
+S315080041F811D004460B4B994207D1094C294620464B
+S31508004208FFF7B2FF48B1204638BDFFF7C0FF0028C0
+S31508004218F4D10024F7E7044CF0E70024F3E700BFDD
+S315080042280408002000800008000600202DE9F04157
+S3150800423806460C4617461D46DFF8708001EA080848
+S315080042480368B3F1FF3F07D0336843450AD131689D
+S31508004258641A3444043414E04146FFF785FF0028FD
+S31508004268F2D11FE041463046FFF7BEFF0646002852
+S31508004278EDD1002016E017F8013B04F8013B013D93
+S315080042880FD000F053FD311D611AB1F5007FF2D346
+S3150800429808F500713046FFF7A7FF064620B1041D4A
+S315080042A8E9E70120BDE8F0810020FBE700FEFFFFF3
+S315080042B80023062B36D870B51C4603EB43021A4969
+S315080042C801EB8202127A824205D00133DBB2062B51
+S315080042D8F2D9002070BD04EB440251F8225001EBD4
+S315080042E88204666815F0030F02D116F0030F04D08E
+S315080042F840F2C3210D4800F011FC002405E02B68A4
+S31508004308B3F1FF3F0CD104350134B4EB960F05D24F
+S3150800431814F0FF0FF3D100F009FDF0E70120D9E703
+S315080043280020D7E700207047C05700086C570008D8
+S31508004338F0B587B004460E4600230193884205D88F
+S3150800434801252CB1072E04D9002502E00025F8E737
+S315080043580025FFF7E3FE10B1012D02D0284607B065
+S31508004368F0BD002302930223059301230493FCF767
+S31508004378FDFD01E00134E4B2B4420FD82046FFF748
+S3150800438897FF07460028F5D100F0D0FC039401A949
+S3150800439802A8FCF7BDFE0028ECD03D46FCF7FEFD5A
+S315080043A82846DCE74FF0FF33024A1360024A1360D7
+S315080043B8704700BF000600200408002070B50D46A7
+S315080043C80139134B1B1A994201D9002070BD0446BE
+S315080043D81646FFF7A5FEFF2811D028190138FFF75A
+S315080043E89FFEFF280BD00B4B23400B4A934208D05D
+S315080043F82B46324621460948FFF718FFE6E700200C
+S31508004408E4E72B46324621460548FFF70FFFDDE766
+S31508004418FFFF0F0800FEFFFF0080000800060020C7
+S31508004428040800204A1E0D4B1B1A9A4201D900207F
+S31508004438704770B505460C46FFF772FE06462C44CB
+S31508004448601EFFF76DFEFF2818BFFF2E01D100205A
+S3150800445870BD01463046FFF76BFFF9E7FFFF0F0807
+S3150800446800B583B000230193134B1B68B3F1FF3FD4
+S3150800447820D0114A5368019391680B440193D16877
+S315080044880B44019311690B44019351690B44019339
+S3150800449891690B440193D26913440193DB43019351
+S315080044A80133019301AA04210448FFF787FF03B0E3
+S315080044B85DF804FB0120FAE704080020C881000813
+S315080044C80A4B1A68596811449A681144DA681144FB
+S315080044D81A6911445A6911449A690A44D3F8C831C1
+S315080044E8D34201D000207047012070470080000899
+S315080044F808B50C4B1B68B3F1FF3F06D10A4B1B687E
+S31508004508B3F1FF3F07D1012008BD0648FFF73FFE74
+S315080045180028F3D1F8E70448FFF739FE0028F3D056
+S315080045280120F1E70408002000060020004870472B
+S315080045380080000808B5FFF735FF08BD08B5FFF77E
+S315080045483DFF08BD08B5FFF76DFF08BD08B5FFF7BD
+S31508004558B7FF08BD08B5FFF7E9FF08BD08B5FFF7B7
+S315080045687FFF00B908BDFFF7C3FFFBE7054BDB690B
+S3150800457813F0200F04D0034B5B6A037001207047C1
+S31508004588002070470048004010B5094B986200F0B3
+S31508004598C9F800F10A04064BDB6913F0800F05D148
+S315080045A800F0C4FB00F0BEF8A042F4D910BD00BF65
+S315080045B80048004010B588B00C4C236823F0010366
+S315080045C823604FF4614301930023029303930493F2
+S315080045D80C2205920693079301A92046FEF740F98F
+S315080045E8236843F00103236008B010BD0048004063
+S315080045F870B506460D46812904D82846FFF7C4FF34
+S3150800460800240BE08321074800F088FAF5E700F054
+S315080046188DFB305DFFF7B8FF0134A4B2ABB2A342F5
+S31508004628F5D870BD1458000870B5254B1C78BCB968
+S315080046382448FFF79BFF012801D0204670BD214B6F
+S315080046481B78013BDBB2802BF7D800F06BF81E4BC2
+S3150800465818601E4B00221A70194B01221A70ECE7D3
+S3150800466806460D46194B1B78013316481844FFF7BA
+S315080046787DFF0446012815D1144B1A780132D2B2A7
+S315080046881A70104B1B789A4201D00024D5E71049B6
+S315080046983046FFF733FD0A4B00221A700B4B1B787E
+S315080046A82B70CAE700F03EF8074B1B68C8339842D8
+S315080046B803D90024024B1C70BFE70024BDE700BFDE
+S315080046C88A0A0020080A00208C0A00208B0A002083
+S315080046D8090A00204FF0E02300221A615A619A61FC
+S315080046E87047000008B5FFF7F5FF4FF0E023044AC6
+S315080046F85A6100229A6105211961024B1A6008BDA0
+S31508004708BF4B0300900A00204FF0E0231B6913F4FF
+S31508004718803F03D0024A136801331360704700BF0D
+S31508004728900A002008B5FFF7EFFF014B186808BD87
+S31508004738900A002008B5FFF7F5FF08BD094B03F1F5
+S315080047481801002232B19A7400225A61064B054AAA
+S315080047581A6070479A745961183318310132D2B2FF
+S31508004768F0E700BFD40A0020040B00200A4B1B6898
+S3150800477883B110B4084A5C69146019749860D860E3
+S3150800478800225A741860013908445860987C5DF804
+S31508004798044B7047FF207047040B002038B50446C1
+S315080047A80D46012824D804EB4403164A02EBC30332
+S315080047B85A7C1B7C9A4221D004EB4403114A02EB2B
+S315080047C8C303DA6815705A7C01325A74DA680132FA
+S315080047D8DA605B689A4213D90A4B04EB440253F829
+S315080047E8322004EB440403EBC404E260012008E029
+S315080047F84FF4E071044800F091F9D4E7002000E08E
+S31508004808012038BDD40A00206858000808B50146B2
+S31508004818024B1878FFF7C2FF08BD00BF080B002037
+S3150800482838B504460D46012822D804EB4403144A31
+S3150800483802EBC303587C10B304EB440302EBC3032F
+S315080048489A6812782A705A7C013A5A749A68013218
+S315080048589A605B689A4211D9094B04EB440253F8EB
+S31508004868322004EB440403EBC404A260012006E0EA
+S315080048784FF4F171034800F051F9D6E7012038BD25
+S31508004888D40A00206858000808B50146024B18786B
+S31508004898FFF7C6FF08BD00BF4C0B002010B504463D
+S315080048A8012806D804EB4404054800EBC404607CD8
+S315080048B810BD40F20221034800F030F9F2E700BFC4
+S315080048C8D40A00206858000838B5FFF737FF1A4C8D
+S315080048D84021601CFFF74AFF2070184D4021681CCC
+S315080048E8FFF744FF28702378FF2B1BD0FF2819D021
+S315080048F8134C002213492046FEF7F2FD12492046BA
+S31508004908FEF724FE0120FBF79AFC2046FEF732FE46
+S31508004918D4F8C402FDF726FA00F02CF9B0F5FA6FB8
+S3150800492805D338BD8421094800F0F8F8E0E74FF4C4
+S31508004938FA6000F019F9F4E7080B00204C0B002080
+S31508004948900B002014010020100000206858000869
+S3150800495810B5064CD4F8C402FDF716FA2046FEF739
+S31508004968DBFD0020FBF76BFC10BD00BF900B002099
+S3150800497870B506460D463F2906D82846FFF746FF6E
+S31508004988012806D100240BE0B9210D4800F0C6F825
+S31508004998F3E7BD210A4800F0C1F8F3E70134A4B2E9
+S315080049A8ABB2A3420BD900F0C1F9305DFFF72EFF71
+S315080049B80128F3D0C621024800F0B0F8EEE770BD2A
+S315080049C86858000870B506460D461F4BD3F8C4024A
+S315080049D8FCF76CFF1D4B1C789CB91D48FFF754FF64
+S315080049E8012801D0204670BD194B1B78013BDBB264
+S315080049F83E2BF7D8154B01221A70164B00221A704F
+S31508004A08F0E7144B1B78013311481844FFF73CFFAD
+S31508004A180446012801D00024E4E70E4B1A7801322F
+S31508004A28D2B21A700A4B1B789A4201D00024D9E7E9
+S31508004A3809493046FFF762FB044B00221A70054BFA
+S31508004A481B782B70CEE700BF900B0020A00E002025
+S31508004A58600E0020A10E0020610E002030B583B03C
+S31508004A68144B1878FFF71AFF08B30546402800D9EB
+S31508004A784025002405E09DF807200F4B1A550134F8
+S31508004A88E4B2A5420DD90DF107010A4B1878FFF7CC
+S31508004A98C7FE0128EFD04FF4A371084800F03EF886
+S31508004AA8E9E72B46044A8121054800F0D5FD03B0FD
+S31508004AB830BD00BF080B0020940A0020685800087B
+S31508004AC8900B002070B5044600F0FAFB064621460E
+S31508004AD80F4800F06EFD85B2002401E00134A4B247
+S31508004AE8AC420CD2315D0B4B1878FFF757FE0128FC
+S31508004AF8F4D04FF4B471084800F010F8EEE700F067
+S31508004B08DFFB024640230121014800F0ADFD70BDD8
+S31508004B18900B00204C0B00206858000808B500F0D8
+S31508004B2805F9FCE708B500F0F7F8012803D00B4BA0
+S31508004B381B78012B00D008BDFFF7F4FD084B1B684E
+S31508004B48084A1268134403F5FA739842F3D3034BD9
+S31508004B5800221A70FFF7B2FAEDE700BFA80E002088
+S31508004B68A40E0020AC0E0020014B1860704700BF49
+S31508004B78A40E0020014B1868704700BFA40E002039
+S31508004B8808B5054B1B78012B00D008BDFFF7CAFDF1
+S31508004B98024B1860F9E700BFA80E0020AC0E0020EB
+S31508004BA808B5044B01221A70FFF7EAFFFFF7BAFFA8
+S31508004BB808BD00BFA80E002008B5FFF77BFA00F06D
+S31508004BC8B1F8FFF78FFDFFF7B5FC00F00DF8FFF712
+S31508004BD8E7FF08BD08B500F0A9F8FFF795FD00F04E
+S31508004BE817F8FFF79FFF08BD10B500F04FFAFFF753
+S31508004BF8CBF9064C01232370FFF7DCFC002323704E
+S31508004C08FFF762FE0223237010BD00BF0C000020C8
+S31508004C1800B583B00DF107011848FFF731FA0128E6
+S31508004C2810D00DF107011548FFF7FEFC012812D030
+S31508004C380DF107011148FFF7C5FE012814D003B086
+S31508004C485DF804FB0E4B01221A709DF807100B48F5
+S31508004C5800F03EFAE5E70A4B00221A709DF807109D
+S31508004C68064800F035FAE3E7054B02221A709DF864
+S31508004C780710024800F02CFAE1E700BFB00E002042
+S31508004C880C00002008B5FFF763FE08BD38B50446D2
+S31508004C980D460E4B1B78012B09D00C4B1B7853B1CC
+S31508004CA80A4B1B78022B0BD000F00AFA38BDC9B29A
+S31508004CB8FFF7C0F9F1E7E9B22046FFF799FCEFE7F5
+S31508004CC8E9B22046FFF754FEEEE700BF0C000020C5
+S31508004CD8074B1B78022B07D0032B07D0012B01D0D3
+S31508004CE881207047082070473F207047002070478A
+S31508004CF80C000020074B1B78022B07D0032B07D084
+S31508004D08012B01D081207047082070473F20704743
+S31508004D18002070470C00002008B500F0C9F900B15A
+S31508004D28012008BD08B5FBF781FA08BD08B5FBF7E9
+S31508004D3882FA08BD024B002283F88220704700BF1A
+S31508004D48340F0020034BFE221A7058700222A3F86B
+S31508004D5886207047340F00200378427843EA0223F6
+S31508004D68827843EA0243C07843EA006070470870CD
+S31508004D78C0F307234B70C0F307438B70000EC87047
+S31508004D887047000010B5064C002384F88130FFF7F9
+S31508004D98D1FFFF2323700123A4F8863010BD00BF76
+S31508004DA8340F0020074BFF221A7000225A7093F816
+S31508004DB882109970DA701A715A710622A3F8862039
+S31508004DC8704700BF340F002008B50020FFF7BAFF68
+S31508004DD808BD000010B5094CFF232370084BC4F81A
+S31508004DE8883000236370A370E370211D0720FFF73E
+S31508004DF8BEFF0823A4F8863010BD00BF340F002074
+S31508004E08B858000810B5064CFF2323700430FFF77E
+S31508004E18A3FFC4F888000123A4F8863010BD00BF94
+S31508004E28340F002008B53120FFF78CFF08BD0000B5
+S31508004E3838B5084CFF23237000256570A570FFF761
+S31508004E4847FFE07025716571A5710723A4F88630B8
+S31508004E5838BD00BF340F002038B5FFF76BFF0F4C7D
+S31508004E68012584F88150FF232370002363701022DC
+S31508004E786270A370FFF72CFFE070FFF73BFF207105
+S31508004E88FFF738FFC0F307206071A571E57108239D
+S31508004E98A4F88630FFF74EFB38BD00BF340F002054
+S31508004EA838B50446FFF714FF6278904212D90B4DBD
+S31508004EB8D5F88810681CFFF721F9FF232B7062784C
+S31508004EC8D5F888301344C5F8883063780133A5F8CF
+S31508004ED8863038BD2220FFF735FFFAE7340F002061
+S31508004EE838B50446FFF7F4FE6378984217D9201DAB
+S31508004EF8FFF732FF01460C4DC5F888006278681C32
+S31508004F08FFF7FCF8FF232B706278D5F8883013442E
+S31508004F18C5F8883063780133A5F8863038BD22206D
+S31508004F28FFF710FFFAE700BF340F0020F8B505466B
+S31508004F381746002406E015F8013B1C44E4B2FFF7BF
+S31508004F48F5FE31464E1E0029F5D13C600120F8BD14
+S31508004F5830B583B0002501950B4CFF232370043028
+S31508004F68FFF7FAFE014601AAD4F88800FFF7DEFF24
+S31508004F786070211D0198FFF7FAFEA570E5700823F1
+S31508004F88A4F8863003B030BD340F002038B504467F
+S31508004F980E4BD3F88850FFF79BFE621C411E284625
+S31508004FA8FFF7CCFA70B1094CFF232370FFF790FE80
+S31508004FB80138D4F888300344C4F888300123A4F8A3
+S31508004FC8863038BD3120FFF7BDFEFAE7340F0020DA
+S31508004FD810B50446FFF77CFE01386378984216DD5B
+S31508004FE8134BFF221A700122A3F88620617891B123
+S31508004FF8A21C0F4BD3F88800FFF7A0FA98B161787E
+S315080050080B4AD2F888300B44C2F8883010BD2220E3
+S31508005018FFF798FEFAE7FFF7A1FA0028F6D131203C
+S31508005028FFF790FEF2E73120FFF78CFEEEE700BFA8
+S31508005038340F002010B50B4BD3F888400430FFF71F
+S315080050488BFE01462046FFF77DFA30B1054BFF2255
+S315080050581A700122A3F8862010BD3120FFF772FEC8
+S31508005068FAE700BF340F002008B5FFF727F8034B07
+S31508005078FF221A700122A3F8862008BD340F0020E3
+S3150800508808B589B2FFF702FE08BD0000074B0022E3
+S3150800509883F88120C3F8882083F88420A3F886201B
+S315080050A883F8832083F88220704700BF340F0020D6
+S315080050B8024B93F8810000B101207047340F002095
+S315080050C8024B002283F88420704700BF340F002063
+S315080050D808B50378FF2B24D0354A92F88120012A8F
+S315080050E82BD1C93B352B53D8DFE803F04052524F32
+S315080050F852524C43494652525252525252525252A4
+S315080051085252525252525252525252525252525269
+S31508005118525252525252312B282E52525234523728
+S315080051283A3DFFF799FE224B93F88430012B33D08A
+S315080051381F4BB3F98610002932DC08BDFFF7B0FE0D
+S31508005148F1E7FFF7CDFEEEE7FFF75CFEEBE7FFF7C3
+S31508005158FFFEE8E7FFF73EFEE5E7FFF735FEE2E77D
+S31508005168FFF720FEDFE7FFF70DFEDCE7FFF70EFF88
+S31508005178D9E7FFF72DFFD6E7FFF75AFED3E7FFF77C
+S3150800518859FFD0E7FFF770FFCDE7FFF74BFECAE7F1
+S315080051982020FFF7D7FDC6E71020FFF7D3FDC7E79E
+S315080051A81846012380F88430FFF76AFFC5E700BF71
+S315080051B8340F002020230380004870474800002049
+S315080051C80A230380004870476800002008B590F84D
+S315080051D89C32032B01D0002008BDFFF73FFCFAE7F5
+S315080051E808B5FFF73BFC002008BD08B50846FFF7D9
+S315080051F869FC002008BD000008B50B7813F06003A9
+S315080052080CD0402B11D14B78012B0ED18B88072B4C
+S315080052180BD19E221449FEF741FE06E04B780A2B6D
+S3150800522814D00B2B17D0062B01D0002008BD4B88AD
+S315080052381B0A212B04D00D491722FEF72FFEF4E787
+S31508005248CA88172A28BF17220949F6E701220949F1
+S31508005258FEF724FEE9E78B7813B9064A1360E4E7F4
+S31508005268FEF7E6FAE1E700BF7400002051000020C7
+S315080052785A0000200010002010B50446812100F0CD
+S31508005288CBF90121204600F0C7F9002010BD00001F
+S3150800529810B5044640230222812100F0B2F94023C2
+S315080052A802220121204600F0ACF94023034A0121D5
+S315080052B8204600F0D9F9002010BD00BFC00F002015
+S315080052C800487047C00F002012230B80004870471B
+S315080052D85801002004230B80004870476C01002001
+S315080052E821230B800048704734010020002393428D
+S315080052F81ED200B510E00CF1370C01F813C00001F6
+S315080053084FEA430C0CF1010C4FF0000E01F80CE0C3
+S315080053180133DBB2934209D24FEA107CB0F1204F31
+S31508005328E9D20CF1300C01F813C0E8E75DF804FB84
+S315080053387047000038B50B4BD3F82004D3F824443B
+S31508005348D3F82834C01800D138BD074D0822A91C3F
+S31508005358FFF7CCFF042205F112012046FFF7C6FF26
+S31508005368F2E700BF00F0F01F7001002008B51A2305
+S315080053780B80FFF7DFFF014808BD00BF700100205A
+S3150800538808B50A4628B905490548FEF76AFD0348D7
+S3150800539808BD02490248FEF764FDF8E70410002034
+S315080053A8C058000810B50A46034C21460348FEF7BC
+S315080053B858FD204610BD00BF04100020D458000828
+S315080053C808B50A4628B905490548FEF74AFD0348B7
+S315080053D808BD02490248FEF744FDF8E70410002014
+S315080053E8E458000808B50A4628B905490548FEF7E5
+S315080053F838FD034808BD02490248FEF732FDF8E7BA
+S3150800540804100020EC58000808B500F57171D0F8AA
+S315080054180004FEF7C4F808BD08B5C1EBC10300EBE4
+S315080054288303D3F80822D0F80004FEF7E4F808BD89
+S3150800543808B5C1EBC10300EB83039A6CD0F80004E6
+S31508005448FEF712F908BD08B5D0F80004FEF7A8F962
+S3150800545808BD000010B50446C3684BB1022B01D13C
+S31508005468012106E091210748FFF758FB012100E0D2
+S315080054780021D4F80004FEF77CF9D4F80004FEF7F6
+S315080054884FF910BD0459000810B50446D0F80004B1
+S31508005498FEF772F92268D2F8003E43F00103C2F813
+S315080054A8003E236A23B1044A136943F006031361CD
+S315080054B8FAF7C6FE10BD00BF00ED00E010B50446B9
+S315080054C8FAF7BFFED4F80004FEF75FF910BD08B571
+S315080054D8D0F80004FEF774F908BD08B5D0F800043A
+S315080054E8FEF76CF908BD10B504460120FAF7A7FEC1
+S315080054F8D4F80004FEF766F910BD10B50446002076
+S31508005508FAF79DFED4F80004FEF75EF910BD000010
+S3150800551802780AB10020704710B503461748C0F844
+S315080055280034C3F8C4024FF0A0430360062343605F
+S315080055380222C2600023036182610122C2610362FA
+S315080055484362C3620363FCF72BF880B90B4C8021CE
+S315080055582046FCF7C9FD402200212046FCF79EFD9F
+S31508005568802201212046FCF799FD002010BD40F253
+S3150800557825110348FFF7D2FAE8E700BFB001002073
+S3150800558804590008D0F8C43211F0800F08D101F088
+S315080055987F01C1EBC10103EB810191F8FE01704758
+S315080055A801F07F01C1EBC10103EB810191F83E00CF
+S315080055B8704708B5D0F8C402FCF7B9FC08BD03283B
+S315080055C805D8DFE800F00504020501207047032026
+S315080055D8704708B5D0F8C402FCF7B5F8FFF7EFFF2F
+S315080055E808BD08B5D0F8C402FCF778F8FFF7E7FF56
+S315080055F808BD08B5D0F8C402FCF785F8FFF7DFFF41
+S3150800560808BD08B594461A466346D0F8C402FCF79E
+S31508005618E1FBFFF7D4FF08BD08B5D0F8C402FCF7CC
+S315080056281EFCFFF7CCFF08BD08B5D0F8C402FCF786
+S31508005638B6FCFFF7C4FF08BD08B5D0F8C402FCF7E6
+S31508005648F2FCFFF7BCFF08BD08B5D0F8C402FCF7A2
+S31508005658ADFBFFF7B4FF08BD08B5D0F8C402FCF7E0
+S315080056686FFCFFF7ACFF08BD08B5D0F8C402FCF715
+S315080056782FFCFFF7A4FF08BD70B50D4D0D4C641B34
+S31508005688A4100026A64209D10B4D0C4C00F018F8B8
+S31508005698641BA4100026A64205D170BD55F8043B24
+S315080056A898470136EEE755F8043B98470136F2E77E
+S315080056B82859000828590008285900082C590008AC
+S315080056C8F8B500BFF8BC08BC9E467047F8B500BFD9
+S30D080056D8F8BC08BC9E467047A9
+S315080056E00000000000000000010203040607080984
+S315080056F00000000001020304433A2F576F726B2F14
+S31508005700736F6674776172652F4F70656E424C547D
+S315080057105F57696E5553425F4175746F5F496E7383
+S3150800572074616C6C2F5461726765742F536F757250
+S3150800573063652F41524D434D375F53544D333246BF
+S31508005740372F63616E2E6300050206020603070300
+S315080057500803090309040A040B040C040C050D05C7
+S315080057600E050F050F06100610071008433A2F57A7
+S315080057706F726B2F736F6674776172652F4F7065E2
+S315080057806E424C545F57696E5553425F4175746F4C
+S315080057905F496E7374616C6C2F5461726765742F00
+S315080057A0536F757263652F41524D434D375F53549E
+S315080057B04D333246372F666C6173682E63000000DE
+S315080057C000800008008000000100000000000108B9
+S315080057D00080000002000000008001080080000030
+S315080057E00300000000000208000002000400000098
+S315080057F00000040800000400050000000000080876
+S31508005800000004000600000000000C080000040068
+S3150800581007000000433A2F576F726B2F736F667439
+S31508005820776172652F4F70656E424C545F57696E8B
+S315080058305553425F4175746F5F496E7374616C6C42
+S315080058402F5461726765742F536F757263652F41A4
+S31508005850524D434D375F53544D333246372F72738B
+S315080058603233322E63000000433A2F576F726B2F84
+S31508005870736F6674776172652F4F70656E424C540C
+S315080058805F57696E5553425F4175746F5F496E7312
+S3150800589074616C6C2F5461726765742F536F7572DF
+S315080058A063652F41524D434D375F53544D3332464E
+S315080058B0372F7573622E63004F70656E424C540025
+S315080058C057696E5553422042756C6B20446576695C
+S315080058D0636500004F70656E424C542055736572BF
+S315080058E00000000044656661756C740057696E5562
+S315080058F053422042756C6B20496E7465726661630B
+S31508005900650000002E2E2F5553425F4445564943E5
+S31508005910452F5461726765742F757362645F636F90
+S30D080059206E662E63000000000C
+S30908005928ED01000877
+S3090800592CC901000897
+S315080059300024F4000100000010000000040000002C
+S315080059409952000881520008015200080000000020
+S3150800595000000000E9510008F3510008D55100087D
+S31508005960000000000000000000000000BD51000813
+S3150800597000000000C951000809022000010100C00A
+S31508005980320904000002FF000000070581024000FA
+S31508005990FF070501024000FF0A061001000000404B
+S315080059A0010000000A000000000003069E00140023
+S315080059B0030057494E5553420000000000000000FE
+S315080059C000008000040001002800440065007600FD
+S315080059D069006300650049006E0074006500720086
+S315080059E066006100630065004700550049004400F1
+S315080059F000004E007B0038003000370039003900BF
+S31508005A003900430033002D004500340045003000BE
+S31508005A102D0034003000450041002D0038003100CB
+S31508005A20380038002D0034003800450038003500AD
+S31508005A3032004200350034004600320042007D0044
+S31508005A4000000000D1520008DD520008AD530008DE
+S31508005A508953000875530008C9530008ED53000818
+S31508005A60E9520008050F2100011C100500DF60DD62
+S31508005A70D88945C74C9CD2659D9E648A9F000003C1
+S31508005A80069E00010000000012010102000000400D
+S31508005A90501DAC6000010102030100000403090463
+S31508005AA01A030000000000000000000000000000CB
+S31108005AB0000000000000000000000000DC
+S70508000735B6
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
index 344676bb5..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,10 +69,11 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
-#define USB_SIZ_BOS_DESC 0x0C
+#define USB_SIZ_BOS_DESC 0x21
/* USER CODE BEGIN PRIVATE_DEFINES */
@@ -123,9 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
/**
* @}
@@ -145,7 +147,7 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
, USBD_FS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};
@@ -158,13 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
-#if (USBD_LPM_ENABLED == 1)
- 0x01, /*bcdUSB */ /* changed to USB version 2.01
- in order to support LPM L1 suspend
- resume test of USBCV3.0*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
#else
0x00, /*bcdUSB */
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -174,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -184,27 +185,36 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
/* USB_DeviceDescriptor */
/** BOS descriptor. */
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
#if defined ( __ICCARM__ ) /* IAR Compiler */
#pragma data_alignment=4
#endif /* defined ( __ICCARM__ ) */
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
- 0x5,
- USB_DESC_TYPE_BOS,
- 0xC,
- 0x0,
- 0x1, /* 1 device capability*/
- /* device capability*/
- 0x7,
- USB_DEVICE_CAPABITY_TYPE,
- 0x2,
- 0x2, /* LPM capability bit set*/
- 0x0,
- 0x0,
- 0x0
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
};
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -367,7 +377,7 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
/**
* @brief Return the BOS descriptor
* @param speed : Current device speed
@@ -380,7 +390,7 @@ uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
*length = sizeof(USBD_FS_BOSDesc);
return (uint8_t*)USBD_FS_BOSDesc;
}
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @brief Create the serial number string descriptor
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
index 13647fbd2..79c4ef8cf 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec
index f2744acd5..20d21b234 100755
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec
@@ -1,1413 +1,1367 @@
S01D000062696E2F6F70656E626C745F73746D3332663734362E737265638C
-S31508000000000005203503000885030008850300085D
-S315080000108503000885030008850300080000000022
-S315080000200000000000000000000000008503000832
-S315080000308503000800000000850300086D460008D7
-S315080000408503000885030008850300088503000862
-S315080000508503000885030008850300088503000852
-S315080000608503000885030008850300088503000842
-S315080000708503000885030008850300088503000832
-S315080000808503000885030008850300088503000822
-S315080000908503000885030008850300088503000812
-S315080000A08503000885030008850300088503000802
-S315080000B085030008850300088503000885030008F2
-S315080000C085030008850300088503000885030008E2
-S315080000D085030008850300088503000885030008D2
-S315080000E085030008850300088503000885030008C2
-S315080000F085030008850300088503000885030008B2
-S3150800010085030008850300088503000885030008A1
-S315080001108503000885030008850300088503000891
-S315080001208503000885030008850300088503000881
-S315080001308503000885030008850300088503000871
-S315080001408503000885030008850300088503000861
-S315080001508503000885030008850300088503000851
-S315080001608503000885030008850300088503000841
-S3150800017085030008850300088503000800000000C1
-S315080001808503000885030008850300088503000821
-S315080001908503000885030008850300088503000811
-S315080001A08503000885030008850300088503000801
-S315080001B085030008850300088503000885030008F1
-S30D080001C0850300088503000809
+S3150800000000000520090200085902000859020008E4
+S3150800001059020008590200085902000800000000A9
+S31508000020000000000000000000000000590200085F
+S31508000030590200080000000059020008713B000838
+S315080000405902000859020008590200085902000816
+S315080000505902000859020008590200085902000806
+S3150800006059020008590200085902000859020008F6
+S3150800007059020008590200085902000859020008E6
+S3150800008059020008590200085902000859020008D6
+S3150800009059020008590200085902000859020008C6
+S315080000A059020008590200085902000859020008B6
+S315080000B059020008590200085902000859020008A6
+S315080000C05902000859020008590200085902000896
+S315080000D05902000859020008590200085902000886
+S315080000E05902000859020008590200085902000876
+S315080000F05902000859020008590200085902000866
+S315080001005902000859020008590200085902000855
+S315080001105902000859020008590200085902000845
+S315080001205902000859020008590200085902000835
+S315080001305902000859020008590200085902000825
+S315080001405902000859020008590200085902000815
+S315080001505902000859020008590200085902000805
+S3150800016059020008590200085902000859020008F5
+S315080001705902000859020008590200080000000048
+S3150800018059020008590200085902000859020008D5
+S3150800019059020008590200085902000859020008C5
+S315080001A059020008590200085902000859020008B5
+S315080001B059020008590200085902000859020008A5
+S30D080001C0590200085902000863
S315080001C810B5054C237833B9044B13B10448AFF37B
-S315080001D800800123237010BDEC04002000000000F5
-S315080001E88451000808B5034B1BB103490348AFF30C
-S315080001F8008008BD00000000F004002084510008B3
-S3150800020870B50D4E0D4D761BB61006D00024013478
-S3150800021855F8043B9847A642F9D1094E094D761B6D
-S3150800022804F0ACFFB61006D00024013455F8043B98
-S315080002389847A642F9D170BD085300080853000824
-S315080002481053000808530008024B13B1024800F07F
-S3150800025805B870470000000071020008002301462F
-S315080002681A46184600F01EB838B50A4C0A4D641BDB
-S31508000278A4100AD004F18043013B05EB8305013C31
-S3150800028855F804399847002CF9D1BDE8384004F0E8
-S315080002987BBF00BF1453000810530008704700BFFF
-S315080002A8704700BF2DE9F0411E4C05462068904668
-S315080002B81F460E46FFF7F2FF1B4B1A68D2F848315D
-S315080002C833B35A6820681F2A27DC4DB9911C0132B6
-S315080002D85A6043F82160FFF7E3FF0020BDE8F08184
-S315080002E803EB82010124C1F8888004FA02FED3F8D8
-S315080002F88841022D44EA0E0CC3F888C1C1F8087172
-S31508000308E4D1D3F88C114EEA0104C3F88C41DDE731
-S3150800031802F5A673C2F84831D3E7FFF7C1FF4FF0D5
-S31508000328FF30DBE7280400209C510008DFF834D0AA
-S31508000338002103E00C4B5B58435004310B480C4B27
-S3150800034842189A42F6D30B4A02E0002342F8043BC5
-S31508000358094B9A42F9D300F045FDFFF751FF03F020
-S315080003689FFB704700000520145300080000002072
-S31508000378EC040020EC040020C0140020FEE710B5A9
-S3150800038813460222C0F894228361C3610A460021F3
-S3150800039803F01CFE002010BD08B513460A460021C6
-S315080003A803F014FE002008BD08B513460A460021C6
-S315080003B803F014FE002008BD08B50423C0F89432DB
-S315080003C800231A46194603F001FE002008BD08B5A1
-S315080003D80523C0F8943200231A46194603F0FEFD91
-S315080003E8002008BD002302781AB10133DBB20130B8
-S315080003F8F9E71846704708B54B88012B00D008BDA1
-S31508000408C0F8A432FFF7D8FFF9E70B7803704B78E2
-S3150800041843708B78CA7843EA022343800B794A7972
-S3150800042843EA022383808B79CA7943EA0223C38085
-S31508000438704710B50446802103F0B0FD0021204618
-S3150800044803F0ACFD10BD30B583B004460D46002355
-S31508000458ADF806304A88130A013B062B00F2AB8032
-S31508000468DFE803F0041F33A9A98D9A00D0F8B4323F
-S315080004781B680DF10601007C9847EA88002A00F0F7
-S31508000488A380BDF80630002B00F099809A4228BF51
-S315080004981A46ADF8062001462046FFF770FF03B056
-S315080004A830BD037C43B9D0F8B8329B6A0DF1060013
-S315080004B8984702234370E0E7D0F8B832DB6A0DF1B3
-S315080004C80600984702234370D7E7D2B2052A52D8BE
-S315080004D8DFE802F003101D2A3744D0F8B4325B6807
-S315080004E823B10DF10601007C9847C6E72946FFF7B0
-S315080004F8A0FFD4E7D0F8B4329B6823B10DF1060102
-S31508000508007C9847B9E72946FFF793FFC7E7D0F86D
-S31508000518B432DB6823B10DF10601007C9847ACE7D5
-S315080005282946FFF786FFBAE7D0F8B4321B6923B124
-S315080005380DF10601007C98479FE72946FFF779FFE2
-S31508000548ADE7D0F8B4325B6923B10DF10601007C3A
-S31508000558984792E72946FFF76CFFA0E7D0F8B43228
-S315080005689B6923B10DF10601007C984785E7294662
-S31508000578FFF75FFF93E72946FFF75BFF8FE7037CE3
-S3150800058833B9D0F8B8325B6B0DF10600984774E7B3
-S315080005982946FFF74EFF82E7037C43B9D0F8B832FD
-S315080005A81B6B0DF1060098470723437065E7294634
-S315080005B8FFF73FFF73E72946FFF73BFF6FE7294633
-S315080005C82046FFF736FF6AE72046FFF7F5FE66E797
-S315080005D838B504468B88F3B9CB88E3B94B887F2BA3
-S315080005E819D803F07F0590F89C32032B0CD080F8B5
-S315080005F89E52294603F0E2FC2046FFF7DDFE35B198
-S31508000608022384F89C3209E0FFF713FF06E001236A
-S3150800061884F89C3202E02046FFF70BFF38BD00003D
-S3150800062870B504460D4689782E4B1970012910D8DD
-S3150800063890F89C32022B11D0032B25D02946FFF7B8
-S31508000648F8FE284B1978204600F0A0FA032630460B
-S3150800065870BD2946FFF7EDFE0326F8E781B141602C
-S3150800066800F08BFA064620B129462046FFF7E1FE38
-S31508000678EDE72046FFF7A0FE032384F89C32E6E759
-S31508000688FFF79AFE0026E2E7C9B14368994225D0E2
-S31508000698D9B200F07BFA134B19786160204600F04E
-S315080006A86CFA0646B0B129462046FFF7C2FE2179FC
-S315080006B8204600F06BFA022384F89C32C7E7022327
-S315080006C880F89C32416000F061FA2046FFF774FE14
-S315080006D80026BCE72046FFF76FFEB8E7FFF76CFE73
-S315080006E80026B4E70805002008B5CB88012B0CD1ED
-S315080006F890F89C325AB29AB1022B09D9032B0FD11A
-S315080007080122011DFFF73BFE01E0FFF792FE08BD37
-S315080007180146002341F8083F0122FFF730FEF6E7B5
-S31508000728FFF787FEF3E708B590F89C32013B022BE2
-S3150800073812D8CB88022B0CD10123C360D0F8A43277
-S315080007480BB10323C360022200F10C01FFF717FE61
-S3150800075808BDFFF76EFEFBE7FFF76BFEF8E708B57F
-S3150800076890F89C32013B022B09D84B88012B00D004
-S3150800077808BD0023C0F8A432FFF71EFEF8E7FFF706
-S3150800078858FEF5E708B50B7803F06003202B06D06A
-S31508000798402B04D043B1FFF74CFE002003E0D0F805
-S315080007A8B8329B68984708BD4B78092B21D8DFE8EB
-S315080007B803F0141C201820090520100DFFF743FE26
-S315080007C80020F0E7FFF704FF0020ECE7FFF728FF13
-S315080007D8E9E7FFF789FF0020E5E7FFF7A4FF002010
-S315080007E8E1E7FFF708FE0020DDE7FFF7B8FF00207E
-S315080007F8D9E7FFF71EFE0020D5E770B505460C4673
-S315080008080B7803F06003202B07D0402B05D023B1C3
-S31508000818FFF70FFE0026304670BD95F89C32013B5F
-S31508000828022B18D82379012B0FD8D5F8B8329B682C
-S315080008382146284698470646E388002BEBD1002828
-S31508000848E9D12846FFF7B8FDE5E721462846FFF728
-S31508000858F0FD0026DFE721462846FFF7EAFD0026D1
-S31508000868D9E738B505460C468A880B7803F060033D
-S31508000878202B08D0D1B2402B05D05BB12146FFF713
-S31508000888D8FD002005E0D5F8B8329B6821462846E9
-S31508000898984738BD6378012B3DD058B200286FD0E9
-S315080008A8032B40F0F68095F89C32022B07D0032BD1
-S315080008B81CD021462846FFF7BCFD0020E9E7B1F120
-S315080008C8800318BF0123002908BF002343B128461F
-S315080008D803F064FB8021284603F060FB0020D8E774
-S315080008E821462846FFF7A5FD0020D2E763884BB9BD
-S315080008F8B1F1800318BF0123002908BF00230BB1F3
-S31508000908E38823B12846FFF757FD0020C1E72846A4
-S3150800091803F044FBF6E790F89C32022B06D0032B2B
-S3150800092819D02146FFF785FD0020B2E7B1F180030B
-S3150800093818BF0123002908BF00233BB103F02EFB8B
-S315080009488021284603F02AFB0020A2E72146FFF764
-S3150800095870FD00209DE76388002B40F0A08011F009
-S315080009687F0F0AD12846FFF727FDD5F8B8329B68C6
-S3150800097821462846984700208BE703F017FBF1E73E
-S3150800098895F89C32022B07D0032B31D021462846EE
-S31508000998FFF74FFD00207CE7B1F1800318BF01235C
-S315080009A8002908BF00239BB912F0800F16D101F061
-S315080009B87F0101EB81018B0003F5A87129440431F5
-S315080009C800240C6002222846FFF7D9FC204660E777
-S315080009D821462846FFF72DFD00205AE701F07F013A
-S315080009E801EB81018B0003F1100129440431E7E783
-S315080009F852B2002A24DB01F00F0303EB83039800A5
-S31508000A082844B0F8643153B3002A2EDB01F07F027C
-S31508000A1802EB8202930003F5A8742C440434802957
-S31508000A2814BF00230123002908BF01233BB3002371
-S31508000A382360022221462846FFF7A1FC002028E762
-S31508000A4801F00F0303EB830398002844838C002BDB
-S31508000A58DAD121462846FFF7ECFC002019E721469B
-S31508000A682846FFF7E6FC002013E701F07F0202EBB1
-S31508000A788202930003F110042C440434CFE7284675
-S31508000A8803F038FA10B101232360D2E70023236064
-S31508000A98CFE721462846FFF7CCFC0020F9E60020D8
-S31508000AA8F7E6C0B170B50D4616460446FFF79AFC38
-S31508000AB8013040003080287003236B7002232278A7
-S31508000AC842B1EA5401345A1CD2B20021A95402335D
-S31508000AD8DBB2F4E770BD7047C0B108B50346D0F875
-S31508000AE8B80210B10020C3F8B802D3F8CC0210B186
-S31508000AF80020C3F8CC0209B1C3F8B412184601237A
-S31508000B0880F89C32027003F0BBF908BD03207047D1
-S31508000B1810B50446012380F89C32D0F8B83213B1D0
-S31508000B285B6801799847D4F8CC3213B10023C4F826
-S31508000B38CC32204603F017FA034608B1184610BD0A
-S31508000B48204603F000FA0346F8E710B582B00023FA
-S31508000B58ADF8063059B10446C4F8B812CB6A0DF197
-S31508000B6806009847C4F8CC02002002B010BD03203E
-S31508000B78FBE708B503F0EFF908BD08B5D0F8B832B1
-S31508000B8813B11B68984708BD0320FCE708B5D0F8D9
-S31508000B98B8320BB15B689847002008BD38B50446DB
-S31508000BA800F2AA252846FFF730FC0123C4F8943238
-S31508000BB8B4F8B032C4F8983294F8AA1201F01F03B0
-S31508000BC8012B0ED05AB23AB1022B0FD001F0800190
-S31508000BD8204603F0E3F903E029462046FFF7D2FD4D
-S31508000BE838BD29462046FFF708FEF9E72946204674
-S31508000BF8FFF737FEF4E710B5044631BB1346D0F8BD
-S31508000C089422032A01D0002010BDD0F85C11D0F830
-S31508000C18602191420CD8D0F8B8321B691BB190F8FC
-S31508000C289C22032A0FD02046FFF7C6FB0020EBE7D5
-S31508000C38891AC0F85C118A4228BF0A461946FFF77E
-S31508000C48B3FB0020E0E79847EDE70A46D0F8B83244
-S31508000C589B6933B190F89C12032904D11146984729
-S31508000C68D2E70320D0E70320CEE710B504460029CB
-S31508000C7847D11346D0F89422022A05D094F8A03210
-S31508000C88012B3AD0002010BDC269016A8A4211D8E0
-S31508000C988A421BD0D4F8B832DB681BB194F89C2278
-S31508000CA8032A27D08021204603F078F92046FFF743
-S31508000CB88EFBE3E7521AC2611946FFF76DFB00235C
-S31508000CC81A461946204603F089F9D7E783699942EF
-S31508000CD8E0D8D0F898229342DCD200221146FFF7D2
-S31508000CE85BFB0021C4F898120B460A46204603F017
-S31508000CF875F9C3E720469847D4E7002084F8A00288
-S31508000D08C1E70A46D0F8B8325B6933B190F89C1245
-S31508000D18032904D111469847B5E70320B3E703200A
-S31508000D28B1E770B50446012380F89C320023C0F861
-S31508000D3894324360C0F8A432D0F8BC3223B1D0F854
-S31508000D48B8325B680021984740230022114620469E
-S31508000D5803F011F90126A4F864614025C4F8605126
-S31508000D682B4600228021204603F005F9A684256231
-S31508000D78002070BD01740020704790F89C3280F8F6
-S31508000D889D32042380F89C320020704790F89C32E4
-S31508000D98042B01D00020704790F89D3280F89C32C9
-S31508000DA8F8E708B590F89C32032B01D0002008BD57
-S31508000DB8D0F8B832DB69002BF8D09847F6E7002058
-S31508000DC87047002070470020704708B5012380F84F
-S31508000DD89C32D0F8B83213B15B680179984700207D
-S31508000DE808BD0000054BD3F8882042F47002C3F802
-S31508000DF888204FF000629A60704700BF00ED00E057
-S31508000E0810B5094B4FF0FF321A6200241C625A6269
-S31508000E185C621A611C615A615C619A619C6102F0A4
-S31508000E28EDFE204610BD00BF0038024010B5044646
-S31508000E380E4B18784FF47A73B3FBF0F30C4A106824
-S31508000E48B0FBF3F001F060FE68B90F2C01D9012058
-S31508000E580AE0002221464FF0FF3001F023FE054B39
-S31508000E681C60002000E0012010BD00BF30040020EF
-S31508000E782C0400203404002008B5032001F000FEE5
-S31508000E880020FFF7D3FF02F013FE002008BD00007C
-S31508000E9838B5044603F0E2FB0546B4F1FF3F02D035
-S31508000EA8044B1B781C4403F0D9FB401BA042FAD319
-S31508000EB838BD00BF300400202DE9F04782B0D0F8CD
-S31508000EC80080CA00521A930003445A6D1B6D9A4251
-S31508000ED855D8C1469B1AC1EBC104A2000244526CFC
-S31508000EE89A4200D31A460C46074602F1030A4FEA05
-S31508000EF89A0A15E006F1030A4FEA9A0AE3001B1B49
-S31508000F089D003D44A96C3B7C0093B3B2E2B24046CF
-S31508000F1802F056F9AB6C3344AB646B6D1E446E65D0
-S31508000F2809EB441303F510639B699BB2534512D327
-S31508000F38E3001B1B9A003A44516D136D99420AD275
-S31508000F484BB15B1AC4EBC4018A003A44566C9E42FC
-S31508000F58D0D31E46CEE7E3001B1B980007443A6D1C
-S31508000F687B6D9A420FD804F00F040123A340D8F8E2
-S31508000F78344824EA0304C8F83448002000E001206D
-S31508000F8802B0BDE8F0870020FAE77047F0B58BB0E5
-S31508000F98002800F091800446056890F8BD3323B30D
-S31508000FA8032384F8BD33EB6B13F4807F01D1002348
-S31508000FB82361206801F096FE254655F8107B6E4693
-S31508000FC80FCD0FC60FCD0FC695E8030086E80300B8
-S31508000FD8231D0ECB384601F0CBFD58B1022384F801
-S31508000FE8BD33012528460BB0F0BD80F8BC33FFF7A2
-S31508000FF8CCFFD5E70021206801F07AFE0023656852
-S31508001008AB4216D2D900C81A82002244012082F8B7
-S315080010183D0082F83C30A2F84230002082F83F00B2
-S3150800102850649064CA1A9100214408650133DBB2FA
-S31508001038E5E700239D4216D9D800C11A8A0022443A
-S31508001048002182F8FD1182F8FC3182F8FF11C2F8F6
-S315080010580412C2F80812C21A90002044C0F81012E6
-S315080010680133DBB2E6E7254655F8107B6E460FCD09
-S315080010780FC60FCD0FC695E8030086E80300231DA3
-S315080010880ECB384601F07AFE054660B9002384F887
-S315080010983830012384F8BD33636A012B08D02068E9
-S315080010A802F05BFA9EE7022384F8BD33012599E727
-S315080010B8204602F085FBF2E7012593E7704790F88A
-S315080010C8BC33012B0ED010B50446012380F8BC3377
-S315080010D8006802F036FA206801F0FEFD002084F860
-S315080010E8BC0310BD0220704738B590F8BC33012BF5
-S315080010F818D00446012380F8BC33006801F0F2FDD5
-S31508001108206802F0EAF9054628B1002384F8BC33BA
-S315080011180125284638BD206802F01FFA002384F8FE
-S31508001128BC33F6E70225F4E768B110B5044603238D
-S3150800113880F8BD33FFF7D8FF2046FFF7BFFF00202A
-S3150800114884F8BD0310BD01207047000070B5044639
-S315080011580D460068066C00EB411303F530639A6880
-S315080011682169012911D037498E4254D03DB9C5EBBA
-S31508001178C50293002344D3F81032002B5CD0E9B299
-S31508001188204602F001FE002070BD12F0080F09D0B3
-S315080011982D498E42F7D912F4004FF4D04FF4004285
-S315080011A89A60F0E712F0200F02D020229A60EAE748
-S315080011B812F0280FE7D124498E4206D912F4004FB7
-S315080011C803D04FF400429A60DDE7E900491B8A001C
-S315080011D82244D2F804121B69C3F31203C91AC2F8C7
-S315080011E81412D2F80412D2F808320B44C2F808329C
-S315080011F835B9C5EBC50293002344D3F8103223B199
-S31508001208E9B2204602F0C0FDBDE704F57172012176
-S3150800121802F0F4F9F4E712F4004F03D04FF4004251
-S315080012289A60B0E712F0200F01D020229A60E9B23E
-S31508001238204602F0A9FDA6E704F57172002102F01E
-S31508001248DDF99CE70A31544F0A30544F38B504463D
-S3150800125803681D6C03EB4111D1F8082B0E4B9D4210
-S3150800126807D901F5306112F4004F02D04FF4004354
-S315080012788B60204602F080FD074B9D4202D9236900
-S31508001288012B01D0002038BD04F5717201212068B0
-S3150800129802F0B4F9F6E700BF0A30544F2DE9F84FC3
-S315080012A804460568284602F095F908B1BDE8F88F9E
-S315080012B82F460646206802F05CF90028F6D0206812
-S315080012C802F057F910F0020F04D02268536903F0A8
-S315080012D802035361206802F04CF910F0100F15D07C
-S315080012E82268936923F010039361D5F8208008F0E3
-S315080012F80F09C8F34343022B00F08580062B00F03C
-S31508001308A5802268936943F010039361206802F068
-S3150800131830F910F4002F40F0AD80206802F029F962
-S3150800132810F4802F40F0F180206802F022F9002896
-S31508001338C0F25F81206802F01CF910F4006F0AD029
-S31508001348D5F8083813F0010F40F06D812268536903
-S3150800135803F400635361206802F00BF910F0006F7C
-S3150800136815D02268536903F00063536194F8F4337F
-S31508001378002B40F05C81012184F8F41323685B6D27
-S31508001388C3F38303C4F8F833204602F02DFA20681D
-S3150800139802F0EFF810F4805F40F04D81206802F003
-S315080013A8E8F810F4005F40F0AB81206802F0E1F835
-S315080013B810F0080F40F0BC81206802F0DAF810F443
-S315080013C8801F40F0BE81206802F0D3F810F4001F91
-S315080013D840F0C181206802F0CCF810F0804F40F048
-S315080013E8C481206802F0C5F810F0040F3FF45EAF18
-S315080013F823685D6815F0040F40F0C08122685368B9
-S315080014082B43536052E747F6F07318EA030F3FF485
-S3150800141878AF4FEA18184FEAC90BABEB09034FEA3E
-S31508001428830AA244C8F30A02DAF80812284601F021
-S31508001438E5FFC8F30A08DAF808324344CAF8083256
-S31508001448DAF814324344CAF814325AE7082204F57B
-S315080014587171284601F0D2FFC8F30A184FEAC90382
-S31508001468A3EB09018A002244D2F814324344C2F88D
-S31508001478143246E7206802F080F88046B14617E03D
-S3150800148807EB49130122C3F8082B49462046FFF7FC
-S315080014985DFE1DE007EB49130822C3F8082B4946E9
-S315080014A82046FFF7D3FE16E009F101094FEA580866
-S315080014B8B8F1000F3FF431AF18F0010FF4D05FFA16
-S315080014C889F1206802F069F8824610F0010FD7D131
-S315080014D81AF0080FDED11AF0100F04D007EB4913DB
-S315080014E81022C3F8082B1AF0200F04D007EB49136B
-S315080014F82022C3F8082B1AF4005FD5D007EB491346
-S315080015084FF40052C3F8082BCEE7206802F03DF8DE
-S315080015188046B1462AE05946204602F041FC1AF0B0
-S31508001528080F04D007EB49130822C3F808291AF04C
-S31508001538100F04D007EB49131022C3F808291AF02C
-S31508001548400F04D007EB49134022C3F808291AF0BC
-S31508001558020F04D007EB49130222C3F808291AF028
-S31508001568800F41D109F101094FEA5808B8F1000F6F
-S315080015783FF4DAAE18F0010FF4D05FFA89FB594642
-S31508001588206802F013F8824610F0010FC7D009F058
-S315080015980F03012101FA03F2D7F8343823EA0203C4
-S315080015A8C7F8343807EB4913C3F8081923698B4277
-S315080015B8B1D14FEAC902A2EB090293002344596C38
-S315080015C89A6C0A449A64B9F1000FA4D1C9EBC90206
-S315080015D8930023441B6D002B9DD104F571720121DC
-S315080015E8206802F00BF896E749462046FFF764FCA0
-S315080015F8B8E7D5F8043823F00103C5F8043894F891
-S31508001608F433012B08D0204602F010FC22685369EF
-S3150800161803F0004353618DE6002184F8F41320464D
-S3150800162802F0E2F8F2E7204602F0E6FB8EE62046EC
-S3150800163802F0E2FBABE605F50068D8F8043023F0BB
-S315080016480103C8F804301021206801F069FB20E07E
-S3150800165807EB46134FF67F31C3F80819D3F8002964
-S3150800166822F40012C3F80029D3F8002942F00062D0
-S31508001678C3F80029C3F8081BD3F8002B22F4001274
-S31508001688C3F8002BD3F8002B42F00062C3F8002BEE
-S3150800169801366368B342DBD8D8F81C3043F0011327
-S315080016A8C8F81C30236BEBB1D8F8843043F00B0329
-S315080016B8C8F88430D8F8443043F00B03C8F84430E7
-S315080016C8D5F8003823F4FE63C5F8003804F57172B6
-S315080016D8217C206801F092FF2268536903F480533D
-S315080016E853615BE6D8F8142042F22B031343C8F873
-S315080016F81430D8F8103043F00B03C8F81030DFE779
-S31508001708206801F06BFF206801F008FCE060256896
-S3150800171800F038FC227B0146284601F067FA204685
-S3150800172802F050FB2268536903F4005353613CE600
-S31508001738204602F040FB2268536903F00803536108
-S315080017483AE60021204602F080FB2268536903F432
-S315080017588013536137E60021204602F070FB2268A1
-S31508001768536903F40013536134E6204602F073FB09
-S315080017782268536903F08043536132E6204602F033
-S3150800178874FB3BE690F8BC33012B0BD010B5044626
-S31508001798012380F8BC33006801F0D3FE002084F8E2
-S315080017A8BC0310BD0220704790F8BC33012B0BD040
-S315080017B810B50446012380F8BC33006801F0CDFE55
-S315080017C8002084F8BC0310BD0220704790F8BC338B
-S315080017D8012B0DD010B50446012380F8BC3380F8D8
-S315080017E83810006801F09DFE002084F8BC0310BD7F
-S315080017F802207047F8B511F0800F27D101F00F05C0
-S31508001808EE00771BBC00274604F5FC740444043430
-S315080018180744002587F8FD5101F00F012170A260E1
-S31508001828E370627802B1E180022B1ED090F8BC33CF
-S31508001838012B1DD00546012380F8BC3321460068D4
-S3150800184801F07CFB002085F8BC03F8BD01F00F0603
-S31508001858F500AF1BBC0027463834044404343E461A
-S315080018680644012586F83D50D6E700232371DDE7AF
-S315080018780220EAE738B511F0800F20D101F00F04ED
-S31508001888E200151BAB001D4603F5FC73034404333D
-S315080018980544002285F8FD2101F00F01197090F81A
-S315080018A8BC23012A1AD00446012280F8BC2319460B
-S315080018B8006801F08BFB002084F8BC0338BD01F0F2
-S315080018C80F04E200151BAB001D46383303440433E6
-S315080018D82C460444012284F83D20DDE70220EDE782
-S315080018E870B501F00F05EE00711B8C0004F5FC7449
-S315080018F80444211D761BB4000444C4F80822C4F81D
-S3150800190810320023C4F8143284F8FD3184F8FC51E7
-S315080019180369012B06D065B9DAB2006801F0C4FB81
-S31508001928002070BDC5EBC506B4000444C4F80C22F3
-S31508001938F1E7DAB2006801F057FCF1E701F00F01A8
-S31508001948C1EBC1018B001844D0F81402704770B572
-S3150800195801F00F05EE00711B8C0038340444211D74
-S31508001968761BB4000444A264236500236365012337
-S3150800197884F83D3084F83C500369012B06D05DB9DC
-S31508001988DAB2006801F090FB002070BDC5EBC50609
-S31508001998B4000444E264F2E7DAB2006801F024FC11
-S315080019A8F2E738B501F00F0543689D4236D811F0BD
-S315080019B8800F20D1CA00541AA3001C4603F5FC73ED
-S315080019C80344043322460244002182F8FD11012209
-S315080019D89A701D7090F8BC23012A21D0044601226A
-S315080019E880F8BC231946006801F01CFD7DB100206B
-S315080019F884F8BC0338BDEA00511B8B0019463833F6
-S31508001A08034404330144012281F83D20DFE704F545
-S31508001A187172217C206801F0F1FDE8E70120E9E709
-S31508001A280220E7E710B501F00F0443689C422CD85A
-S31508001A3811F0800F1DD1E3001A1B91000A4601F523
-S31508001A48FC71014404310244002382F8FD31002365
-S31508001A588B700C7090F8BC33012B18D00446012300
-S31508001A6880F8BC33006801F00AFD002084F8BC033E
-S31508001A7810BDE3001A1B91000A46383101440431A7
-S31508001A880244012382F83D30E1E70120F0E702200D
-S31508001A98EEE70000534B98421FD0534B984228D084
-S31508001AA8524B984231D0524B98423AD0514B9842B1
-S31508001AB843D0514B98424CD0504B984255D0504B36
-S31508001AC898425ED04F4B984267D04F4B984270D099
-S31508001AD84E4B984279D00120704703F560531A692E
-S31508001AE842F001021A611A6922F001021A610020FD
-S31508001AF8704703F550531A6942F002021A611A69C7
-S31508001B0822F002021A610020704703F540531A6949
-S31508001B1842F004021A611A6922F004021A610020C6
-S31508001B28704703F530531A6942F008021A611A69B0
-S31508001B3822F008021A610020704703F520531A6933
-S31508001B4842F010021A611A6922F010021A6100207E
-S31508001B58704703F510531A6942F020021A611A6988
-S31508001B6822F020021A610020704703F500531A690B
-S31508001B7842F040021A611A6922F040021A610020EE
-S31508001B88704703F5E0531A6942F080021A611A6928
-S31508001B9822F080021A610020704703F5C0531A69BB
-S31508001BA842F480721A611A6922F480721A61002056
-S31508001BB8704703F5A0531A6942F400721A611A6944
-S31508001BC822F400721A610020704703F580531A69D7
-S31508001BD842F480621A611A6922F480621A61002046
-S31508001BE8704700BF00000240000402400008024097
-S31508001BF8000C02400010024000140240001802407F
-S31508001C08001C02400020024000240240002802402E
-S31508001C18F0B40C6894FAA4F4B4FA84F44BE08E6829
-S31508001C28826893FAA3F5B5FA85F56D00032707FACE
-S31508001C3805F522EA050293FAA3F5B5FA85F56D00C6
-S31508001C4806FA05F52A4382600E68CD68426822EAD4
-S31508001C58060205FB06F52A4342600E69C26893FA2E
-S31508001C68A3F5B5FA85F56D00032707FA05F522EAFF
-S31508001C78050293FAA3F5B5FA85F56D0006FA05F592
-S31508001C882A43C2604A68022A22D04A68056893FA33
-S31508001C98A3F6B6FA86F67600032707FA06F625EABD
-S31508001CA8060593FAA3F3B3FA83F35B0002FA03F380
-S31508001CB82B43036001340B6833FA04F23CD0012243
-S31508001CC8A2401340F6D04A68013A012AC5D8A6E7C1
-S31508001CD893FAA3F2B2FA82F2072A15D84E69026A6B
-S31508001CE893FAA3F5B5FA85F5AD000F2707FA05F5B2
-S31508001CF822EA050293FAA3F5B5FA85F5AD0006FAC0
-S31508001D0805F52A430262C0E74D69466A1A0A92FA35
-S31508001D18A2F7B7FA87F7BF004FF00F0C0CFA07F7C8
-S31508001D2826EA070692FAA2F2B2FA82F2920005FAAF
-S31508001D3802F232434262A8E70020F0BC704700006E
-S31508001D4810B40A490C6924F440740C610C6944F40B
-S31508001D5840740C610C6944F001040C61026043602C
-S31508001D68BFF34F8F5DF8044B704700BF003C024035
-S31508001D78084B1A6922F440721A611A6942F4007209
-S31508001D881A611A6942F001021A610160BFF34F8F9E
-S31508001D98704700BF003C0240084B1A6922F440729B
-S31508001DA81A611A6942F480721A611A6942F00102C4
-S31508001DB81A610180BFF34F8F704700BF003C02408D
-S31508001DC8074B1A6922F440721A611A691A611A6964
-S31508001DD842F001021A610170BFF34F8F704700BFC6
-S31508001DE8003C02401A4BDB6813F0020F04D0194A6C
-S31508001DF8936943F020039361154BDB6813F0100FC2
-S31508001E0804D0144A936943F010039361104BDB68B6
-S31508001E1813F0200F04D00F4A936943F0080393611F
-S31508001E280B4BDB6813F0400F04D00A4A936943F05A
-S31508001E3804039361064BDB6813F0800F04D0054A48
-S31508001E48936943F002039361014BF222DA60704703
-S31508001E58003C0240600E0020094B1B69002B01DB81
-S31508001E6800207047064B074A5A6002F188325A60C2
-S31508001E781B69002B01DB002070470120704700BF53
-S31508001E88003C024023016745034A136943F00043AF
-S31508001E9813610020704700BF003C024038B504466D
-S31508001EA8154B00229A6102F0D9FB0546134BDB68ED
-S31508001EB813F4803F0AD0B4F1FF3FF7D024B102F0FB
-S31508001EC8CDFB401BA042F1D903200DE00B4BDB6884
-S31508001ED813F0F20F09D1094BDB6813F0010F08D08C
-S31508001EE8064B0122DA60002038BDFFF77BFF012088
-S31508001EF8FAE70020F8E700BF600E0020003C024021
-S31508001F08F8B51E4C247D012C35D01F4616460D46BD
-S31508001F1804461A4B01221A754CF25030FFF7BEFFD9
-S31508001F28014698B9032C07D8DFE804F002151A1FEA
-S31508001F38F1B22846FFF744FF4CF25030FFF7AEFFE0
-S31508001F4801460F4A136923F0010313610B4B00225C
-S31508001F581A750846F8BDB1B22846FFF71DFFEBE724
-S31508001F6831462846FFF704FFE6E732463B46284649
-S31508001F78FFF7E6FEE0E70221EBE700BF600E002068
-S31508001F88003C0240014B1868704700BF2C0400202B
-S31508001F987047002800F0A18038B5044690F820302C
-S31508001FA8D3B12268136823F00203136002F056FBC4
-S31508001FB8054623685A6812F0020F10D002F04EFB45
-S31508001FC8401B0A28F5D9636A43F40033636205237C
-S31508001FD884F82030012038BDFFF7DAFFE1E71A68F0
-S31508001FE842F001021A6002F039FB054623685A686E
-S31508001FF812F0010F0DD102F031FB401B0A28F5D962
-S31508002008636A43F400336362052384F820300120A9
-S31508002018E1E7227E012A3DD01A6822F080021A607A
-S31508002028637E012B3BD02268136823F040031360B4
-S31508002038A37E012B39D02268136823F02003136086
-S31508002048E37E012B37D02268136843F01003136028
-S31508002058237F012B35D02268136823F00803136001
-S31508002068637F012B33D02268136823F004031360B7
-S31508002078A368E268134322691343626913436268D3
-S31508002088013A21681343CB6100206062012384F872
-S315080020982030A0E71A6842F080021A60C0E7226872
-S315080020A8136843F040031360C2E72268136843F0D5
-S315080020B820031360C4E72268136823F0100313602B
-S315080020C8C6E72268136843F008031360C8E722685E
-S315080020D8136843F004031360CAE701207047000039
-S315080020E890F82030013BDBB2012B05D9436A43F44B
-S315080020F8802343620120704770B4434BD3F800220B
-S3150800210842F00102C3F80022D3F8002222F47C52D6
-S31508002118C3F80022D3F80022486A42EA0022C3F824
-S3150800212800224A6902F01F02012000FA02F2D3F8D7
-S315080021381C42D0430440C3F81C42CB69B3B9324B9E
-S31508002148D3F80C420440C3F80C42CE688D884C6913
-S3150800215845EA0645483443F834508E680C884D6974
-S3150800216844EA0644483503EBC5035C60CB69012B92
-S315080021781DD08B69002B32D1234CD4F80432034086
-S31508002188C4F804320B698BBB1F4BD3F814422040A2
-S31508002198C3F814020B6A012B2FD01B4AD2F8003257
-S315080021A823F00103C2F80032002070BC7047164BB2
-S315080021B8D3F80C421443C3F80C420E688D884C6950
-S315080021C845EA0645483443F834508E688C894D6983
-S315080021D844EA0644483503EBC5035C60C9E70A4C7C
-S315080021E8D4F804321343C4F80432CBE70648D0F8C7
-S315080021F814321343C0F81432CCE70349D1F81C3219
-S315080022081A43C1F81C22C8E70064004038B590F89C
-S315080022182030DBB2012B05D0436A43F4002343621E
-S31508002228012038BD0446022380F820300268136866
-S3150800223823F00103136002F011FA054623685B6868
-S3150800224813F0010F0DD002F009FA401B0A28F5D938
-S31508002258636A43F400336362052384F82030012057
-S31508002268DFE700206062DCE770B490F82040056874
-S31508002278AD68013CE4B2012C65D815F0E05F5CD086
-S31508002288C5F30165022D05D9436A43F40003436281
-S3150800229801205DE00124AC401C608B68002B39D115
-S315080022A80E68CB68046843EA465605F118031B010D
-S315080022B8E65003680C6905F1180603EB06135C601B
-S315080022C80B7D012B31D0D17993791B0443EA01633D
-S315080022D8517943EA01231479016823432C012144DF
-S315080022E8C1F88C31D17893781B0443EA0163517895
-S315080022F843EA0123117802680B432244C2F888315D
-S31508002308016805F118031B01CA5842F00102CA50B0
-S3150800231800201DE04C6843EAC403CC6806682343DA
-S3150800232805F1180424013351C3E7036803EB0613C0
-S31508002338596841F480715960C5E7436A43F4001344
-S315080023484362012004E0436A43F480234362012080
-S3150800235870BC704790F82030013BDBB2012B01D9DD
-S315080023680020704703689B68890631EA030301D091
-S31508002378012070470020704730B490F82040013C8F
-S31508002388E4B2012C00F28A8051B90468E46814F0B2
-S31508002398030F10D1436A43F400134362012082E015
-S315080023A80468246914F0030F05D1436A43F400133B
-S315080023B84362012077E0056801F11B0424012C59C2
-S315080023C804F004049460002C5AD1056801F11B0432
-S315080023D824012C59640D1460056801F11B042401B5
-S315080023E82D5905F00205D560056825446D6805F080
-S315080023F80F051561056825446D68C5F307259561B8
-S3150800240805682C446468240C546104680A01144459
-S31508002418D4F8B8411C7004681444D4F8B841C4F315
-S3150800242807245C7004681444D4F8B841C4F3074414
-S315080024389C7004681444D4F8B841240EDC70046807
-S315080024481444D4F8BC411C7104681444D4F8BC413B
-S31508002458C4F307245C7104681444D4F8BC41C4F373
-S3150800246807449C7104682244D2F8BC21120EDA711A
-S3150800247871B90268D36843F02003D360002012E0DC
-S31508002488056801F11B0424012C59E4085460A3E7E4
-S315080024980268136943F020031361EFE7436A43F4BC
-S315080024A880234362012030BC70470000014B186046
-S315080024B8704700BF2C04002038B5036813F0010FD5
-S315080024C875D10D46044603683C4A1A404B68C968E4
-S315080024D80B4329690B43A9690B4313430360AB688C
-S315080024E8426822F44052134343606B69826822F4B7
-S315080024F8407213438360324B984216D0314B984248
-S3150800250827D0314B984228D0304B984229D0304BA7
-S3150800251898422AD02F4B98422CD02F4B98422ED02F
-S315080025282E4B984230D0012042E0032000F010F9E3
-S3150800253800283ED02B68002B3DD0AA69B2F5004F7B
-S3150800254827D000EB5300B0FBF3F080B2E060002020
-S315080025582EE00C2000F0FCF8EAE7302000F0F8F846
-S31508002568E6E7C02000F0BEF9E2E74FF4407000F055
-S31508002578B9F9DDE74FF4406000F0EAF8D8E74FF418
-S31508002588405000F0AFF9D3E74FF4404000F0AAF9FD
-S31508002598CEE75A0802EB4000B0FBF3F04FF6F073AB
-S315080025A80340C0F342001843E060002000E0012021
-S315080025B838BD0120FCE70120FAE700BFF369FFEF01
-S315080025C8001001400044004000480040004C00400C
-S315080025D8005000400014014000780040007C00408C
-S315080025E882B0224A136843F0010313601F4B1B6825
-S315080025F813F0020FFAD01D4B00229A601A6801924E
-S3150800260801991B4A0A400192019A1A601A6822F02F
-S31508002618F80242F080021A60144B1B6813F0007F18
-S31508002628FAD1124B1B6813F0006FFAD10F4B1B68CF
-S3150800263813F0005FFAD10D4B0E4A5A60103AC3F8E8
-S315080026488420C3F88820DA6822F4FE42DA60DA6859
-S3150800265842F47F02DA605A6F22F001025A675A6F0B
-S3150800266842F080725A67002002B07047003802406C
-S31508002678FFFFF2EA10300024034B9B68C3F30313E9
-S31508002688024AD35CD840704700380240A051000877
-S31508002698034B9B68C3F38223024AD35CD84070472E
-S315080026A800380240B0510008034B9B68C3F3423315
-S315080026B8024AD35CD840704700380240B051000837
-S315080026C80D4B5B6803F480039BB90C480A4B5A68A0
-S315080026D802F03F02B0FBF2F25868C0F3881000FB1C
-S315080026E802F05B68C3F3014301335B00B0FBF3F008
-S315080026F870470348EAE700BF003802400024F400A0
-S3150800270800127A0008B5074B9B6803F00C03042BE4
-S3150800271804D0082B04D1FFF7D3FF02E0024800E0F3
-S31508002728024808BD0038024000127A000024F40066
-S3150800273810B50446FFF7E6FF2060FFF79DFF6060C7
-S31508002748FFF7A6FFA0606068FFF7AEFFE06010BD60
-S3150800275808B5032808D00C282DD0B0F5406F51D0FD
-S31508002768302877D0002008BD584BD3F8903003405E
-S3150800277843EA0040564B98420FD0B0F1031F13D0D6
-S31508002788013B984206D0FFF7BDFFFFF775FFFFF735
-S315080027988BFFE8E7FFF7B6FFE5E74C4B1B6813F036
-S315080027A8020F7ED10020DEE7484B1B6F13F0020F9D
-S315080027B879D10020D7E7454BD3F89030034043EA50
-S315080027C80040444B98420FD0B0F10C1F13D0043B7D
-S315080027D8984206D0FFF796FFFFF74EFFFFF758FF18
-S315080027E8C1E7FFF78FFFBEE7384B1B6813F0020FE8
-S315080027F85CD10020B7E7354B1B6F13F0020F57D192
-S315080028080020B0E7314BD3F89030034043EA004044
-S31508002818314B984210D0B0F10C2F14D0A3F5806331
-S31508002828984206D0FFF76EFFFFF726FFFFF73CFF33
-S3150800283899E7FFF767FF96E7244B1B6813F0020F23
-S3150800284839D100208FE7214B1B6F13F0020F34D1C3
-S31508002858002088E71D4BD3F89030034043EA004030
-S315080028681E4B98420FD0B0F1301F13D0103B984238
-S3150800287806D0FFF747FFFFF7FFFEFFF709FF72E7E6
-S31508002888FFF740FF6FE7114B1B6813F0020F17D1CC
-S31508002898002068E70D4B1B6F13F0020F12D10020BA
-S315080028A861E70F485FE74FF400405CE70C485AE7D2
-S315080028B84FF4004057E70A4855E74FF4004052E7F7
-S315080028C8074850E74FF400404DE700BF003802407C
-S315080028D80200030008000C000008000C2000300065
-S315080028E80024F40008B5C0280AD0B0F5407F2FD0D8
-S315080028F8B0F5405F54D0B0F5404F79D0002008BDF8
-S31508002908594BD3F89030034043EA0040574B984256
-S315080029180FD0B0F1C01F14D0403B984206D0FFF73D
-S31508002928F1FEFFF7A9FEFFF7B3FEE8E7FFF7EAFEB1
-S31508002938E5E74D4B1B6813F0020F40F08180002035
-S31508002948DDE7494B1B6F13F0020F7BD10020D6E752
-S31508002958454BD3F89030034043EA0040444B98422D
-S3150800296810D0B0F1032F14D0A3F58073984206D07F
-S31508002978FFF7C8FEFFF780FEFFF78AFEBFE7FFF7F7
-S31508002988C1FEBCE7384B1B6813F0020F5DD1002067
-S31508002998B5E7354B1B6F13F0020F58D10020AEE789
-S315080029A8314BD3F89030034043EA0040314B984204
-S315080029B810D0B0F1302F14D0A3F58053984206D022
-S315080029C8FFF7A0FEFFF758FEFFF762FE97E7FFF747
-S315080029D899FE94E7244B1B6813F0020F3AD100209E
-S315080029E88DE7214B1B6F13F0020F35D1002086E7C0
-S315080029F81D4BD3F89030034043EA00401E4B9842DB
-S31508002A0810D0B0F1C02F14D0A3F58043984206D051
-S31508002A18FFF778FEFFF730FEFFF73AFE6FE7FFF796
-S31508002A2871FE6CE7104B1B6813F0020F17D10020D4
-S31508002A3865E70D4B1B6F13F0020F12D100205EE7F6
-S31508002A480E485CE74FF4004059E70C4857E74FF43F
-S31508002A58004054E7094852E74FF400404FE7074853
-S31508002A684DE74FF400404AE7003802408000C000AE
-S31508002A780002000300200030008000C00024F40093
-S31508002A880649CB6823F4E0631B041B0C000200F418
-S31508002A98E0600343024A1A43CA60704700ED00E043
-S31508002AA80000FA0530B4154BDB68C3F30223C3F1FB
-S31508002AB80704042C28BF04241D1D062D01D9033B31
-S31508002AC800E000234FF0FF3505FA04F421EA040173
-S31508002AD8994005FA03F322EA03031943002805DB9C
-S31508002AE80901C9B2064B195430BC704700F00F00EB
-S31508002AF80901C9B2034B1954F6E700BF00ED00E017
-S31508002B0800E400E014ED00E00138B0F1807F0AD255
-S31508002B18064B5860064AF02182F823100020986070
-S31508002B2807221A6070470120704700BF10E000E0CE
-S31508002B3800ED00E0002301330C4A934211D80269DC
-S31508002B48002AF8DA036943F0010303610023013315
-S31508002B58064A934207D8026912F0010FF7D10020F6
-S31508002B687047032070470320704700BF400D0300D5
-S31508002B7884B010B5044603A880E80E00089B012B0C
-S31508002B881DD1A36B23F48033A363E268164B134065
-S31508002B98E360E36823F44013E3600F9B012B09D035
-S31508002BA82046FFF7C7FF069B012B14D0BDE8104047
-S31508002BB804B07047E36843F48013E360F0E7E3681A
-S31508002BC843F04003E3602046FFF7B4FFA36B43F4E2
-S31508002BD88033A363E7E7A36843F00603A360A36803
-S31508002BE843F02003A360E1E7BFFFBDFF022A0AD02E
-S31508002BF80921C26822F47052C260C36843EA812375
-S31508002C08C36000207047274B0B44274A934237D99D
-S31508002C18264B0B44264A934234D9264B0B44264A5C
-S31508002C28934231D9254B0B4402F5C332A03293425D
-S31508002C382CD9234B0B44234A934229D9224B0B44BC
-S31508002C4802F5922202F57872934223D91F4B0B4458
-S31508002C5802F5C32202F5207293421DD91C4B0B4478
-S31508002C6802F5B71202F55872934217D9194B0B4455
-S31508002C7802F5122202F5F862934211D80721B8E73D
-S31508002C880F21B6E70E21B4E70D21B2E70C21B0E70C
-S31508002C980B21AEE70A21ACE70921AAE70821A8E72C
-S31508002CA80621A6E7405327FFFF340C00401E1BFFEA
-S31508002CB83F420F0000DC0BFF7F4F1200808CF9FEA5
-S31508002CC860B6E5FE5FE3160000D3CEFEC05BB3FE32
-S31508002CD800CA91FEE05459FE836843F001038360F5
-S31508002CE800207047836823F001038360002070473B
-S31508002CF808B5C36823F0C043C360012909D069B978
-S31508002D08C36843F08043C3603220FEF7C1F8002049
-S31508002D1808BDC36843F00053C360F5E70120F7E729
-S31508002D28890141F02001016100230133054A9342D4
-S31508002D3805D8026912F0200FF7D100207047032042
-S31508002D48704700BF400D03001023036100230133B9
-S31508002D58054A934205D8026912F0100FF7D10020E8
-S31508002D6870470320704700BF400D0300D0F80038AD
-S31508002D781943C0F8001800207047000084B0F8B559
-S31508002D88044607A880E80E00254600230E2B07D818
-S31508002D9803F1400204EB8202002151600133F5E792
-S31508002DA8119B33BBD4F8043843F00203C4F804383B
-S31508002DB8A36B23F40013A363236843F0400323603B
-S31508002DC8236843F0800323600023C4F8003E04F513
-S31508002DD80066D4F80038C4F800380C9B012B0DD0CF
-S31508002DE8032B1CD1099BABB900212046FFF7BEFF70
-S31508002DF819E0A36B43F40013A363E5E7099B23B91A
-S31508002E0800212046FFF7B2FF0DE001212046FFF713
-S31508002E18ADFF08E001212046FFF7A8FF03E00321DC
-S31508002E282046FFF7A3FF10212046FFF779FF07463C
-S31508002E3800B101272046FFF787FF00B101270023C5
-S31508002E4833617361F3610AE0C3B94FF00060C2F8F1
-S31508002E58000900220A614FF67F328A600133079A11
-S31508002E689A4210D905EB431202F51061D2F8000907
-S31508002E780028E9DB0020C2F80009EAE74FF090408D
-S31508002E88C2F80009E5E700230AE0C3B94FF0006075
-S31508002E98C2F8000B00220A614FF67F328A600133B6
-S31508002EA8079A9A4210D905EB431202F53061D2F80F
-S31508002EB8000B0028E9DB0020C2F8000BEAE74FF010
-S31508002EC89040C2F8000BE5E7336923F48073336151
-S31508002ED80023A3616FF0804363610A9B1BB9A3694A
-S31508002EE843F01003A361A2690A4B1343A3610D9B20
-S31508002EF81BB1A36943F00803A361119B012B04D0F6
-S31508002F083846BDE8F84004B07047A269024B134337
-S31508002F18A361F5E700383C8004000040D0F808387B
-S31508002F2813F0060305D0062B18BF022B03D102207F
-S31508002F387047002070470F207047000070B40B7860
-S31508002F484A78012A20D0D0F81C2803F00F06012455
-S31508002F58B44042EA0442C0F81C2800EB4310D0F8F3
-S31508002F68003B13F4004F0CD1D0F8002B8B68C3F341
-S31508002F780A03C97843EA81431343134A1A43C0F834
-S31508002F88002B002070BC7047D0F81C4803F00F06C9
-S31508002F98B24092B22243C0F81C2800EB4310D0F87E
-S31508002FA8002912F4004FECD1D0F800498A68C2F318
-S31508002FB80A02C97842EA814242EA8353234302490C
-S31508002FC81943C0F80019DCE70080001030B40B7804
-S31508002FD84A78012A24D000EB4313D3F8002B002A99
-S31508002FE850DBD0F83C580A7802F00F02012404FA9C
-S31508002FF802F225EA0242C0F83C28D0F81C280978CB
-S3150800300801F00F018C4022EA0444C0F81C48D3F8A2
-S31508003018001B234A0A40C3F8002B002030BC70471F
-S3150800302800EB4313D3F80029002A1EDBD0F83C58D6
-S315080030380A7802F00F02012404FA02F292B225EA8B
-S315080030480202C0F83C28D0F81C28097801F00F01BC
-S315080030588C40A4B222EA0404C0F81C48D3F8001924
-S31508003068104A0A40C3F80029D7E7D3F8002942F0DE
-S315080030780062C3F80029D3F8002942F08042C3F851
-S315080030880029D3E7D3F8002B42F00062C3F8002BD7
-S31508003098D3F8002B42F08042C3F8002BA1E700BF03
-S315080030A80078F3EF007833EC70B40B784C78012C81
-S315080030B824D000EB431000F530631D693E4C2C40C4
-S315080030C81C611D693D4C2C401C614C690CB18C680F
-S315080030D84C611C6944F400241C611C698D68C5F39D
-S315080030E812052C431C61012A61D0D0F8003B43F035
-S315080030F80443C0F8003B002070BC70474C695CBBB1
-S3150800310800EB4314D4F810692C4D3540C4F810590F
-S31508003118D4F8105945F40025C4F81059D4F810699C
-S31508003128254D3540C4F81059012A31D000EB431310
-S31508003138D3F8002942F00442C3F800294B69002B4A
-S31508003148D9D0D0F83428097801F00F040121A14014
-S315080031580A43C0F83428CEE700EB431404F5106494
-S315080031682669154D354025612669144D3540256172
-S315080031784E698D68AE4200D94D61256945F400252A
-S31508003188256125694E69C6F3120635432561CBE7DD
-S315080031980A691AB100EB4311C1F8142900EB431068
-S315080031A8D0F8002942F00442C0F80029A3E7CA6803
-S315080031B8002A9AD05A6198E70000F8FFFFFF07E04F
-S315080031C870B49DF80C4064B903339E08B44208D21B
-S315080031D800EB023303F5805351F8045B1D60013494
-S315080031E8F4E7002070BC7047F0B583B00B784C78CC
-S315080031F8012C29D000EB431303F5306426697C4D6E
-S315080032083540256126697B4D354025614D69002D78
-S3150800321840F0BF8025698E68C6F3120635432561D6
-S31508003228256945F400252561012A00F0C780CA7872
-S31508003238012A00F0C980D3F8002B42F00442C3F8EB
-S31508003248002B002003B0F0BD4C6974BB00EB431497
-S31508003258D4F81069674D3540C4F81059D4F8105990
-S3150800326845F40025C4F81059D4F81069604D35405E
-S31508003278C4F81059012A4AD000EB4313D3F8004979
-S3150800328844F00444C3F80049CC78012C68D04B694B
-S31508003298002BD6D0D0F83428097801F00F0401217C
-S315080032A8A1400A43C0F83428CBE700EB4314D4F806
-S315080032B810694F4D3540C4F81059D4F810694D4D6A
-S315080032C83540C4F81059D4F810694D698F683D44DB
-S315080032D8013DB5FBF7F5484F07EAC5453543C4F838
-S315080032E81059D4F810594E69C6F312063543C4F86E
-S315080032F8105904F51064CD78012DBBD1256925F040
-S31508003308C0452561256945F000552561B2E70A6972
-S315080033181AB100EB4314C4F81429CA78012A08D04C
-S3150800332800EB4313D3F8002942F00442C3F80029F6
-S3150800333887E7D0F8082812F4807F08D100EB4311F4
-S31508003348D1F8002942F00052C1F80029E8E700EB55
-S315080033584311D1F8002942F08052C1F80029DFE765
-S31508003368D0F8084814F4807F0CD1D3F8004944F003
-S315080033780054C3F8004900928B8A0A78C968FFF78F
-S315080033881FFF5EE7D3F8004944F08054C3F80049A4
-S31508003398F1E78E683544013DB5FBF6F52669164F03
-S315080033A807EAC5473E43266127698E68ADB206FB1C
-S315080033B805F5C5F312053D43256135E7CA68002AB0
-S315080033C83FF435AF626132E7D0F8082812F4807FF7
-S315080033D806D1D3F8002B42F00052C3F8002B2AE78F
-S315080033E8D3F8002B42F08052C3F8002B23E700BF1E
-S315080033F80000F8FFFFFF07E00000F81F03329208F5
-S31508003408002393420CD210B400F58054246841F87E
-S31508003418044B01339342F7D308465DF8044B7047CB
-S31508003428084670470B784A78012A14D000EB4310EF
-S31508003438D0F8002B002A06DB2BB1D0F8003B23F086
-S315080034488043C0F8003BD0F8003B43F40013C0F8AB
-S31508003458003B0020704700EB4310D0F80029002AEB
-S3150800346806DB2BB1D0F8003923F08043C0F80039C1
-S31508003478D0F8003943F40013C0F80039E9E70B78A7
-S315080034884A78012A0ED000EB4310D0F8003B23F403
-S315080034980013C0F8003BCB78023BDBB2012B15D9E9
-S315080034A80020704700EB4310D0F8003923F40013C6
-S315080034B8C0F80039CB78023BDBB2012BF0D8D0F83C
-S315080034C8003943F08053C0F80039E9E7D0F8003BE3
-S315080034D843F08053C0F8003BE2E738B50546044692
-S315080034E800220E2A09D804EB42134FF67F31C3F897
-S315080034F80819C3F8081B0132F3E70022C5F8102893
-S31508003508C5F81428C5F81C282846FFF71DFC0346E5
-S3150800351808B1184638BD10212846FFF701FC0346AE
-S31508003528F7E7D0F8003823F4FE63C0F80038D0F877
-S315080035380038090101F4FE610B43C0F80038002081
-S31508003548704708B5D0F8043823F00203C0F80438E1
-S315080035580320FDF79DFC002008BD08B5D0F80438FF
-S3150800356843F00203C0F804380320FDF791FC002055
-S3150800357808BD4269806910407047D0F8183800F5C8
-S315080035880060C0691840000C7047D0F8183800F574
-S315080035980060C069184080B2704700EB4111D1F845
-S315080035A8082B00F5006040691040704710B4D0F841
-S315080035B81048D0F8343801F00F02D340DB01DBB2EB
-S315080035C8234300EB411000F51060806818405DF849
-S315080035D8044B7047406900F001007047D0F800298D
-S315080035E8054B1340C0F80039D0F8043843F4807303
-S315080035F8C0F804380020704700F8FFFF10B4046CC0
-S31508003608154B9C4203D9D0F8003B002B16DB002447
-S31508003618C0F8104BD0F8104B44F40024C0F8104BEF
-S31508003628D0F8104B44F01804C0F8104BD0F8104BDB
-S3150800363844F0C044C0F8104B012903D000205DF8B7
-S31508003648044B7047C0F8142BD0F8003B43F080238E
-S31508003658C0F8003BF2E700BF0A30544F084B1A6916
-S3150800366822F440721A611A6942F004021A611A6948
-S3150800367842EA002040F480301861BFF34F8F704744
-S31508003688003C024010B449B1012923D0022902D0CE
-S315080036984FF4407203E04FF4007200E000220F4B2B
-S315080036A81C6924F440741C61196911431961196964
-S315080036B821F0F80119611A6942EAC00242F00202C9
-S315080036C81A611A6942F480321A61BFF34F8F5DF89E
-S315080036D8044B70474FF48072E1E700BF003C024094
-S315080036E8214B1B7D012B3CD070B50E4604461E4B5C
-S315080036F801221A754CF25030FEF7D0FB014658BB2A
-S315080037084FF0FF3333602368012B16D06568A3682A
-S3150800371862681344AB421FD9217B2846FFF7B2FFDC
-S315080037284CF25030FEF7BAFB104A136923F07A03B5
-S315080037381361014678B90135E9E7207BFFF78EFF63
-S315080037484CF25030FEF7AAFB0146084A136923F0E3
-S315080037580403136100E03560034B00221A75084616
-S3150800376870BD022108467047600E0020003C0240E2
-S3150800377830B40468606A29B940EA0240A0620020A9
-S3150800378830BC70470D46A36A00EB13400023691E38
-S315080037988B4209D203F1400104EB8101496800EB29
-S315080037A811400133DBB2F2E740EA024005F13F0176
-S315080037B804EB81014860E2E7036859620020704714
-S315080037C8024603680121C0F8FC13002082F8F403B6
-S315080037D89A6942F000629A61596D024A0A435A6523
-S315080037E8704700BF030000107047000012230B80C3
-S315080037F8004870475404002004230B80004870478B
-S31508003808680400200023934216D230B40BE03734FC
-S3150800381801F8134000015C00013400250D550133F9
-S31508003828DBB2934206D2040F092CF0D8303401F8DB
-S315080038381340EFE730BC70477047000038B50A4BAD
-S31508003848186804331C6804331B68C01800D138BDCF
-S31508003858064D0822A91CFFF7D5FF042205F1120117
-S315080038682046FFF7CFFFF2E720F4F01F6C0400208C
-S3150800387808B51A230B80FFF7E1FF014808BD00BF0A
-S315080038886C04002008B50A4628B905490548FDF715
-S3150800389808F9034808BD02490248FDF702F9F8E79E
-S315080038A87C0E0020E851000810B5044C0A4621464B
-S315080038B80348FDF7F6F8204610BD00BF7C0E002029
-S315080038C8D851000808B50A4628B905490548FDF734
-S315080038D8E8F8034808BD02490248FDF7E2F8F8E7A0
-S315080038E87C0E0020B851000808B50A4628B90549CB
-S315080038F80548FDF7D6F8034808BD02490248FDF70A
-S31508003908D0F8F8E77C0E0020C0510008014B188053
-S31508003918704700BF0A05002008B500F097FE0E4B51
-S315080039281B6898420FD30D4B1B786BB90B4B0122BA
-S315080039381A700B4B80229A6100F088FE094B1B8887
-S315080039481844054B186008BD044B00221A70044B2E
-S315080039584FF400029A61EFE7100500200C050020D5
-S31508003968000402400A050020024B4FF400029A613F
-S31508003978704700BF0004024008B5054B1B6913F4DD
-S31508003988005F01D0002008BDFFF7EEFF0120FAE727
-S315080039980008024008B56420FFF7B8FF08BD08B557
-S315080039A8FFF7BAFF08BD70477047704708B5304A31
-S315080039B8136823F00F0343F007031360136803F033
-S315080039C80F03072B4ED12B4B1A6842F440421A6054
-S315080039D81A6842F480321A6003F5E4331A6842F426
-S315080039E880221A601A6842F480321A60224B1B68D1
-S315080039F813F4003FFAD0204B5A6820491140204A50
-S31508003A080A435A605A681F4911401F4A0A435A60AE
-S31508003A181A6842F080721A60174B1B6813F0007F09
-S31508003A28FAD0154B9A6822F0F0029A609A6822F43E
-S31508003A38E05242F4A0529A609A6822F4604242F42C
-S31508003A4800429A609A6822F0030242F002029A60DB
-S31508003A58094B9B6803F00C03082BF9D10B48FEF7B2
-S31508003A6825FD08BD6A210A4800F0C0FAABE700BF81
-S31508003A78003C024000700040003802400080BCFF4D
-S31508003A88086C40000080BFF0086C400900E6DF0CAF
-S31508003A98FC51000808B5FDF7EFF9FFF787FF08BDE1
-S31508003AA808B5FFF7F7FF00F0ADFA00F0B9FAFCE73A
-S31508003AB82DE9F04391B04C4C636C43F4804363643E
-S31508003AC8636C03F480430993099B236C43F0805382
-S31508003AD82364236C03F080530893089B236B43F0F5
-S31508003AE801032363236B03F001030793079B236BE7
-S31508003AF843F002032363236B03F002030693069B32
-S31508003B08236B43F004032363236B03F00403059331
-S31508003B18059B236B43F008032363236B03F0080311
-S31508003B280493049B236C43F480232364236C03F4D3
-S31508003B3880230393039B236C43F000732364236C4D
-S31508003B4803F000730293029B80230A9301230B93C5
-S31508003B5800250C950D950E95DFF89C800AA9404618
-S31508003B68FEF756F84FF40003C8F818304FF4005318
-S31508003B780A930B950E950AA91C48FEF749F84FF4BF
-S31508003B884079CDF8289002270B9703260C960D95B1
-S31508003B980E9507230F930AA91548FEF739F8CDF8A5
-S31508003BA828900B970C960D950E9509230F930AA93D
-S31508003BB84046FEF72DF84FF4C0530A930B970C9618
-S31508003BC80D950E950A230F930AA90A48FEF720F8B9
-S31508003BD8636B43F080036363636B03F080030193AD
-S31508003BE8019B11B0BDE8F083003802400008024086
-S31508003BF8000C0240000002400004024010B5FEF71F
-S31508003C08EFFC1B4C4FF40003A3611A48FDF742FF6B
-S31508003C181948FDF73FFF2046FDF73CFF1748FDF713
-S31508003C2839FF174B5A6B22F080025A631A6C22F036
-S31508003C3800721A641A6C22F480221A641A6B22F02B
-S31508003C4808021A631A6B22F004021A631A6B22F026
-S31508003C5802021A631A6B22F001021A631A6C22F01E
-S31508003C6880521A645A6C22F480425A6410BD00BF06
-S31508003C7800040240000C024000080240000002400E
-S31508003C88003802402023038000487047C0040020FB
-S31508003C980A23038000487047E004002008B590F816
-S31508003CA89C32032B01D0002008BD01F0E3F9FAE79E
-S31508003CB808B501F0DFF9002008BD08B5084601F087
-S31508003CC80DFA002008BD000008B50B7813F0600F40
-S31508003CD806D14B780A2B14D00B2B17D0062B01D0FC
-S31508003CE8002008BD4B881B0A212B04D00B49172234
-S31508003CF8FCF745FBF4E7CA88172A28BF172208499C
-S31508003D08F6E701220749FCF73AFBE9E78B7813B986
-S31508003D18044A1360E4E7FCF78CFBE1E7C9040020D2
-S31508003D28D20400201405002010B50446812100F0AD
-S31508003D382DF90121204600F029F9002010BD0000C0
-S31508003D4810B5044640230222812100F014F94023C5
-S31508003D5802220121204600F00EF94023034A0121D8
-S31508003D68204600F03BF9002010BD00BF7C1000205B
-S31508003D78004870477C10002008B500F57171D0F826
-S31508003D880004FCF70BFF08BD08B5C1EBC102930098
-S31508003D980344D3F80822D0F80004FCF72CFF08BD22
-S31508003DA808B5C1EBC102930003449A6CD0F8000425
-S31508003DB8FCF75BFF08BD08B5D0F80004FCF7F1FF6F
-S31508003DC808BD000010B50446C3684BB1022B01D1E3
-S31508003DD8012106E09121074800F008F9012100E0D1
-S31508003DE80021D4F80004FCF7C5FFD4F80004FCF752
-S31508003DF898FF10BD0452000810B50446D0F8000410
-S31508003E08FCF7BBFF2268D2F8003E43F00103C2F86C
-S31508003E18003E236A23B1044A136943F00603136173
-S31508003E28FFF7C2FD10BD00BF00ED00E010B504465F
-S31508003E38FFF7BBFDD4F80004FCF7A8FF10BD08B5CA
-S31508003E48D0F80004FCF7BDFF08BD08B5D0F8000493
-S31508003E58FCF7B5FF08BD10B504460120FFF7A3FD1A
-S31508003E68D4F80004FCF7AFFF10BD10B504460020CF
-S31508003E78FFF799FDD4F80004FCF7A7FF10BD00006A
-S31508003E8803780BB10020704710B503461748C0F8E9
-S31508003E980034C3F8C4024FF0A04303600623436006
-S31508003EA80222C2600023036182610122C2610362A1
-S31508003EB84362C3620363FDF769F880B90B4C802136
-S31508003EC82046FFF779FC402200212046FFF750FCE0
-S31508003ED8802201212046FFF74BFC002010BD40F246
-S31508003EE82511034800F082F8E8E700BFBC10002057
-S31508003EF804520008D0F8C43211F0800F08D101F036
-S31508003F087F01C1EBC1018A00134493F8FE0170478B
-S31508003F1801F07F01C1EBC1018A00134493F83E0002
-S31508003F28704708B5D0F8C402FDF708FD08BD022891
-S31508003F3807D8DFE800F002060400002070470120D1
-S31508003F4870470320704708B5D0F8C402FDF7ECF8A7
-S31508003F58FFF7EDFF08BD08B5D0F8C402FDF7AFF8BE
-S31508003F68FFF7E5FF08BD08B5D0F8C402FDF7BCF8A9
-S31508003F78FFF7DDFF08BD10B51C4613462246D0F8E4
-S31508003F88C402FDF737FCFFF7D2FF10BD08B5D0F815
-S31508003F98C402FDF76FFCFFF7CAFF08BD08B5D0F8DD
-S31508003FA8C402FDF7FEFCFFF7C2FF08BD08B5D0F846
-S31508003FB8C402FDF737FDFFF7BAFF08BD08B5D0F804
-S31508003FC8C402FDF703FCFFF7B2FF08BD08B5D0F831
-S31508003FD8C402FDF7BCFCFFF7AAFF08BD08B5D0F870
-S31508003FE8C402FDF77DFCFFF7A2FF08BD08B500F07F
-S31508003FF805F8FCE708B5FFF7CDFC08BD08B5FFF7D7
-S31508004008CEFC08BD08B500F07BFEFFF7F3FF00F00D
-S31508004018FBFA01F08FF800F057F800F049F808BDE8
-S3150800402808B5FFF7EBFF00F003FB00F061F800F0B6
-S3150800403801F808BD08B500F0DFF8012803D00B4BD6
-S315080040481B78012B00D008BD00F000FB084B1B6845
-S31508004058084A1268134403F5FA739842F3D3034BD4
-S3150800406800221A7000F050FEEDE700BF1C0500207C
-S315080040781805002020050020014B1860704700BF6E
-S3150800408818050020014B1868704700BF180500205E
-S3150800409808B5054B1B78012B00D008BD00F0D6FAE9
-S315080040A8024B1860F9E700BF1C0500202005002010
-S315080040B808B5044B01221A70FFF7EAFFFFF7BAFFA3
-S315080040C808BD00BF1C05002010B500F005FA00F071
-S315080040D8B7FB064C0123237000F0EAFA0023237085
-S315080040E800F0FEFE0223237010BD00BFEA0400207C
-S315080040F800B583B00DF10701184800F01DFC01282A
-S3150800410810D00DF10701154800F008FB012812D058
-S315080041180DF10701114800F061FF012814D003B01A
-S315080041285DF804FB0E4B01221A709DF807100B4820
-S3150800413800F0F2F9E5E70A4B00221A709DF8071015
-S31508004148064800F0E9F9E3E7054B02221A709DF8DC
-S315080041580710024800F0E0F9E1E700BF240500204F
-S31508004168EA04002008B500F0FFFE08BD38B5044685
-S315080041780D460E4B1B78012B09D00C4B1B7853B1F7
-S315080041880A4B1B78022B0BD000F0BEF938BDC9B212
-S3150800419800F0ACFBF1E7E9B2204600F0A3FAEFE736
-S315080041A8E9B2204600F0F0FEEEE700BFEA04002078
-S315080041B8074B1B78022B05D0032B05D0012B05D0FE
-S315080041C8402070473F2070470020704708207047F6
-S315080041D8EA040020074B1B78022B05D0032B05D0D1
-S315080041E8012B05D0402070473F20704700207047B4
-S315080041F808207047EA04002008B500F07BF9034652
-S3150800420800B10123184608BD014B00225A707047B1
-S3150800421864050020034BFE22DA7018710222A3F8FF
-S31508004228442070476405002010B5054C0023237008
-S31508004238FFF7EAFFFF23E3700123A4F8443010BD13
-S3150800424864050020064BFF22DA7000221A71597895
-S3150800425859719A71DA711A720622A3F844207047BE
-S315080042686405002008B50020FFF7D4FF08BD000044
-S31508004278074BFF22DA70074A9A6400221A715A71A4
-S315080042889A710722C3F807200822A3F84420704722
-S315080042986405002010520008044BFF22DA704268B1
-S315080042A89A640122A3F84420704700BF64050020D9
-S315080042B808B53120FFF7AEFF08BD000038B5084C31
-S315080042C8FF23E370002525716571FFF771FFA0715B
-S315080042D8E571257265720723A4F8443038BD00BF16
-S315080042E86405002038B5FFF78FFF0E4C01252570A9
-S315080042F8FF23E3701023237100236371FFF758FF28
-S31508004308A071FFF767FFE071FFF764FFC0F30720A6
-S3150800431820726572A5720823A4F8443000F00AFFD3
-S3150800432838BD00BF6405002038B50546FFF740FFCD
-S315080043386A7890420FD90A4CA16C201D00F004FD3A
-S31508004348FF23E3706A78A36C1344A3646B7801337C
-S31508004358A4F8443038BD2220FFF75CFFFAE700BF0F
-S315080043686405002038B50446FFF722FF63789842AB
-S3150800437811D961680A4DA9646278281D00F0E4FC21
-S31508004388FF23EB706278AB6C1344AB646378013334
-S31508004398A5F8443038BD2220FFF73CFFFAE700BFEE
-S315080043A864050020F8B50546174600244E1E39B19F
-S315080043B815F8013B1C44E4B2FFF720FE3146F5E741
-S315080043C83C600120F8BD000010B5084CFF23E370D7
-S315080043D8E21D4168A06CFFF7E5FF207100236371B1
-S315080043E8A3710823A4F8443010BD00BF6405002053
-S315080043F838B505460D4B9C6CFFF7DAFE6A1C411E5C
-S31508004408204600F09BFE60B1084CFF23E370FFF7D7
-S31508004418CFFE0138A36C0344A3640123A4F84430EF
-S3150800442838BD3120FFF7F6FEFAE700BF640500201D
-S3150800443810B50446FFF7BCFE01386378984213DDC9
-S31508004448114BFF22DA700122A3F84420617879B16A
-S31508004458A21C0D4B986C00F071FE88B161780A4A67
-S31508004468936C0B44936410BD2220FFF7D3FEFAE73A
-S3150800447800F074FE0028F6D13120FFF7CBFEF2E7EC
-S315080044883120FFF7C7FEEEE76405002008B5416846
-S31508004498074B986C00F056FE30B1054BFF22DA70D0
-S315080044A80122A3F8442008BD3120FFF7B3FEFAE736
-S315080044B86405002008B500F027FC034BFF22DA70D4
-S315080044C80122A3F8442008BD6405002008B589B26E
-S315080044D8FFF74CFE08BD0000054B00221A709A64C7
-S315080044E883F84320A3F844209A705A70704700BF8F
-S315080044F864050020034B1B780BB101207047002088
-S31508004508704700BF64050020024B002283F8432049
-S31508004518704700BF6405002008B50378FF2B23D031
-S31508004528354A1278012A2BD1C93B352B53D8DFE8EF
-S3150800453803F04052524F52524C4349465252525235
-S315080045485252525252525252525252525252525235
-S31508004558525252525252525252525252312B282EBB
-S315080045685252523452373A3DFFF7BCFE224B93F863
-S315080045784330012B33D0204BB3F94410002932DCE1
-S3150800458808BDFFF7D1FEF1E7FFF7ECFEEEE7FFF708
-S3150800459883FEEBE7FFF718FFE8E7FFF769FEE5E7AD
-S315080045A8FFF760FEE2E7FFF74DFEDFE7FFF73CFEA1
-S315080045B8DCE7FFF71DFFD9E7FFF73AFFD6E7FFF76E
-S315080045C87DFED3E7FFF762FFD0E7FFF773FFCDE776
-S315080045D8FFF76EFECAE72020FFF71CFEC6E7102085
-S315080045E8FFF718FEC7E71846012380F8433003305B
-S315080045F8FFF76CFFC4E700BF64050020014B0022E3
-S315080046081A60704710E000E008B5FFF7F7FF054B9A
-S31508004618054A5A6000229A6005211960034B1A60F8
-S3150800462808BD00BF10E000E0BF4B0300B00500203E
-S31508004638044B1B6813F4803F03D0034A13680133FD
-S315080046481360704710E000E0B005002008B5FFF7D2
-S31508004658EFFF014B186808BDB005002008B5FFF73D
-S31508004668F5FF08BD70470000054BDB6913F0200FFE
-S3150800467804D0034B5B6A037001207047002070471B
-S315080046880048004010B5094B9862FFF7DFFF00F1B4
-S315080046980A04064BDB6913F0800F05D1FFF7AEFC59
-S315080046A8FFF7D4FFA042F4D910BD00BF0048004068
-S315080046B810B588B04FF4614301930023029303931E
-S315080046C804930C22059206930793054C01A92046E4
-S315080046D8FDF7F2FE236843F00103236008B010BD16
-S315080046E80048004070B506460D4640290ED82846AB
-S315080046F8FFF7C8FF0024ABB2A3420CD9FFF77EFC2C
-S31508004708305DFFF7BFFF0134A4B2F4E78121024800
-S31508004718FFF76CFCEBE770BD1852000870B5254B1F
-S315080047281C78BCB92448FFF79FFF012801D020460A
-S3150800473870BD214B1B78013BDBB23F2BF7D8FFF73F
-S3150800474885FF1E4B18601E4B00221A70194B012252
-S315080047581A70ECE706460D46194B1B7801331648BE
-S315080047681844FFF781FF0446012815D1144B1A7817
-S315080047780132D2B21A70104B1B789A4201D0002423
-S31508004788D5E71049304600F0DFFA0A4B00221A70BE
-S315080047980B4B1B782B70CAE7FFF758FF074B1B68AC
-S315080047A86433984203D90024024B1C70BFE70024DF
-S315080047B8BDE700BFF5050020B4050020F805002070
-S315080047C8F6050020B50500202DE9F04184B0044619
-S315080047D80D46174698466846FDF7AAFF0299164BEE
-S315080047E8A3FB01318909002201E00132D2B2112A5C
-S315080047F81DD8124B13F8120003EB420393F801C0B5
-S3150800480800EB0C0303FB0443B1FBF3FE03FB1E1684
-S31508004818002EEAD11FFA8EF32B80013B9BB2B3F523
-S31508004828806FE2D2387088F800C0012000E00020C6
-S3150800483804B0BDE8F08100BFD34D62106852000885
-S3150800484870B58CB00023ADF82E308DF82D308DF864
-S315080048582C300BAB0DF12D020DF12E014FF4FA7029
-S31508004868FFF7B2FF002835D01D4C1E4B23600025E4
-S3150800487825766576A5760126E67625776577A56091
-S31508004888E5609DF82D30013B1B0423619DF82C300B
-S31508004898013B1B056361BDF82E3063602046FDF7B2
-S315080048A878FB0695079508964CF6E043019302951A
-S315080048B84FF6E073039304230493059509960E238C
-S315080048C80A9301A92046FDF70BFC2046FDF79EFC36
-S315080048D80CB070BDB5210448FFF788FBC4E700BFD4
-S315080048E8FC050020006400404052000810B588B056
-S315080048F840F2E1730293002304930593069101ABF2
-S31508004908024602A90B48FDF7AFFC08B108B010BD6E
-S31508004918FFF79CFE00F1320401990648FDF71AFDD7
-S315080049280028F3D0FFF76AFBFFF790FEA042F3D9F9
-S31508004938ECE700BFFC05002010B588B00C46034616
-S3150800494801AA00210A48FDF717FD60B9019A40F245
-S3150800495867639A4201D0002006E0039B33B9059B9A
-S315080049682370012000E0002008B010BD0020FBE7F6
-S31508004978FC05002038B50546002401E00134E4B2F8
-S31508004988062C15D8FFF73AFB04EB44029300094AAC
-S31508004998D358AB42F2D804EB44029100054A0A44BC
-S315080049A852681344AB42E9D9024B0B44187A00E023
-S315080049B8FF2038BD8C52000808B5C1F3080353B95F
-S315080049C803688B4209D040F8041B4FF4007200F0C4
-S315080049D8BBF9012008BD0020FCE70120FAE72DE90C
-S315080049E8F0410746FDF738FA002400E001347F2C29
-S315080049F814D83E68A30006EB03083B445D68FFF736
-S31508004A08FDFA2A46002341460220FDF779FA38B905
-S31508004A1856F82430AB42E9D0002402E0012400E02D
-S31508004A280024FDF731FA2046BDE8F08138B50D4671
-S31508004A380C4B984211D004460B4B994207D1094CA6
-S31508004A4829462046FFF7B8FF48B1204638BDFFF784
-S31508004A58C6FF0028F4D10024F7E7044CF0E7002441
-S31508004A68F3E700BF28080020008000082406002075
-S31508004A782DE9F04106460C4617461D46DFF87480B0
-S31508004A8801EA08080368B3F1FF3F07D033684345CE
-S31508004A980BD13368E41A3444043415E04146FFF769
-S31508004AA88BFF03460028F1D11FE041463046FFF741
-S31508004AB8BDFF06460028ECD1002316E017F8013B8F
-S31508004AC804F8013B013D0FD0FFF798FA331DE31AA6
-S31508004AD8B3F5007FF2D308F500713046FFF7A6FF55
-S31508004AE8064628B1041DE9E701231846BDE8F08102
-S31508004AF80023FAE700FEFFFF70B586B004460E46A7
-S31508004B0800230193884219D80125ECB1072E1FD82E
-S31508004B18DDB1002302930223059301230493FDF7CD
-S31508004B289BF9B4420DD8FFF769FA039401A902A8BC
-S31508004B38FEF7D6FD20B90134E4B2F2E70025E4E72A
-S31508004B480025FDF7A1F900E00025284606B070BD46
-S31508004B580025FAE74FF0FF33024A1360024A13604A
-S31508004B68704700BF240600202808002070B54B1E91
-S31508004B78134C241AA34201D9002070BD16460D46C7
-S31508004B880446FFF7F7FEFF2811D028190138FFF762
-S31508004B98F1FEFF280BD00B4B23400B4A934208D053
-S31508004BA82B46324621460948FFF762FFE5E700200B
-S31508004BB8E3E72B46324621460548FFF759FFDCE767
-S31508004BC8FFFF0F0800FEFFFF0080000824060020EC
-S31508004BD8280800204A1E0D4B1B1A9A4201D90020A4
-S31508004BE8704770B50C460546FFF7C4FE06466019B9
-S31508004BF80138FFF7BFFEFF2818BFFF2E01D1002096
-S31508004C0870BD01463046FFF777FFF9E7FFFF0F0843
-S31508004C18104B1B68B3F1FF3F19D000B583B00D4A96
-S31508004C28536891680B44D1680B4411690B44516960
-S31508004C380B4491690B44D26913445B42019301AA58
-S31508004C4804210548FFF792FF03B05DF804FB01202D
-S31508004C58704700BF28080020C88100080D4B1B684C
-S31508004C680D4A12681A440D4B1B6813440C4A1268FD
-S31508004C7813440C4A12681A440B4B1B681A440B4B0C
-S31508004C881B6813440A4A1268DA4201D000207047A2
-S31508004C980120704700800008048000080880000882
-S31508004CA80C80000810800008148000081880000886
-S31508004CB8C881000808B50E4B1B68B3F1FF3F07D13A
-S31508004CC80C4B1B68B3F1FF3F09D10123184608BDF1
-S31508004CD80748FFF784FE03460028F1D1F6E705489A
-S31508004CE8FFF77DFE03460028F0D00123EEE700BF54
-S31508004CF8280800202406002000487047008000087D
-S31508004D0808B500F036FA08BD10B500F01FFA00B964
-S31508004D1810BDFEF731FE0028FAD0FFF723FAFFF791
-S31508004D286DFCFCF76DF800F015FA054B0340054ACB
-S31508004D38936000F00FFA446800F01DFAA047E7E709
-S31508004D4880FFFF1F00ED00E070B50D460446531EB0
-S31508004D589EB23AB115F8013B04F8013BFFF74EF944
-S31508004D683246F4E770BD0000094B03F1180100222A
-S31508004D7832B19A7400225A61064B054A1A6070477E
-S31508004D889A745961183318310132D2B2F0E700BF64
-S31508004D986C0A00209C0A00200A4B1B6883B110B4D1
-S31508004DA85C69084A146019749860D86000225A74B5
-S31508004DB81860013908445860987C5DF8044B7047B8
-S31508004DC8FF2070479C0A002038B504460D4601287E
-S31508004DD81CD862002244D100114B0B445A7C1B7C18
-S31508004DE89A4219D00E4B0B44DA6815705A7C013270
-S31508004DF85A74DA680132DA605B689A420ED9084A48
-S31508004E08084651580244D160012038BD4FF4E07174
-S31508004E180448FFF7EBF8DCE70020F6E70120F4E79B
-S31508004E286C0A0020E052000808B50146024B1878BB
-S31508004E38FFF7CAFF08BD00BFA00A002038B5044618
-S31508004E480D4601281ED804EB4403DA00124B134416
-S31508004E585B7CEBB162002244D1000F4B0B449A6885
-S31508004E6812782A705A7C013A5A749A6801329A60FA
-S31508004E785B689A420ED9084A084651580244916016
-S31508004E88012006E04FF4F1710448FFF7AFF8DAE7B6
-S31508004E98002038BD0120FCE76C0A0020E052000813
-S31508004EA808B50146024B1878FFF7C8FF08BD00BFCA
-S31508004EB8E40A002010B50446012806D804EB440481
-S31508004EC8E200054B1344587C10BD40F20221034802
-S31508004ED8FFF78CF8F2E700BF6C0A0020E0520008DA
-S31508004EE838B5FFF741FF1A4C4021601CFFF754FFFD
-S31508004EF82070184D4021681CFFF74EFF287023784C
-S31508004F08FF2B1BD0FF2819D0134C00221349204623
-S31508004F18FBF7E2FD12492046FBF717FE0120FEF7CC
-S31508004F2842FD2046FBF725FED4F8C402FCF72AFC06
-S31508004F38FFF7A8F8B0F5FA6F05D338BD85210948F3
-S31508004F48FFF754F8E0E74FF4FA60FFF795F8F4E747
-S31508004F58A00A0020E40A0020280B002038040020B4
-S31508004F6888040020E052000810B5064CD4F8C4029C
-S31508004F78FCF71AFC2046FBF7CBFD0020FEF713FDCD
-S31508004F8810BD00BF280B002070B506460D463F2900
-S31508004F9806D82846FFF748FF012806D100240FE05F
-S31508004FA8B9210D48FFF722F8F3E7BD210A48FFF7AC
-S31508004FB81DF8F3E7C6210848FFF718F80134A4B224
-S31508004FC8ABB2A34207D9FFF719F8305DFFF72CFFF4
-S31508004FD80128F3D0EEE770BDE052000870B5064622
-S31508004FE80D461F4BD3F8C402FCF758F91D4B1C781D
-S31508004FF89CB91D48FFF754FF012801D0204670BD0B
-S31508005008194B1B78013BDBB23E2BF7D8154B01220F
-S315080050181A70164B00221A70F0E7144B1B780133E6
-S3150800502811481844FFF73CFF0446012801D000241C
-S31508005038E4E70E4B1A780132D2B21A700A4B1B787B
-S315080050489A4201D00024D9E709493046FFF77CFE81
-S31508005058044B00221A70054B1B782B70CEE700BF4D
-S31508005068280B0020380E0020F80D0020390E0020E5
-S31508005078F90D002030B583B0144B1878FFF71AFFDE
-S3150800508808B30546402800D9402500240AE04FF40D
-S31508005098A3710F48FEF7AAFF9DF807200D4B1A556E
-S315080050A80134E4B2A54208D90DF10701074B18786F
-S315080050B8FFF7C4FE0128EFD0E9E72B46054A812108
-S315080050C80548FEF783FF03B030BD00BFA00A0020DD
-S315080050D8E05200082C0A0020280B002070B5044668
-S315080050E8FEF746FE064621460F48FEF71AFF85B222
-S315080050F8002406E04FF4B4710C48FEF777FF013434
-S31508005108A4B2AC4207D2315D094B1878FFF75CFEAA
-S315080051180128F4D0EEE7FEF72BFE402302460121CC
-S315080051280148FEF75BFF70BD280B0020E052000817
-S31508005138E40A002008B5FFF70DFD08BD08B5FFF716
-S3150800514815FD08BD08B5FFF745FD08BD08B5FFF705
-S3150800515885FD08BD08B5FFF7CFFD08BD08B5FFF7FB
-S3150800516857FD034608B9184608BDFFF7A3FD0346C9
-S31508005178F9E772B6704762B670470000F8B500BF1F
-S31508005188F8BC08BC9E467047F8B500BFF8BC08BC12
-S309080051989E4670476A
-S3150800519C00000020000000000000000001020304CB
-S315080051AC060708090000000001020304446566614D
-S315080051BC756C740057696E5553422042756C6B209A
-S315080051CC496E746572666163650000004F70656EA2
-S315080051DC424C5420557365720000000057696E5591
-S315080051EC53422042756C6B204465766963650000F2
-S315080051FC6D61696E2E630000757362645F636F6E12
-S3150800520C662E63004F70656E424C54002E2E2F2E60
-S3150800521C2E2F2E2E2F536F757263652F41524D43C9
-S3150800522C4D375F53544D333246372F727332333200
-S3150800523C2E6300002E2E2F2E2E2F2E2E2F536F75EB
-S3150800524C7263652F41524D434D375F53544D33327C
-S3150800525C46372F63616E2E630000000005020602B6
-S3150800526C060307030803090309040A040B040C04C0
-S3150800527C0C050D050E050F050F0610061007100870
-S3150800528C00800008008000000100000000000108F2
-S3150800529C0080000002000000008001080080000069
-S315080052AC03000000000002080000020004000000D1
-S315080052BC00000408000004000500000000000808AF
-S315080052CC000004000600000000000C0800000400A2
-S315080052DC070000002E2E2F2E2E2F2E2E2F536F75D5
-S315080052EC7263652F41524D434D375F53544D3332DC
-S311080052FC46372F7573622E630000000011
-S30D0800530851020008ED0100083E
-S30908005310C9010008B9
-S3150800531400000000EC02002054030020BC03002017
-S31508005324000000000000000000000000000000006B
-S31508005334000000000000000000000000000000005B
-S31508005344000000000000000000000000000000004B
-S31508005354000000000000000000000000000000003B
-S31508005364000000000000000000000000000000002B
-S31508005374000000000000000000000000000000001B
-S31508005384000000000000000000000000000000000B
-S3150800539400000000000000000000000000000000FB
-S315080053A400000000000000000000000000000000EB
-S315080053B400000000000000000100000000000000DA
-S315080053C40E33CDAB34126DE6ECDE05000B0000009F
-S315080053D400000000000000000000000000000000BB
-S315080053E400000000000000000000000000000000AB
-S315080053F4000000000000000000000000000000009B
-S31508005404000000000000000000000000000000008A
-S31508005414000000000000000000000000000000007A
-S31508005424000000000000000000000000000000006A
-S31508005434000000000000000000000000000000005A
-S31508005444000000000000000000000000000000004A
-S31508005454000000000000000000000000000000003A
-S31508005464000000000000000000000000000000002A
-S31508005474000000000000000000000000000000001A
-S31508005484000000000000000000000000000000000A
-S3150800549400000000000000000000000000000000FA
-S315080054A400000000000000000000000000000000EA
-S315080054B400000000000000000000000000000000DA
-S315080054C400000000000000000000000000000000CA
-S315080054D400000000000000000000000000000000BA
-S315080054E400000000000000000000000000000000AA
-S315080054F4000000000000000000000000000000009A
-S315080055040000000000000000000000000000000089
-S315080055140000000000000000000000000000000079
-S315080055240000000000000000000000000000000069
-S315080055340000000000000000000000000000000059
-S315080055440000000000000000000000000000000049
-S315080055540000000000000000000000000000000039
-S315080055640000000000000000000000000000000029
-S315080055740000000000000000000000000000000019
-S315080055840000000000000000000000000000000009
-S3150800559400000000000000000000000000000000F9
-S315080055A400000000000000000000000000000000E9
-S315080055B400000000000000000000000000000000D9
-S315080055C400000000000000000000000000000000C9
-S315080055D400000000000000000000000000000000B9
-S315080055E400000000000000000000000000000000A9
-S315080055F40000000000000000000000000000000099
-S315080056040000000000000000000000000000000088
-S315080056140000000000000000000000000000000078
-S315080056240000000000000000000000000000000068
-S315080056340000000000000000000000000000000058
-S315080056440000000000000000000000000000000048
-S315080056540000000000000000000000000000000038
-S315080056640000000000000000000000000000000028
-S315080056740000000000000000000000000000000018
-S315080056840000000000000000000000000000000008
-S3150800569400000000000000000000000000000000F8
-S315080056A400000000000000000000000000000000E8
-S315080056B400000000000000000000000000000000D8
-S315080056C400000000000000000000000000000000C8
-S315080056D400000000000000000000000000000000B8
-S315080056E400000000000000000000000000000000A8
-S315080056F40000000000000000000000000000000098
-S315080057040000000000000000000000000000000087
-S315080057140000000000000000000000000000000077
-S315080057240000000000000000000000000000000067
-S3150800573400000000000000003C0E00200024F400D5
-S315080057440100000010000000F537000801380008C1
-S31508005754B13800088D38000879380008CD380008B3
-S31508005764F13800081201000200000040501DAC6028
-S315080057740002010203010000040309041A030000DD
-S315080057840000000000000000000000000000000007
-S315080057940000000000000000493D0008313D0008F3
-S315080057A4D13C00080000000000000000B93C0008D5
-S315080057B4C33C0008A53C00080000000000000000E7
-S315080057C4000000008D3C000800000000993C000819
-S315080057D409022000010100C0320904000002FF008A
-S315080057E40000070581024000FF070501024000FF8B
-S311080057F40A060002000000400100040044
-S70508000335BA
+S315080001D800800123237010BD88010020000000005C
+S315080001E8F051000808B5034B1BB103490348AFF3A0
+S315080001F8008008BD000000008C010020F0510008AE
+S31508000208DFF834D0002103E00C4B5B584350043127
+S315080002180B480C4B42189A42F6D30B4A02E00023C5
+S3150800022842F8043B094B9A42F9D300F023FD04F03F
+S31508000238B7FF03F0A7FB704700000520A053000886
+S31508000248000000208801002088010020FC110020F9
+S31508000258FEE708B513460222C0F894228361C361F3
+S315080002680A46002103F034FE002008BD08B51346E7
+S315080002780A46002103F02CFE002008BD08B51346DF
+S315080002880A46002103F02CFE002008BD08B5042301
+S31508000298C0F8943200231A46194603F019FE0020BE
+S315080002A808BD08B50523C0F8943200231A4619462E
+S315080002B803F016FE002008BD0346002002E00130C0
+S315080002C8C0B201331A78002AF9D1704708B54B88A5
+S315080002D8012B00D008BDC0F8A432FFF7D7FFF9E70D
+S315080002E80B7803704B7843708B78CA7843EA0223F5
+S315080002F843800B794A7943EA022383808B79CA7942
+S3150800030843EA0223C380704710B50446802103F0E8
+S31508000318C7FD0021204603F0C3FD10BD30B583B0E4
+S3150800032804460D460023ADF806304A88130A013BF1
+S315080003380E2B00F2BC80DFE803F0153044BABA9EEB
+S31508000348ABBABABABABABABA0800D0F8B432DB69DC
+S3150800035823B10DF10601007C98470AE02946FFF704
+S31508000368D3FF18E0D0F8B4321B680DF10601007CFB
+S315080003789847EA88002A00F0A380BDF80630002BC3
+S3150800038800F099809A4228BF1A46ADF80620014619
+S315080003982046FFF75EFF03B030BD037C43B9D0F8AB
+S315080003A8B8329B6A0DF10600984702234370E0E7C6
+S315080003B8D0F8B832DB6A0DF1060098470223437075
+S315080003C8D7E7D2B2052A52D8DFE802F003101D2A69
+S315080003D83744D0F8B4325B6823B10DF10601007CC6
+S315080003E89847C6E72946FFF78FFFD4E7D0F8B4320F
+S315080003F89B6823B10DF10601007C9847B9E72946A1
+S31508000408FFF782FFC7E7D0F8B432DB6823B10DF1EE
+S315080004180601007C9847ACE72946FFF775FFBAE757
+S31508000428D0F8B4321B6923B10DF10601007C984750
+S315080004389FE72946FFF768FFADE7D0F8B4325B694E
+S3150800044823B10DF10601007C984792E72946FFF784
+S315080004585BFFA0E7D0F8B4329B6923B10DF106011A
+S31508000468007C984785E72946FFF74EFF93E7294614
+S31508000478FFF74AFF8FE7037C33B9D0F8B8325B6BCE
+S315080004880DF10600984774E72946FFF73DFF82E70E
+S31508000498037C43B9D0F8B8321B6B0DF106009847B0
+S315080004A80723437065E72946FFF72EFF73E72946B2
+S315080004B8FFF72AFF6FE729462046FFF725FF6AE771
+S315080004C82046FFF7E3FE66E738B504468B88F3B996
+S315080004D8CB88E3B94B887F2B19D803F07F0590F8AA
+S315080004E89C32032B0CD080F89E52294603F0E8FC70
+S315080004F82046FFF7CBFE35B1022384F89C3209E083
+S31508000508FFF702FF06E0012384F89C3202E0204642
+S31508000518FFF7FAFE38BD000070B504460E468D781A
+S315080005282D4B1D70012D0FD890F89C32022B0FD039
+S31508000538032B23D0FFF7E8FE274B1978204600F04F
+S3150800054870FA0325284670BDFFF7DEFE0325F9E78E
+S315080005588DB14560294600F05BFA054620B131465B
+S315080005682046FFF7D1FEEDE72046FFF78FFE032367
+S3150800057884F89C32E6E7FFF789FEE3E7CDB14168E0
+S315080005888D4225D0C9B200F04CFA134B1978616030
+S31508000598204600F03DFA0546B0B131462046FFF739
+S315080005A8B3FE2179204600F03CFA022384F89C32EF
+S315080005B8C8E7022380F89C324560294600F031FADC
+S315080005C82046FFF763FEBDE72046FFF75FFEB9E75B
+S315080005D8FFF75CFE0025B5E7A401002008B5CB881F
+S315080005E8012B0AD190F89C32022B09D9032B09D181
+S315080005F80122011DFFF72DFE01E0FFF785FE08BD64
+S315080006085BB213B9FFF780FEF9E70146002341F804
+S31508000618083F0122FFF71DFEF1E708B590F89C325E
+S31508000628013B022B12D8CB88022B0CD10123C360BD
+S31508000638D0F8A4320BB10323C360022200F10C01DF
+S31508000648FFF707FE08BDFFF75FFEFBE7FFF75CFE4F
+S31508000658F8E708B590F89C32013B022B09D84B8875
+S31508000668012B00D008BD0023C0F8A432FFF70EFE00
+S31508000678F8E7FFF749FEF5E738B50C7804F06004A3
+S31508000688202C06D0402C04D054B1FFF73DFE002498
+S3150800069804E0D0F8B8329B6898470446204638BD27
+S315080006A84D78092D1DD8DFE805F012191C161C0807
+S315080006B8051C0F0BFFF732FEF0E7FFF705FFEDE71E
+S315080006C8FFF72AFF0446E9E7FFF788FFE6E7FFF79B
+S315080006D8A4FF2C46E2E7FFF7F9FDDFE7FFF7B9FFC6
+S315080006E8DCE7FFF711FED9E770B505460C460B7827
+S315080006F803F06003202B07D0402B05D023B1FFF762
+S3150800070803FE0026304670BD95F89C32013B022B45
+S3150800071818D82379012B0FD8D5F8B8329B68214603
+S31508000728284698470646E388002BEBD10028E9D1E6
+S315080007382846FFF7ABFDE5E721462846FFF7E4FD1F
+S315080007480026DFE721462846FFF7DEFD0026D9E71B
+S31508000758F8B506460D468B880C7804F06004202CFC
+S3150800076808D0D9B2402C05D06CB12946FFF7CCFD84
+S31508000778002406E0D6F8B8329B68294630469847DA
+S3150800078804462046F8BD6F78012F2FD0032F05D0D1
+S31508000798002F57D02946FFF7B7FDF2E790F89C32A5
+S315080007A8022B05D0032B12D02946FFF7ADFDE8E743
+S315080007B8002918BF802906D003F072FB802130462D
+S315080007C803F06EFBDDE72946FFF79EFDD9E76B8840
+S315080007D82BB9002918BF802901D0EB881BB13046F0
+S315080007E8FFF754FDCDE703F05BFBF8E790F89C327A
+S315080007F8022B05D0032B12D02946FFF785FDC0E743
+S31508000808002918BF802906D003F04AFB8021304604
+S3150800081803F046FBB5E72946FFF776FDB1E76B888F
+S31508000828002BAED111F07F0F09D13046FFF72EFD08
+S31508000838D6F8B8329B68294630469847A1E703F0A8
+S3150800084837FBF2E790F89C22022A06D0032A2AD018
+S315080008582946FFF759FD3C4693E7002918BF802922
+S3150800086813D113F0800F15D101F07F0101EB810137
+S31508000878890001F5A8710144043100230B6002229E
+S315080008883046FFF7E6FC3C467BE72946FFF73CFD82
+S315080008983C4676E701F07F0101EB810189001031BA
+S315080008A801440431E9E75BB2002B20DB01F00F02B3
+S315080008B802EB820200EB8202B2F864212AB3002B0B
+S315080008C828DB01F07F0303EB83039C0004F5A87477
+S315080008D834440434802918BF002924D1002323600E
+S315080008E8022221463046FFF7B4FC3C4649E701F0A8
+S315080008F80F0202EB820200EB8202928C002ADED1FA
+S315080009082946FFF701FD3C463BE72946FFF7FCFC6D
+S315080009183C4636E701F07F0303EB83039C0010345B
+S3150800092834440434D6E7304603F068FA10B1012394
+S315080009382360D5E700232360D2E7D0B170B50D460A
+S3150800094816460446FFF7B8FC431C5B009BB2338087
+S315080009582B7003236B70022307E0EA5401345A1CF0
+S31508000968D2B20021A9540233DBB22278002AF4D184
+S3150800097870BD7047C0B108B50346D0F8B80210B1C3
+S315080009880020C3F8B802D3F8CC0210B10020C3F887
+S31508000998CC0209B1C3F8B412012183F89C121A7063
+S315080009A8184603F0F1F908BD0320704710B5044648
+S315080009B8012380F89C32D0F8B83213B15B68017904
+S315080009C89847D4F8CC3213B10023C4F8CC32204661
+S315080009D803F04BFA00B110BD204603F036FAFAE7E1
+S315080009E810B582B00023ADF8063059B10446C0F8F0
+S315080009F8B812CB6A0DF106009847C4F8CC02002055
+S31508000A0802B010BD0320FBE708B503F026FA08BDB7
+S31508000A1808B5D0F8B83213B11B68984708BD032043
+S31508000A28FCE708B5D0F8B8320BB15B6898470020E0
+S31508000A3808BD38B5044600F2AA252846FFF750FC33
+S31508000A480123C4F89432B4F8B032C4F8983294F84A
+S31508000A58AA1201F01F03012B0DD0022B10D02BB1BF
+S31508000A6801F08001204603F01BFA03E029462046D8
+S31508000A78FFF702FE38BD29462046FFF735FEF9E797
+S31508000A8829462046FFF764FEF4E738B504460D46BE
+S31508000A9831BB1346D0F89422032A01D0084638BD3C
+S31508000AA8D0F85C11D0F8602191420CD8D0F8B83249
+S31508000AB81B691BB190F89C22032A0FD02046FFF722
+S31508000AC8E5FB2846EBE7891AC0F85C118A4228BF75
+S31508000AD80A461946FFF7D2FB2846E0E79847EDE7A6
+S31508000AE8D0F8B8329B692BB190F89C22032A03D117
+S31508000AF89847D4E70320D2E70320D0E738B5044659
+S31508000B080D46002948D11346D0F89422022A05D062
+S31508000B1894F8A032012B3AD0284638BDC269016A32
+S31508000B288A4211D88A421BD0D4F8B832DB681BB17E
+S31508000B3894F89C22032A27D08021204603F0B0F98E
+S31508000B482046FFF7AEFBE3E7521AC2611946FFF7DC
+S31508000B588DFB00231A461946204603F0C1F9D7E744
+S31508000B6883699942E0D8D0F898229342DCD20022C9
+S31508000B781146FFF77BFB0021C4F898120B460A4674
+S31508000B88204603F0ADF9C3E720469847D4E7002383
+S31508000B9884F8A0322846C0E7D0F8B8325B692BB18A
+S31508000BA890F89C22032A03D19847B6E70320B4E7AE
+S31508000BB80320B2E770B50446012380F89C32002367
+S31508000BC8C0F894324360C0F8A432D0F8BC3223B1D6
+S31508000BD8D0F8B8325B6800219847402300221146AE
+S31508000BE8204603F04AF90126A4F864614025C4F8AA
+S31508000BF860512B4600228021204603F03EF9A68440
+S31508000C082562002070BD01740020704790F89C3258
+S31508000C1880F89D32042380F89C320020704790F8AB
+S31508000C289C32042B01D00020704790F89D3280F83A
+S31508000C389C32F8E708B590F89C32032B01D00020BF
+S31508000C4808BDD0F8B832DB69002BF8D09847F6E724
+S31508000C5800207047002070470020704708B5012318
+S31508000C6880F89C32D0F8B83213B15B680179984796
+S31508000C78002008BD054BD3F8882042F47002C3F853
+S31508000C8888204FF000629A60704700BF00ED00E0C8
+S31508000C9810B5094B4FF0FF321A6200241C625A62DB
+S31508000CA85C621A611C615A615C619A619C6102F016
+S31508000CB817FF204610BD00BF0038024010B504468D
+S31508000CC80E4B18784FF47A73B3FBF0F30C4A106896
+S31508000CD8B0FBF3F001F068FE68B90F2C01D90120C2
+S31508000CE80AE0002221464FF0FF3001F027FE054BA7
+S31508000CF81C60002000E0012010BD00BF0400002091
+S31508000D08000000200800002008B5032001F004FEB2
+S31508000D180020FFF7D3FF02F03DFE002008BD0000C3
+S31508000D2838B5044603F060FC0546B4F1FF3F02D027
+S31508000D38044B1B781C4403F057FC401BA042FAD30B
+S31508000D4838BD00BF040000202DE9F04383B0D0F871
+S31508000D580080C1EBC10300EB83035A6D1B6D9A42F1
+S31508000D6854D807460C469B1AC1EBC10200EB82020F
+S31508000D78526C9A4200D31A4602F103094FEA9909B6
+S31508000D8815E006F103094FEA9909C4EBC40507EB10
+S31508000D988505A96C3B7C0093B3B2E2B2404602F0E3
+S31508000DA865F9AB6C3344AB646B6D33446B6508EB20
+S31508000DB8441303F510639B699BB24B4512D3C4EBE6
+S31508000DC8C40207EB8202516D136D99420AD24BB1E0
+S31508000DD85B1AC4EBC40207EB8202566C9E42D0D358
+S31508000DE81E46CEE7C4EBC40007EB80073A6D7B6D59
+S31508000DF89A420FD804F00F040123A340D8F83448C0
+S31508000E0824EA0304C8F83448002000E0012003B0A7
+S31508000E18BDE8F0830020FAE7704770B58AB0002865
+S31508000E2800F097800546046890F8BD333BB3032362
+S31508000E3885F8BD33E36B13F4807F01D100232B615A
+S31508000E48286801F099FE2C4654F8106BEC460FCC2E
+S31508000E58ACE80F000FCCACE80F0094E803008CE868
+S31508000E6803002B1D0ECB304601F0D0FD044658B1C1
+S31508000E78022385F8BD33012420460AB070BD80F8E0
+S31508000E88BC33FFF7C9FFD2E70021286801F07AFECC
+S31508000E98234616E0C3EBC30205EB8202012182F85A
+S31508000EA83D1082F83C30A2F84230002182F83F1003
+S31508000EB851649164C3EBC30205EB820211650133E1
+S31508000EC8DBB269688B42E5D316E0C4EBC40305EBCD
+S31508000ED88303002283F8FD2183F8FC4183F8FF2168
+S31508000EE8C3F80422C3F80822C4EBC40305EB83033A
+S31508000EF8C3F810220134E4B2A142E6D82C4654F8C5
+S31508000F08106BEC460FCCACE80F000FCCACE80F0022
+S31508000F1894E803008CE803002B1D0ECB304601F03D
+S31508000F2877FE044660B9002385F83830012385F82A
+S31508000F38BD336B6A012B08D0286802F06FFA9BE765
+S31508000F48022385F8BD33012496E7284602F09AFB62
+S31508000F58F2E7012490E7704790F8BC33012B0ED0CE
+S31508000F6810B50446012380F8BC33006802F04AFA33
+S31508000F78206801F0FBFD002084F8BC0310BD0220A0
+S31508000F88704738B590F8BC33012B18D004460123AE
+S31508000F9880F8BC33006801F0EFFD206802F002FA19
+S31508000FA8054628B1002384F8BC330125284638BDF0
+S31508000FB8206802F033FA002384F8BC33F6E70225E2
+S31508000FC8F4E768B110B50446032380F8BD33FFF784
+S31508000FD8D8FF2046FFF7BFFF002084F8BD0310BDE1
+S31508000FE80120704770B504460D460068066C00EB8C
+S31508000FF8411303F530639A682169012911D03449E8
+S315080010088E424ED03DB9C5EBC50304EB8303D3F82E
+S315080010181032002B56D0E9B2204602F039FE0020DD
+S3150800102870BD12F0080F09D02A498E42F7D912F472
+S31508001038004FF4D04FF400429A60F0E712F0200F00
+S3150800104802D020229A60EAE712F0280FE7D1214950
+S315080010588E4206D912F4004F03D04FF400429A6024
+S31508001068DDE7C5EBC50204EB8202D2F804121B6958
+S31508001078C3F31203CB1AC2F81432D2F808320B4457
+S31508001088C2F8083215B9D2F8103223B1E9B22046A7
+S3150800109802F0FEFDC3E704F57172012102F010FAA9
+S315080010A8F4E712F4004F03D04FF400429A60B6E70B
+S315080010B812F0200F01D020229A60E9B2204602F0E9
+S315080010C8E7FDACE704F57172002102F0F9F9A2E729
+S315080010D80A31544F0A30544F38B5044603681D6C14
+S315080010E803EB4113D3F8081B0E4A954207D903F5B3
+S315080010F8306311F4004F02D04FF400429A6020463C
+S3150800110802F0BEFD074B9D4202D92369012B01D087
+S31508001118002038BD04F571720121206802F0D0F963
+S31508001128F6E700BF0A30544F2DE9F84F044605681C
+S31508001138284602F0B0F908B1BDE8F88F06462068D7
+S3150800114802F078F90028F7D0206802F073F910F051
+S31508001158020F04D02268536903F00203536120681A
+S3150800116802F068F910F0100F14D02268936923F07A
+S31508001178100393612F6A07F00F08C7F34343022B3E
+S3150800118800F08580062B00F0A1802268936943F059
+S3150800119810039361206802F04DF910F4002F40F00F
+S315080011A8A780206802F046F910F4802F40F0E980FD
+S315080011B8206802F03FF90028C0F25381206802F03F
+S315080011C839F910F4006F0AD0D5F8083813F0010F6A
+S315080011D840F061812268536903F40063536120680B
+S315080011E802F028F910F0006F15D02268536903F049
+S315080011F80063536194F8F433002B40F050810121C1
+S3150800120884F8F41323685B6DC3F38303C4F8F833CF
+S31508001218204602F04BFA206802F00CF910F4805FB9
+S3150800122840F04181206802F005F910F4005F40F0AB
+S315080012389581206802F0FEF810F0080F40F0A681A4
+S31508001248206802F0F7F810F4801F40F0A88120689B
+S3150800125802F0F0F810F4001F40F0AB81206802F0A5
+S31508001268E9F810F0804F40F0AE81206802F0E2F805
+S3150800127810F0040F3FF460AF23685D6815F0040F9B
+S3150800128840F0AA81226853682B43536054E747F60F
+S31508001298F0731F423FF479AF4FEA171BC8EBC8092A
+S315080012A804EB8909C7F30A12D9F80812284602F086
+S315080012B80FF8CBF30A02D9F808321344C9F80832EA
+S315080012C8D9F814321A44C9F814225EE7082204F534
+S315080012D87171284601F0FCFFC7F30A17C8EBC80264
+S315080012E804EB8202D2F814321F44C2F814724CE78F
+S315080012F8206802F0A3F80746B04616E005EB48133F
+S315080013080122C3F8082B41462046FFF76BFE1BE06F
+S3150800131805EB48130822C3F8082B41462046FFF771
+S31508001328DBFE14E008F101087F08002F3FF439AF07
+S3150800133817F0010FF6D05FFA88F1206802F08EF8E8
+S31508001348814610F0010FD9D119F0080FE0D119F02C
+S31508001358100F04D005EB48131022C3F8082B19F010
+S31508001368200F04D005EB48132022C3F8082B19F4DC
+S31508001378005FD7D005EB48134FF40052C3F8082B83
+S31508001388D0E7206802F062F80746B04629E05146D9
+S31508001398204602F089FC19F0080F04D005EB48131B
+S315080013A80822C3F8082919F0100F04D005EB4813CA
+S315080013B81022C3F8082919F0400F04D005EB481382
+S315080013C84022C3F8082919F0020F04D005EB481380
+S315080013D80222C3F8082919F0800F3DD108F101083F
+S315080013E87F08002F3FF4E4AE17F0010FF6D05FFA36
+S315080013F888FA5146206802F03AF8814610F0010F3B
+S31508001408C9D008F00F03012101FA03F2D5F83438D8
+S3150800141823EA0203C5F8343805EB4813C3F8081954
+S3150800142823698B42B3D1C8EBC80304EB8303596C11
+S315080014389A6C0A449A64B8F1000FA8D1C8EBC80395
+S3150800144804EB83031B6D002BA1D104F571720121EE
+S31508001458206802F035F89AE741462046FFF774FCFB
+S31508001468BCE7D5F8043823F00103C5F8043894F81E
+S31508001478F433012B08D0204602F05CFC2268536935
+S3150800148803F00043536199E6002184F8F4132046D3
+S3150800149802F00CF9F2E7204602F032FC9AE62046FA
+S315080014A802F02EFCB7E605F500677B6823F0010312
+S315080014B87B601021206801F07DFB20E005EB4613D0
+S315080014C84FF67F31C3F80819D3F8002922F4001219
+S315080014D8C3F80029D3F8002942F00062C3F80029A6
+S315080014E8C3F8081BD3F8002B22F40012C3F8002B04
+S315080014F8D3F8002B42F00062C3F8002B0136636864
+S31508001508B342DBD8FB6943F00113FB61236BDBB1FC
+S31508001518D7F8843043F00B03C7F884307B6C43F064
+S315080015280B037B64D5F8003823F4FE63C5F8003846
+S3150800153804F57172217C206801F0C2FF226853699C
+S3150800154803F4805353616DE67A6942F22B03134319
+S315080015587B613B6943F00B033B61E3E7206801F0D5
+S315080015689FFF206801F026FCE060256800F05AFC19
+S315080015780146227B284601F087FA204602F0A6FB98
+S315080015882268536903F40053536152E6204602F071
+S3150800159896FB2268536903F00803536150E6002155
+S315080015A8204602F0D6FB2268536903F48013536178
+S315080015B84DE60021204602F0C6FB2268536903F46B
+S315080015C8001353614AE6204602F0C9FB22685369AC
+S315080015D803F08043536148E6204602F0CAFB51E609
+S315080015E890F8BC33012B0BD010B50446012380F8BC
+S315080015F8BC33006801F006FF002084F8BC0310BD60
+S315080016080220704790F8BC33012B0BD010B504465E
+S31508001618012380F8BC33006801F000FF002084F835
+S31508001628BC0310BD0220704790F8BC33012B0DD0BF
+S3150800163810B50446012380F8BC3380F838100068D2
+S3150800164801F0D0FE002084F8BC0310BD02207047C4
+S3150800165838B505468C4611F0800F29D101F00F0ED2
+S31508001668CEEBCE04A40004F5FC740444211DCEEB8D
+S31508001678CE0E00EB8E0E00208EF8FD010CF00F0C36
+S3150800168881F800C08A60CB704A780AB1A1F806C00A
+S31508001698022B1DD095F8BC33012B1CD0012385F8E5
+S315080016A8BC33286801F096FB002085F8BC0338BDD2
+S315080016B801F00F00C0EBC001890038312944043114
+S315080016C8C0EBC00005EB8000012480F83D40D5E753
+S315080016D800230B71DEE70220E9E710B504460A463F
+S315080016E811F0800F20D101F00F00C0EBC0039B005A
+S315080016F803F5FC732344191DC0EBC00004EB8000F6
+S31508001708002380F8FD3102F00F020A7094F8BC3302
+S31508001718012B19D0012384F8BC33206801F0A8FBF3
+S31508001728002084F8BC0310BD01F00F00C0EBC0030D
+S315080017389B0038332344191DC0EBC00004EB800016
+S31508001748012380F83D30DEE70220ECE710B501F00A
+S315080017580F04C4EBC401890001F5FC710144043186
+S31508001768C4EBC40C00EB8C0CCCF80822CCF810326D
+S315080017780023CCF814328CF8FD318CF8FC41036947
+S31508001788012B06D064B9DAB2006801F0E1FB002043
+S3150800179810BDC4EBC40C00EB8C0CCCF80C22F1E79A
+S315080017A8DAB2006801F07AFCF1E701F00F01C1EB43
+S315080017B8C10100EB8101D1F81402704710B501F098
+S315080017C80F04C4EBC4018900383101440431C4EB61
+S315080017D8C40C00EB8C0CCCF84820CCF8503000230D
+S315080017E8CCF8543001238CF83D308CF83C4003691A
+S315080017F8012B06D064B9DAB2006801F0A9FB00200B
+S3150800180810BDC4EBC40C00EB8C0CCCF84C20F1E7EB
+S31508001818DAB2006801F042FCF1E738B501F00F05C5
+S315080018284268954239D804460B4611F0800F1FD1F5
+S31508001838C1EBC101890001F5FC7101440431C3EB10
+S31508001848C30300EB8303002283F8FD2101238B7071
+S315080018580D7094F8BC33012B21D0012384F8BC33CE
+S31508001868206801F044FD8DB1002084F8BC0338BD1A
+S31508001878C5EBC5018900383101440431C5EBC503F8
+S3150800188800EB8303012283F83D20DFE704F5717234
+S31508001898217C206801F014FEE6E70120E7E702202C
+S315080018A8E5E701F00F034268934231D810B50446BC
+S315080018B811F0800F1ED1C3EBC301890001F5FC7135
+S315080018C801440431C3EBC30200EB8202002082F80C
+S315080018D8FD0100228A700B7094F8BC33012B19D0CD
+S315080018E8012384F8BC33206801F02EFD002084F813
+S315080018F8BC0310BDC3EBC301890038310144043168
+S31508001908C3EBC30200EB8202012082F83D00E0E740
+S31508001918012070470220ECE7534B98421FD0534BDF
+S31508001928984228D0524B984231D0524B98423AD0D6
+S31508001938514B984243D0514B98424CD0504B984201
+S3150800194855D0504B98425ED04F4B984267D04F4B74
+S31508001958984270D04E4B984279D00120704703F5CB
+S3150800196860531A6942F001021A611A6922F00102E3
+S315080019781A610020704703F550531A6942F00202AB
+S315080019881A611A6922F002021A610020704703F5E3
+S3150800199840531A6942F004021A611A6922F00402CD
+S315080019A81A610020704703F530531A6942F0080295
+S315080019B81A611A6922F008021A610020704703F5AD
+S315080019C820531A6942F010021A611A6922F01002A5
+S315080019D81A610020704703F510531A6942F020026D
+S315080019E81A611A6922F020021A610020704703F565
+S315080019F800531A6942F040021A611A6922F0400235
+S31508001A081A610020704703F5E0531A6942F080020C
+S31508001A181A611A6922F080021A610020704703F5D4
+S31508001A28C0531A6942F480721A611A6922F48072DC
+S31508001A381A610020704703F5A0531A6942F4007228
+S31508001A481A611A6922F400721A610020704703F5B0
+S31508001A5880531A6942F480621A611A6922F480620C
+S31508001A681A610020704700BF0000024000040240C7
+S31508001A7800080240000C0240001002400014024010
+S31508001A8800180240001C02400020024000240240C0
+S31508001A98002802400B6893FAA3F3B3FA83FC57E0CD
+S31508001AA88D68826893FAA3F4B4FA84F464004FF054
+S31508001AB8030E0EFA04F422EA040293FAA3F4B4FA1B
+S31508001AC884F4640005FA04F4224382600C68CD683D
+S31508001AD8426822EA040205FB04F42243426045E010
+S31508001AE893FAA3F2B2FA82F2072A15D84D69026A5E
+S31508001AF893FAA3F4B4FA84F4A4000F2606FA04F4B5
+S31508001B0822EA040293FAA3F4B4FA84F4A40005FAC0
+S31508001B1804F42243026241E04C69456A1A0A92FAB9
+S31508001B28A2FEBEFA8EFE4FEA8E0E0F2606FA0EFEA5
+S31508001B3825EA0E0592FAA2F2B2FA82F2920004FA9D
+S31508001B4802F22A43426229E0002070BD0CF1010C1A
+S31508001B580B6833FA0CF244D0012202FA0CF213404D
+S31508001B68F4D070B54A68013A012A99D9C26893FA35
+S31508001B78A3F4B4FA84F46400032505FA04F422EA03
+S31508001B88040293FAA3F4B4FA84F464000D6905FA16
+S31508001B9804F42243C2604A68022AA1D04A68046843
+S31508001BA893FAA3FEBEFA8EFE4FEA4E0E032505FAF1
+S31508001BB80EFE24EA0E0E93FAA3F3B3FA83F35B0038
+S31508001BC802FA03F34EEA030303600CF1010C0B68EF
+S31508001BD833FA0CF2B8D0012202FA0CF21340F4D008
+S31508001BE8C0E700207047000010B40A490C6924F4BD
+S31508001BF840740C610C6944F440740C610C6944F037
+S31508001C0801040C6102604360BFF34F8F5DF8044B13
+S31508001C18704700BF003C0240084B1A6922F440721C
+S31508001C281A611A6942F400721A611A6942F00102C5
+S31508001C381A610160BFF34F8F704700BF003C02402E
+S31508001C48084B1A6922F440721A611A6942F48072BA
+S31508001C581A611A6942F001021A610180BFF34F8FAF
+S31508001C68704700BF003C0240074B1A6922F44072CD
+S31508001C781A611A691A611A6942F001021A61017031
+S31508001C88BFF34F8F704700BF003C02401A4BDB6812
+S31508001C9813F0020F04D0194A936943F0200393619D
+S31508001CA8154BDB6813F0100F04D0144A936943F0F8
+S31508001CB810039361104BDB6813F0200F04D00F4A0A
+S31508001CC8936943F0080393610B4BDB6813F0400FE5
+S31508001CD804D00A4A936943F004039361064BDB6808
+S31508001CE813F0800F04D0054A936943F00203936101
+S31508001CF8014BF222DA607047003C0240A801002036
+S31508001D08094B1B69002B01DB00207047064B074A65
+S31508001D185A6002F188325A601B69002B01DB0020E1
+S31508001D2870470120704700BF003C02402301674501
+S31508001D38034A136943F0004313610020704700BF44
+S31508001D48003C024038B50446154B00229A6102F059
+S31508001D584BFC0546134BDB6813F4803F0AD0B4F1F5
+S31508001D68FF3FF7D024B102F03FFC401BA042F1D94F
+S31508001D7803200DE00B4BDB6813F0F20F09D1094B72
+S31508001D88DB6813F0010F08D0064B0122DA60002041
+S31508001D9838BDFFF77BFF0120FAE70020F8E700BF08
+S31508001DA8A8010020003C0240F8B516461B4A127DD9
+S31508001DB8012A31D004460D461F46184B01221A75CA
+S31508001DC84CF25030FFF7BEFF90B9032C07D8DFE86E
+S31508001DD804F00213181DF1B22846FFF745FF4CF226
+S31508001DE85030FFF7AFFF0E4A136923F0010313615A
+S31508001DF80A4B00221A75F8BDB1B22846FFF720FF2C
+S31508001E08EDE731462846FFF707FFE8E732463B463F
+S31508001E182846FFF7E9FEE2E70220ECE7A8010020DA
+S31508001E28003C0240014B1868704700BF00000020BC
+S31508001E387047002800F0A18038B5044690F820308D
+S31508001E48D3B12268136823F00203136002F0CCFBAF
+S31508001E58054623685A6812F0020F10D002F0C4FB30
+S31508001E68401B0A28F5D9636A43F4003363620523DD
+S31508001E7884F82030012038BDFFF7DAFFE1E71A6851
+S31508001E8842F001021A6002F0AFFB054623685A6859
+S31508001E9812F0010F0DD102F0A7FB401B0A28F5D94D
+S31508001EA8636A43F400336362052384F8203001200B
+S31508001EB8E1E7227E012A3DD01A6822F080021A60DC
+S31508001EC8637E012B3BD02268136823F04003136016
+S31508001ED8A37E012B39D02268136823F020031360E8
+S31508001EE8E37E012B37D02268136843F0100313608A
+S31508001EF8237F012B35D02268136823F00803136063
+S31508001F08637F012B33D02268136823F00403136018
+S31508001F18A368E26813432269134362691343626834
+S31508001F28013A21681343CB6100206062012384F8D3
+S31508001F382030A0E71A6842F080021A60C0E72268D3
+S31508001F48136843F040031360C2E72268136843F036
+S31508001F5820031360C4E72268136823F0100313608C
+S31508001F68C6E72268136843F008031360C8E72268BF
+S31508001F78136843F004031360CAE70120704700009A
+S31508001F8890F82030013BDBB2012B05D9436A43F4AC
+S31508001F98802343620120704730B5464BD3F80022A8
+S31508001FA842F00102C3F80022D3F8002222F47C5238
+S31508001FB8C3F80022D3F80022486A42EA0022C3F886
+S31508001FC800224A6902F01F02012000FA02F2D3F839
+S31508001FD81C026FEA020C20EA0200C3F81C02CB694D
+S31508001FE8C3B9344BD3F80C020CEA0000C3F80C0248
+S31508001FF88C884869CD6844EA0544483043F8304037
+S315080020088C68088840EA04404C6904F1480E03EBDA
+S31508002018CE035860CB69012B1ED08B69002B33D1B0
+S315080020282448D0F804320CEA0303C0F804320B69D2
+S315080020388BBB2048D0F814320CEA0303C0F81432D4
+S315080020480B6A012B2ED01B4AD2F8003223F0010363
+S31508002058C2F80032002030BD164BD3F80C021043E4
+S31508002068C3F80C028C8848690D6844EA0544483068
+S3150800207843F8304088894C698D6840EA05404834F9
+S3150800208803EBC4035860C8E70A48D0F80432134378
+S31508002098C0F80432CBE70748D0F814321343C0F81F
+S315080020A81432CDE70349D1F81C321A43C1F81C2269
+S315080020B8C9E700BF0064004070B5044690F8205090
+S315080020C8EDB2012D06D0436A43F400234362012585
+S315080020D8284670BD022380F820300268136823F06A
+S315080020E80103136002F080FA064623685B6813F05A
+S315080020F8010F0CD002F078FA831B0A2BF5D9636A0C
+S3150800210843F400336362052384F82030E0E70025AA
+S315080021186562DDE730B590F820C00468A4680CF15C
+S31508002128FF3C5FFA8CFCBCF1010F6BD814F0E05F3A
+S3150800213862D0C4F3016CBCF1020F05D9436A43F4B3
+S3150800214800034362012062E0012404FA0CF41C60CF
+S315080021588B68002B3DD10D68CB68046843EA455562
+S315080021680CF118031B01E55003680C690CF1180EED
+S3150800217803EB0E135C600B7D012B35D0D17993796F
+S315080021881B0443EA0163517943EA01231479016878
+S31508002198234301EB0C11C1F88C31D17893781B04D1
+S315080021A843EA0163517843EA0123117802680B432D
+S315080021B802EB0C12C2F8883102680CF1180C4FEAC7
+S315080021C80C1C52F80C3043F0010342F80C3000207E
+S315080021D81DE04C6843EAC403CC6823430CF1180491
+S315080021E8240105682B51BFE7036803EB0E135968EA
+S315080021F841F480715960C1E7436A43F400134362A6
+S31508002208012004E0436A43F480234362012030BD79
+S3150800221890F82030013BDBB2012B01D9002070472A
+S3150800222803689B6803EA8163B3EB816F01D00120D9
+S3150800223870470020704790F820C00CF1FF3C5FFA01
+S315080022488CFCBCF1010F00F2958030B451B90468D2
+S31508002258E46814F0030F10D1436A43F40013436289
+S31508002268012077E00468246914F0030F05D1436A4E
+S3150800227843F40013436201206CE001F11B042401B6
+S3150800228805682C5904F004049460002C64D101F103
+S315080022981B04240105682C59640D1460046801F1AF
+S315080022A81B0C4FEA0C1C54F80C4004F00204D460CA
+S315080022B804686444646804F00F0414610468644498
+S315080022C86468C4F307249461046864446468240C45
+S315080022D85461026802EB0112D2F8B8211A70026832
+S315080022E802EB0112D2F8B821C2F307225A70026823
+S315080022F802EB0112D2F8B821C2F307429A700268B3
+S3150800230802EB0112D2F8B821120EDA70026802EB53
+S315080023180112D2F8BC211A71026802EB0112D2F82E
+S31508002328BC21C2F307225A71026802EB0112D2F8DD
+S31508002338BC21C2F307429A71026802EB0112D2F86D
+S31508002348BC21120EDA7179B90268D36843F0200302
+S31508002358D360002030BC704701F11B0424010568CE
+S315080023682C59E408546099E70268136943F0200376
+S315080023781361EEE7436A43F48023436201207047FA
+S31508002388014B1860704700BF0000002038B5036885
+S3150800239813F0010F75D104460D4603683B4A1A40E7
+S315080023A84B68C9680B4329690B43A9690B4313434F
+S315080023B80360AB68426822F44052134343606B6972
+S315080023C8826822F4407213438360314B984216D0D0
+S315080023D8304B98421CD0304B98421DD02F4B984210
+S315080023E81ED02F4B98421FD02E4B984221D02E4BE9
+S315080023F8984223D02D4B984225D0012042E003204D
+S3150800240800F00EF900283ED02B680BBB012039E0F6
+S315080024180C2000F005F9F5E7302000F001F9F1E79E
+S31508002428C02000F0B9F9EDE74FF4407000F0B4F9B0
+S31508002438E8E74FF4406000F0F3F8E3E74FF440505C
+S3150800244800F0AAF9DEE74FF4404000F0A5F9D9E70D
+S31508002458AA69B2F5004F07D000EB5300B0FBF3F3B7
+S315080024689BB2E36000200DE05A0802EB4000B0FB7F
+S31508002478F3F34FF6F0721A40C3F342031343E360CB
+S31508002488F0E7012038BD0120FCE700BFF369FFEF3C
+S31508002498001001400044004000480040004C00403D
+S315080024A8005000400014014000780040007C0040BD
+S315080024B882B0224A136843F0010313601F4B1B6856
+S315080024C813F0020FFAD01D4B00229A601A6801927F
+S315080024D801991B4A0A400192019A1A601A6822F061
+S315080024E8F80242F080021A60144B1B6813F0007F4A
+S315080024F8FAD1124B1B6813F0006FFAD10F4B1B6801
+S3150800250813F0005FFAD10D4B0E4A5A60103AC3F819
+S315080025188420C3F88820DA6822F4FE42DA60DA688A
+S3150800252842F47F02DA605A6F22F001025A675A6F3C
+S3150800253842F080725A67002002B07047003802409D
+S31508002548FFFFF2EA10300024034B9B68C3F303131A
+S31508002558024AD35CD840704700380240085200083F
+S31508002568034B9B68C3F38223024AD35CD84070475F
+S315080025780038024018520008034B9B68C3F34233DD
+S31508002588024AD35CD84070470038024018520008FF
+S315080025980D4B5B6803F480039BB90C480A4B5A68D1
+S315080025A802F03F02B0FBF2F05A68C2F3881202FB47
+S315080025B800F05B68C3F3014301335B00B0FBF3F03B
+S315080025C870470348EAE700BF003802400024F400D1
+S315080025D800127A0008B5074B9B6803F00C03042B16
+S315080025E804D0082B04D1FFF7D3FF02E0024800E025
+S315080025F8024808BD0038024000127A000024F40098
+S3150800260810B50446FFF7E6FF2060FFF79DFF6060F8
+S31508002618FFF7A6FFA0606068FFF7AEFFE06010BD91
+S3150800262808B5032808D00C282ED0B0F5406F53D02B
+S3150800263830287AD0002008BD514BD3F89030034093
+S3150800264843EA00404F4B98420FD0B0F1031F13D00E
+S31508002658013B984206D0FFF7BDFFFFF775FFFFF766
+S315080026688BFFE8E7FFF7B6FFE5E7454B186810F074
+S315080026780200E0D04448DEE7414B186F10F002002C
+S31508002688D9D04FF40040D6E73D4BD3F890300340F5
+S3150800269843EA00403D4B98420FD0B0F10C1F13D0C7
+S315080026A8043B984206D0FFF795FFFFF74DFFFFF763
+S315080026B857FFC0E7FFF78EFFBDE7314B186810F0E4
+S315080026C80200B8D03048B6E72D4B186F10F0020054
+S315080026D8B1D04FF40040AEE7294BD3F89030034009
+S315080026E843EA00402A4B984210D0B0F10C2F14D078
+S315080026F8A3F58063984206D0FFF76CFFFFF724FF1F
+S31508002708FFF73AFF97E7FFF765FF94E71C4B18684A
+S3150800271810F002008FD01C488DE7194B186F10F07F
+S31508002728020088D04FF4004085E7154BD3F890305F
+S31508002738034043EA0040174B98420FD0B0F1301FC8
+S3150800274814D0103B984206D0FFF744FFFFF7FCFE6B
+S31508002758FFF706FF6FE7FFF73DFF6CE7084B1868BA
+S3150800276810F002003FF467AF074864E7044B186F98
+S3150800277810F002003FF45FAF4FF400405BE700BF7C
+S3150800278800380240020003000024F40008000C0088
+S315080027980008000C2000300008B5C0280AD0B0F59B
+S315080027A8407F2FD0B0F5405F55D0B0F5404F7BD06D
+S315080027B8002008BD524BD3F89030034043EA004046
+S315080027C8504B98420FD0B0F1C01F13D0403B9842E7
+S315080027D806D0FFF7FFFEFFF7B7FEFFF7C1FEE8E7EB
+S315080027E8FFF7F8FEE5E7464B186810F00200E0D058
+S315080027F84548DEE7424B186F10F00200D9D04FF46F
+S315080028080040D6E73E4BD3F89030034043EA0040F1
+S315080028183E4B984210D0B0F1032F14D0A3F580731D
+S31508002828984206D0FFF7D6FEFFF78EFEFFF798FE0A
+S31508002838BFE7FFF7CFFEBCE7314B186810F0020078
+S31508002848B7D03148B5E72E4B186F10F00200B0D054
+S315080028584FF40040ADE72A4BD3F89030034043EADB
+S3150800286800402B4B984210D0B0F1302F14D0A3F566
+S315080028788053984206D0FFF7ADFEFFF765FEFFF7CF
+S315080028886FFE96E7FFF7A6FE93E71D4B186810F04C
+S3150800289802008ED01C488CE7194B186F10F00200FE
+S315080028A887D04FF4004084E7154BD3F8903003409F
+S315080028B843EA0040174B984210D0B0F1C02F15D004
+S315080028C8A3F58043984206D0FFF784FEFFF73CFE3F
+S315080028D8FFF746FE6DE7FFF77DFE6AE7084B1868BF
+S315080028E810F002003FF465AF074862E7044B186F1B
+S315080028F810F002003FF45DAF4FF4004059E700BFFF
+S31508002908003802408000C0000024F40000020003DA
+S3150800291800200030008000C00649CB6823F4E06335
+S315080029281B041B0C000200F4E0600343024A1A4326
+S31508002938CA60704700ED00E00000FA0500B5174BBD
+S31508002948DB68C3F30223C3F1070CBCF1040F28BFE5
+S315080029584FF0040C03F1040EBEF1060F14D9033B1D
+S315080029684FF0FF3E0EFA0CFC21EA0C0199400EFACC
+S3150800297803F322EA03031943002807DB0901C9B24E
+S31508002988074B19545DF804FB0023E9E700F00F002C
+S315080029980901C9B2034B1954F4E700BF00ED00E07A
+S315080029A800E400E014ED00E00138B0F1807F0BD2B6
+S315080029B84FF0E0235861054AF02182F823100020D9
+S315080029C8986107221A6170470120704700ED00E0F8
+S315080029D8002301330C4A934211D80269002AF8DA0F
+S315080029E8036943F00103036100230133064A93424E
+S315080029F807D8026912F0010FF7D1002070470320A3
+S31508002A0870470320704700BF400D030084B010B517
+S31508002A18044603A880E80E00089B012B1DD1A36B6A
+S31508002A2823F48033A363E268164B1340E360E36834
+S31508002A3823F44013E3600F9B012B09D02046FFF7C8
+S31508002A48C7FF069B012B14D0BDE8104004B0704799
+S31508002A58E36843F48013E360F0E7E36843F0400370
+S31508002A68E3602046FFF7B4FFA36B43F48033A36300
+S31508002A78E7E7A36843F00603A360A36843F02003C7
+S31508002A88A360E1E7BFFFBDFF022A0AD00921C26891
+S31508002A9822F47052C260C36843EA8123C3600020E7
+S31508002AA87047204B0B44204A934229D91F4B0B44A5
+S31508002AB81F4A934226D91F4B0B441F4A934223D9D0
+S31508002AC81E4B0B441E4A934220D31E4B0B441E4AE8
+S31508002AD893421DD91D4B0B441D4A93421AD31D4BCD
+S31508002AE80B441D4A934217D31C4B0B441C4A93426A
+S31508002AF814D31C4B0B441C4A934211D20721C6E730
+S31508002B080F21C4E70E21C2E70D21C0E70C21BEE755
+S31508002B180B21BCE70A21BAE70921B8E70821B6E775
+S31508002B280621B4E7405327FFFF340C00401E1BFF5D
+S31508002B383F420F0000DC0BFF7F4F1200808CF9FE26
+S31508002B4820D6130060B6E5FE5FE3160000D3CEFE76
+S31508002B5840771B00C05BB3FEC091210000CA91FEF6
+S31508002B6820753800E05459FEE09C4100836843F01C
+S31508002B780103836000207047836823F0010383609C
+S31508002B880020704708B5C36823F0C043C36001290D
+S31508002B9809D069B9C36843F08043C3603220FEF799
+S31508002BA8BFF8002008BDC36843F00053C360F5E7C3
+S31508002BB80120F7E7890141F020010161002301336B
+S31508002BC8054A934205D8026912F0200FF7D100206A
+S31508002BD870470320704700BF400D030010230361A8
+S31508002BE800230133054A934205D8026912F0100FEB
+S31508002BF8F7D1002070470320704700BF400D030037
+S31508002C08D0F800381943C0F80018002070470000AB
+S31508002C1884B02DE9F041044607A880E80E00002391
+S31508002C2806E003F1400204EB8202002151600133F9
+S31508002C380E2BF6D9119F37BBD4F8043843F0020394
+S31508002C48C4F80438A36B23F40013A363236843F07A
+S31508002C5840032360236843F0800323600023C4F8F5
+S31508002C68003E04F50065D4F80038C4F800380C9B13
+S31508002C78012B0DD0032B1CD1099BABB9002120468B
+S31508002C88FFF7BEFF19E0A36B43F40013A363E5E758
+S31508002C98099B23B900212046FFF7B2FF0DE0012161
+S31508002CA82046FFF7ADFF08E001212046FFF7A8FFF9
+S31508002CB803E003212046FFF7A3FF10212046FFF76C
+S31508002CC879FF804608B14FF001082046FFF786FFCE
+S31508002CD808B14FF0010800232B616B61EB610AE02C
+S31508002CE8C3B94FF00060C2F8000900220A614FF61E
+S31508002CF87F328A6001330799994210D904EB431247
+S31508002D0802F51061D2F800090028E9DB0020C2F8AC
+S31508002D180009EAE74FF09040C2F80009E5E7002302
+S31508002D280AE0C3B14FF0904CC2F800CB002202610A
+S31508002D384FF67F3282600133994211D904EB431268
+S31508002D4802F53060D2F8006B002EEADB4FF0000C73
+S31508002D58C2F800CBEAE74FF0006CC2F800CBE5E70B
+S31508002D682B6923F480732B610023A3616FF08043DA
+S31508002D7863610A9B1BB9A36943F01003A361A2699F
+S31508002D880A4B1343A3610D9B1BB1A36943F00803C0
+S31508002D98A361012F04D04046BDE8F04104B070474E
+S31508002DA8A269034B1343A361F5E700BF00383C80CB
+S31508002DB804000040D0F8083813F0060305D0062B9F
+S31508002DC818BF022B03D102207047002070470F2036
+S31508002DD87047000010B591F800C04B78012B21D038
+S31508002DE800F5006ED0F81C380CF00F040122A2403A
+S31508002DF843EA0243C0F81C3800EB4C10D0F8003BF5
+S31508002E0813F4004F0CD1D0F8002B8B68C3F30A03D0
+S31508002E18C97843EA81431343144A1A43C0F8002B76
+S31508002E28002010BDD0F81C280CF00F0E03FA0EF37C
+S31508002E389BB21343C0F81C3800EB4C10D0F8003985
+S31508002E4813F4004FECD1D0F800298B68C3F30A03B2
+S31508002E58C97843EA814343EA8C5C42EA0C0C034B83
+S31508002E684CEA0303C0F80039DAE700BF008000100F
+S31508002E7830B40B784A78012A26D000EB4313D3F8E6
+S31508002E88002B002A52DBD0F83C480A7802F00F02D9
+S31508002E984FF0010C0CFA02F224EA0242C0F83C2868
+S31508002EA8D0F81C28097801F00F010CFA01FC22EA6F
+S31508002EB80C42C0F81C28D3F8001B234A0A40C3F85A
+S31508002EC8002B002030BC704700EB4313D3F80029C9
+S31508002ED8002A1EDBD0F83C580A7802F00F020124B3
+S31508002EE804FA02F292B225EA0202C0F83C28D0F89F
+S31508002EF81C28097801F00F018C40A4B222EA0404C0
+S31508002F08C0F81C48D3F80019104A0A40C3F8002923
+S31508002F18D7E7D3F8002942F00062C3F80029D3F8A6
+S31508002F28002942F08042C3F80029D3E7D3F8002BDA
+S31508002F3842F00062C3F8002BD3F8002B42F0804217
+S31508002F48C3F8002B9FE700BF0078F3EF007833EC4F
+S31508002F5870B40B784C78012C25D000EB431000F59B
+S31508002F6830631D693F4C2C401C611D693E4C2C4042
+S31508002F781C614C690CB18C684C611C6944F40024CA
+S31508002F881C611C698D68C5F3120C44EA0C041C61A3
+S31508002F98012A62D0D0F8003B43F00443C0F8003B4E
+S31508002FA8002070BC70474C695CBB00EB4314D4F82E
+S31508002FB810692D4D3540C4F81059D4F8105945F400
+S31508002FC80025C4F81059D4F81069264D3540C4F8B8
+S31508002FD81059012A32D000EB4313D3F8002942F0DE
+S31508002FE80442C3F800294B69002BD9D0D0F83438E5
+S31508002FF80A7802F00F0101228A401343C0F83438D0
+S31508003008CEE700EB431404F510642669154D3540E0
+S3150800301825612669144D354025618D684E69AE428D
+S3150800302800D94D61256945F40025256125694E694C
+S31508003038C6F3120C45EA0C052561CAE70A691AB1EE
+S3150800304800EB4311C1F8142900EB4310D0F8002906
+S3150800305842F00442C0F80029A2E7CA68002A99D0B3
+S315080030685A6197E70000F8FFFFFF07E010B59DF8DB
+S31508003078084084B903334FEA930E4FF0000C08E072
+S3150800308800EB023303F5805351F8044B1C600CF12E
+S31508003098010CF445F4D3002010BD0000F0B583B048
+S315080030A80B784C78012C31D000EB431303F5306CC0
+S315080030B8DCF81050834C2C40CCF81040DCF8105043
+S315080030C8814C2C40CCF810404C69002C40F0C68046
+S315080030D8DCF810408D68C5F312052C43CCF810406F
+S315080030E8DCF8104044F40024CCF81040012A00F01B
+S315080030F8CF80CA78012A00F0D280D3F8002B42F094
+S315080031080442C3F8002B002003B0F0BD4C6974BB19
+S3150800311800EB4314D4F810696B4D3540C4F81059C0
+S31508003128D4F8105945F40025C4F81059D4F810698C
+S31508003138644D3540C4F81059012A4DD000EB4313A5
+S31508003148D3F8004944F00444C3F80049CC78012C64
+S315080031586BD04B69002BD6D0D0F834380A7802F0F1
+S315080031680F0101228A401343C0F83438CBE700EB35
+S315080031784314D4F81069534D3540C4F81059D4F897
+S315080031881069514D3540C4F81059D4F810598E684D
+S315080031984F6907EB060C0CF1FF3CBCFBF6FC4B4EE3
+S315080031A806EACC4C45EA0C05C4F81059D4F8105967
+S315080031B84E69C6F312063543C4F8105904F5106467
+S315080031C8CD78012DB8D1256925F0C0452561256931
+S315080031D845F000552561AFE70A691AB100EB4314B3
+S315080031E8C4F81429CA78012A08D000EB4313D3F87F
+S315080031F8002942F00442C3F8002984E7D0F80828D1
+S3150800320812F4807F08D100EB4311D1F8002942F067
+S315080032180052C1F80029E8E700EB4311D1F8002964
+S3150800322842F08052C1F80029DFE7D0F8084814F4BC
+S31508003238807F0CD1D3F8004944F00054C3F80049FC
+S3150800324800928B8A0A78C968FFF710FF5BE7D3F8FC
+S31508003258004944F08054C3F80049F1E78D682C44C6
+S31508003268013CB4FBF5F4DCF810501FFA84FE174E3F
+S3150800327806EAC4442543CCF81050DCF810508C688C
+S315080032880EFB04F4C4F312042C43CCF810402DE7C3
+S31508003298CA68002A3FF42DAFCCF8142029E7D0F8DD
+S315080032A8082812F4807F06D1D3F8002B42F0005282
+S315080032B8C3F8002B21E7D3F8002B42F08052C3F855
+S315080032C8002B1AE70000F8FFFFFF07E00000F81FC9
+S315080032D884460846D11C8908002305E00CF5805267
+S315080032E8126840F8042B01338B42F7D370470B78E2
+S315080032F84A78012A14D000EB4310D0F8002B002A8C
+S3150800330806DB2BB1D0F8003B23F08043C0F8003B1E
+S31508003318D0F8003B43F40013C0F8003B0020704780
+S3150800332800EB4310D0F80029002A06DB2BB1D0F8A9
+S31508003338003923F08043C0F80039D0F8003943F43F
+S315080033480013C0F80039E9E70B784A78012A0ED045
+S3150800335800EB4310D0F8003B23F40013C0F8003BF9
+S31508003368CB78023BDBB2012B15D90020704700EB5E
+S315080033784310D0F8003923F40013C0F80039CB7885
+S31508003388023BDBB2012BF0D8D0F8003943F0805362
+S31508003398C0F80039E9E7D0F8003B43F08053C0F895
+S315080033A8003BE2E710B50446002208E004EB4213A6
+S315080033B84FF67F31C3F80819C3F8081B01320E2ADD
+S315080033C8F4D90022C4F81028C4F81428C4F81C280C
+S315080033D82046FFF703FC00B110BD10212046FFF771
+S315080033E8E9FBF9E7D0F8003823F4FE63C0F800389B
+S315080033F8D0F80038090101F4FE611943C0F800182D
+S315080034080020704708B5D0F8043823F00203C0F83E
+S3150800341804380320FDF784FC002008BD08B5D0F859
+S31508003428043843F00203C0F804380320FDF778FC93
+S31508003438002008BD4269806910407047D0F81838DE
+S3150800344800F50060C0691840000C7047D0F81838B5
+S3150800345800F50060C069184080B2704700EB41115A
+S31508003468D1F8082B00F5006040691040704710B481
+S31508003478D0F81048D0F8343801F00F02D340DB01F1
+S31508003488DBB2234300EB411000F510608068184052
+S315080034985DF8044B7047406900F00100704700006A
+S315080034A8D0F80029054B1340C0F80039D0F804387D
+S315080034B843F48073C0F804380020704700F8FFFF0B
+S315080034C810B4046C154B9C4203D9D0F8003B002B6A
+S315080034D816DB0024C0F8104BD0F8104B44F400242F
+S315080034E8C0F8104BD0F8104B44F01804C0F8104B2D
+S315080034F8D0F8104B44F0C044C0F8104B012903D04B
+S3150800350800205DF8044B7047C0F8142BD0F8003B30
+S3150800351843F08023C0F8003BF2E700BF0A30544F57
+S31508003528084B196921F440711961196941F00401B8
+S3150800353819611A6942EA002242F480321A61BFF315
+S315080035484F8F7047003C024049B1012923D0022910
+S3150800355802D04FF4407C04E04FF4007C01E04FF0C1
+S31508003568000C0E4B196921F4407119611A6942EA6F
+S315080035780C021A611A6922F0F8021A611A6942EAF3
+S31508003588C00040F0020018611A6942F480321A61D4
+S31508003598BFF34F8F70474FF4807CE2E7003C024048
+S315080035A8214B1B7D012B3CD070B504460E461E4B9D
+S315080035B801221A754CF25030FEF7C4FB014658BB77
+S315080035C84FF0FF3333602368012B16D06568A3686C
+S315080035D862681344AB421FD9217B2846FFF7B4FF1C
+S315080035E84CF25030FEF7AEFB104A136923F07A0303
+S315080035F81361014678B90135E9E7207BFFF790FFA3
+S315080036084CF25030FEF79EFB0146084A136923F030
+S315080036180403136100E03560034B00221A75084657
+S3150800362870BD022108467047A8010020003C0240E8
+S3150800363810B40468606A31B940EA0240A062002002
+S315080036485DF8044B70478C46A36A00EB13400023C9
+S3150800365808E003F1400104EB8101496800EB1140D9
+S315080036680133DBB20CF1FF318B42F2D340EA024058
+S315080036780CF13F0104EB81014860E0E703685962F1
+S3150800368800207047034602680121C0F8FC13002091
+S3150800369883F8F403936943F000639361516D024B11
+S315080036A80B435365704700BF0300001070470000BE
+S315080036B812230B80004870475000002004230B8013
+S315080036C8004870476400002021230B800048704793
+S315080036D82C000020002393421ED200B510E00CF1FE
+S315080036E8370C01F813C000014FEA430C0CF1010C22
+S315080036F84FF0000E01F80CE00133DBB2934209D211
+S315080037084FEA107CB0F1204FE9D20CF1300C01F8E1
+S3150800371813C0E8E75DF804FB7047000038B50B4BA3
+S31508003728D3F82004D3F82444D3F82834C01800D191
+S3150800373838BD074D0822A91CFFF7CCFF042205F15E
+S3150800374812012046FFF7C6FFF2E700BF00F0F01F98
+S315080037586800002008B51A230B80FFF7DFFF014829
+S3150800376808BD00BF6800002008B50A4628B90549FB
+S315080037780548FDF7E2F8034808BD02490248FDF77F
+S31508003788DCF8F8E7C40100202052000810B50A46FC
+S31508003798034C21460348FDF7D0F8204610BD00BF64
+S315080037A8C40100203452000808B50A4628B9054954
+S315080037B80548FDF7C2F8034808BD02490248FDF75F
+S315080037C8BCF8F8E7C40100204452000808B50A46C0
+S315080037D828B905490548FDF7B0F8034808BD024960
+S315080037E80248FDF7AAF8F8E7C40100204C52000879
+S315080037F8014B1880704700BFC403002008B500F0C5
+S31508003808EBFE0E4B1B6898420FD30D4B1B786BB912
+S315080038180B4B01221A700B4B80229A6100F0DCFED2
+S31508003828094B1B880344054A136008BD044B00224C
+S315080038381A70044B4FF400029A61EFE7C803002098
+S31508003848C603002000040240C4030020024B4FF4BC
+S3150800385800029A61704700BF0004024008B5054B8C
+S315080038681B6913F4005F01D0002008BDFFF7EEFFBF
+S315080038780120FAE70008024008B56420FFF7B8FFF8
+S3150800388808BD08B5FFF7BAFF08BD70477047704707
+S3150800389808B5304A136823F00F0343F0070313608B
+S315080038A8136803F00F03072B4ED12B4B1A6842F403
+S315080038B840421A601A6842F480321A6003F5E43303
+S315080038C81A6842F480221A601A6842F480321A602A
+S315080038D8224B1B6813F4003FFAD0204B5A6820493C
+S315080038E81140204A0A435A605A681F4911401F4A1C
+S315080038F80A435A601A6842F080721A60174B1B68A6
+S3150800390813F0007FFAD0154B9A6822F0F0029A60F5
+S315080039189A6822F4E05242F4A0529A609A6822F40D
+S31508003928604242F400429A609A6822F0030242F022
+S3150800393802029A60094B9B6803F00C03082BF9D11D
+S315080039480B48FEF71DFD08BD6A210A4800F0D0FAA3
+S31508003958ABE700BF003C0240007000400038024058
+S315080039680080BCFF086C40000080BFF0086C400966
+S3150800397800E6DF0C6452000808B5FDF7C5F9FFF73D
+S3150800398887FF08BD08B5FFF7F7FF00F0BDFA00F096
+S31508003998C9FAFCE72DE9F04391B04C4C636C43F443
+S315080039A880436364636C03F480430993099B236C1F
+S315080039B843F080532364236C03F080530893089BD1
+S315080039C8236B43F001032363236B03F00103079377
+S315080039D8079B236B43F002032363236B03F002035D
+S315080039E80693069B236B43F004032363236B03F0B8
+S315080039F804030593059B236B43F008032363236B92
+S31508003A0803F008030493049B236C43F4802323647C
+S31508003A18236C03F480230393039B236C43F00073FE
+S31508003A282364236C03F000730293029B80230A9392
+S31508003A3801230B9300250C950D950E95DFF89C80B0
+S31508003A480AA94046FEF726F84FF40003C8F81830C6
+S31508003A584FF400530A930B950E950AA91C48FEF7CE
+S31508003A6819F84FF44079CDF8289002270B970326C2
+S31508003A780C960D950E9507230F930AA91548FEF778
+S31508003A8809F8CDF828900B970C960D950E950923ED
+S31508003A980F930AA94046FDF7FDFF4FF4C0530A9352
+S31508003AA80B970C960D950E950A230F930AA90A48A3
+S31508003AB8FDF7F0FF636B43F080036363636B03F002
+S31508003AC880030193019B11B0BDE8F08300380240DA
+S31508003AD800080240000C02400000024000040240B0
+S31508003AE810B5FEF7E5FC1B4C4FF40003A3611A4812
+S31508003AF8FDF712FF1948FDF70FFF2046FDF70CFFE3
+S31508003B081748FDF709FF174B5A6B22F080025A63CC
+S31508003B181A6C22F000721A641A6C22F480221A644B
+S31508003B281A6B22F008021A631A6B22F004021A6347
+S31508003B381A6B22F002021A631A6B22F001021A6340
+S31508003B481A6C22F080521A645A6C22F480425A641B
+S31508003B5810BD00BF00040240000C024000080240E5
+S31508003B680000024000380240704700002023038006
+S31508003B7800487047BC0000200A23038000487047A5
+S31508003B88DC00002008B590F89C32032B01D00020F1
+S31508003B9808BD01F085FAFAE708B501F081FA0020B0
+S31508003BA808BD08B5084601F0AFFA002008BD0000B0
+S31508003BB808B50B7813F060030CD0402B11D14B785D
+S31508003BC8012B0ED18B88072B0BD19E221449FCF7A3
+S31508003BD840FB06E04B780A2B14D00B2B17D0062B84
+S31508003BE801D0002008BD4B881B0A212B04D00D499B
+S31508003BF81722FCF72EFBF4E7CA88172A28BF1722CC
+S31508003C080949F6E701220949FCF723FBE9E78B7816
+S31508003C1813B9064A1360E4E7FCF776FBE1E700BF49
+S31508003C28E8000020C5000020CE0000200C04002073
+S31508003C3810B50446812100F02BF90121204600F031
+S31508003C4827F9002010BD000010B5044640230222BB
+S31508003C58812100F012F9402302220121204600F0B2
+S31508003C680CF94023034A0121204600F039F90020BF
+S31508003C7810BD00BFCC03002000487047CC030020C5
+S31508003C8808B500F57171D0F80004FCF7D2FE08BD36
+S31508003C9808B5C1EBC10300EB8303D3F80822D0F8B3
+S31508003CA80004FCF7F2FE08BD08B5C1EBC10300EB3A
+S31508003CB883039A6CD0F80004FCF720FF08BD08B502
+S31508003CC8D0F80004FCF7B6FF08BD000010B5044696
+S31508003CD8C3684BB1022B01D1012106E0912107489F
+S31508003CE800F006F9012100E00021D4F80004FCF7E9
+S31508003CF88AFFD4F80004FCF75DFF10BD6C52000873
+S31508003D0810B50446D0F80004FCF780FF2268D2F8FC
+S31508003D18003E43F00103C2F8003E236A23B1044A71
+S31508003D28136943F006031361FFF7B0FD10BD00BF22
+S31508003D3800ED00E010B50446FFF7A9FDD4F8000425
+S31508003D48FCF76DFF10BD08B5D0F80004FCF782FF34
+S31508003D5808BD08B5D0F80004FCF77AFF08BD10B509
+S31508003D6804460120FFF791FDD4F80004FCF774FF18
+S31508003D7810BD10B504460020FFF787FDD4F80004E7
+S31508003D88FCF76CFF10BD000002780AB100207047E6
+S31508003D9810B503461748C0F80034C3F8C4024FF0F4
+S31508003DA8A0430360062343600222C260002303611E
+S31508003DB882610122C26103624362C3620363FDF73B
+S31508003DC82CF880B90B4C80212046FFF757FC402277
+S31508003DD800212046FFF72CFC802201212046FFF708
+S31508003DE827FC002010BD40F22511034800F080F892
+S31508003DF8E8E700BF100400206C520008D0F8C43267
+S31508003E0811F0800F08D101F07F01C1EBC10103EB66
+S31508003E18810191F8FE01704701F07F01C1EBC101EC
+S31508003E2803EB810191F83E00704708B5D0F8C40243
+S31508003E38FDF7BBFC08BD032805D8DFE800F0050434
+S31508003E480205012070470320704708B5D0F8C40258
+S31508003E58FDF7B7F8FFF7EFFF08BD08B5D0F8C402B5
+S31508003E68FDF77AF8FFF7E7FF08BD08B5D0F8C402EA
+S31508003E78FDF787F8FFF7DFFF08BD08B594461A4629
+S31508003E886346D0F8C402FDF7E3FBFFF7D4FF08BD85
+S31508003E9808B5D0F8C402FDF720FCFFF7CCFF08BD2B
+S31508003EA808B5D0F8C402FDF7B8FCFFF7C4FF08BD8B
+S31508003EB808B5D0F8C402FDF7F4FCFFF7BCFF08BD47
+S31508003EC808B5D0F8C402FDF7AFFBFFF7B4FF08BD85
+S31508003ED808B5D0F8C402FDF771FCFFF7ACFF08BDBA
+S31508003EE808B5D0F8C402FDF731FCFFF7A4FF08BDF2
+S31508003EF808B500F005F8FCE708B5FFF7BDFC08BDEE
+S31508003F0808B5FFF7BEFC08BD08B500F005FFFFF7C2
+S31508003F18F3FF00F041FB01F023F900F057F800F031
+S31508003F2849F808BD08B5FFF7EBFF00F047FB00F0B6
+S31508003F3861F800F001F808BD08B500F0DFF80128B7
+S31508003F4803D00B4B1B78012B00D008BD00F044FBAF
+S31508003F58084B1B68084A1268134403F5FA73984213
+S31508003F68F3D3034B00221A7000F0DAFEEDE700BF20
+S31508003F7818080020140800201C080020014B1860A7
+S31508003F88704700BF14080020014B1868704700BF27
+S31508003F981408002008B5054B1B78012B00D008BD6E
+S31508003FA800F01AFB024B1860F9E700BF1808002052
+S31508003FB81C08002008B5044B01221A70FFF7EAFF0F
+S31508003FC8FFF7BAFF08BD00BF1808002010B500F0B3
+S31508003FD847FA00F0FFFB064C0123237000F02CFB80
+S31508003FE80023237000F092FF0223237010BD00BF40
+S31508003FF88601002000B583B00DF10701184800F0C6
+S3150800400865FC012810D00DF10701154800F04EFB94
+S31508004018012812D00DF10701114800F0F5FF012813
+S3150800402814D003B05DF804FB0E4B01221A709DF8F4
+S3150800403807100B4800F036FAE5E70A4B00221A7013
+S315080040489DF80710064800F02DFAE3E7054B02220B
+S315080040581A709DF80710024800F024FAE1E700BF35
+S31508004068200800208601002008B500F093FF08BD47
+S3150800407838B504460D460E4B1B78012B09D00C4B58
+S315080040881B7853B10A4B1B78022B0BD000F002FAA7
+S3150800409838BDC9B200F0F4FBF1E7E9B2204600F0F2
+S315080040A8E9FAEFE7E9B2204600F084FFEEE700BF39
+S315080040B886010020074B1B78022B07D0032B07D055
+S315080040C8012B01D081207047082070473F20704790
+S315080040D80020704786010020074B1B78022B07D063
+S315080040E8032B07D0012B01D0812070470820704781
+S315080040F83F207047002070478601002008B500F069
+S31508004108C1F900B1012008BD024B002283F88220BC
+S31508004118704700BFA4080020034BFE221A70587087
+S315080041280222A3F886207047A4080020037842785C
+S3150800413843EA0223827843EA0243C07843EA0060E6
+S3150800414870470870C0F307234B70C0F307438B709A
+S31508004158000EC8707047000010B5064C002384F896
+S315080041688130FFF7D1FFFF2323700123A4F8863097
+S3150800417810BD00BFA4080020074BFF221A700022B2
+S315080041885A7093F882109970DA701A715A71062261
+S31508004198A3F88620704700BFA408002008B50020A9
+S315080041A8FFF7BAFF08BD000010B5094CFF232370B6
+S315080041B8084BC4F8883000236370A370E370211D88
+S315080041C80720FFF7BEFF0823A4F8863010BD00BFF6
+S315080041D8A40800207852000810B5064CFF2323705F
+S315080041E80430FFF7A3FFC4F888000123A4F8863033
+S315080041F810BD00BFA408002008B53120FFF78CFFC2
+S3150800420808BD000038B5084CFF23237000256570E3
+S31508004218A570FFF74FFFE07025716571A571072333
+S31508004228A4F8863038BD00BFA408002038B5FFF7C3
+S315080042386BFF0F4C012584F88150FF232370002358
+S31508004248637010226270A370FFF734FFE070FFF7FF
+S3150800425843FF2071FFF740FFC0F307206071A5717F
+S31508004268E5710823A4F8863000F07AFF38BD00BF48
+S31508004278A408002038B50446FFF71CFF6278904268
+S3150800428812D90B4DD5F88810681C00F069FDFF2374
+S315080042982B706278D5F888301344C5F88830637867
+S315080042A80133A5F8863038BD2220FFF735FFFAE72F
+S315080042B8A408002038B50446FFF7FCFE6378984240
+S315080042C817D9201DFFF732FF01460C4DC5F888009F
+S315080042D86278681C00F044FDFF232B706278D5F8D5
+S315080042E888301344C5F8883063780133A5F88630D2
+S315080042F838BD2220FFF710FFFAE700BFA408002000
+S31508004308F8B505461746002406E015F8013B1C448F
+S31508004318E4B2FFF7F5FD31464E1E0029F5D13C609B
+S315080043280120F8BD30B583B0002501950B4CFF2355
+S3150800433823700430FFF7FAFE014601AAD4F888006C
+S31508004348FFF7DEFF6070211D0198FFF7FAFEA570DA
+S31508004358E5700823A4F8863003B030BDA408002009
+S3150800436838B504460E4BD3F88850FFF7A3FE621CEF
+S31508004378411E284600F0F8FE70B1094CFF23237049
+S31508004388FFF798FE0138D4F888300344C4F8883013
+S315080043980123A4F8863038BD3120FFF7BDFEFAE7B9
+S315080043A8A408002010B50446FFF784FE0138637890
+S315080043B8984216DD134BFF221A700122A3F88620AD
+S315080043C8617891B1A21C0F4BD3F8880000F0CCFE97
+S315080043D898B161780B4AD2F888300B44C2F888300D
+S315080043E810BD2220FFF798FEFAE700F0CDFE002858
+S315080043F8F6D13120FFF790FEF2E73120FFF78CFE61
+S31508004408EEE700BFA408002010B50B4BD3F8884088
+S315080044180430FFF78BFE0146204600F0A9FE30B1AE
+S31508004428054BFF221A700122A3F8862010BD3120F9
+S31508004438FFF772FEFAE700BFA408002008B500F0E7
+S315080044486FFC034BFF221A700122A3F8862008BDC9
+S31508004458A408002008B589B2FFF70AFE08BD0000BF
+S31508004468074B002283F88120C3F8882083F8842024
+S31508004478A3F8862083F8832083F88220704700BF34
+S31508004488A4080020024B93F8810000B10120704768
+S31508004498A4080020024B002283F88420704700BF36
+S315080044A8A408002008B50378FF2B24D0354A92F8CB
+S315080044B88120012A2BD1C93B352B53D8DFE803F0D5
+S315080044C84052524F52524C434946525252525252F5
+S315080044D852525252525252525252525252525252A6
+S315080044E852525252525252525252312B282E52522C
+S315080044F8523452373A3DFFF799FE224B93F88430E7
+S31508004508012B33D01F4BB3F98610002932DC08BDBE
+S31508004518FFF7B0FEF1E7FFF7CDFEEEE7FFF75CFE23
+S31508004528EBE7FFF7FFFEE8E7FFF73EFEE5E7FFF7ED
+S3150800453835FEE2E7FFF720FEDFE7FFF70DFEDCE7CB
+S31508004548FFF70EFFD9E7FFF72DFFD6E7FFF75AFE65
+S31508004558D3E7FFF759FFD0E7FFF770FFCDE7FFF777
+S315080045684BFECAE72020FFF7D7FDC6E71020FFF75E
+S31508004578D3FDC7E71846012380F88430FFF76AFF9A
+S31508004588C5E700BFA40800204FF0E02300221A61FF
+S315080045985A619A617047000008B5FFF7F5FF4FF0B2
+S315080045A8E023044A5A6100229A6105211961024BDF
+S315080045B81A6008BDBF4B0300300900204FF0E023FE
+S315080045C81B6913F4803F03D0024A1368013313604A
+S315080045D8704700BF3009002008B5FFF7EFFF014B09
+S315080045E8186808BD3009002008B5FFF7F5FF08BDAB
+S315080045F8054BDB6913F0200F04D0034B5B6A037085
+S3150800460801207047002070470048004010B5094B44
+S315080046189862FFF7E1FF00F10A04064BDB6913F01D
+S31508004628800F05D1FFF76CFCFFF7D6FFA042F4D937
+S3150800463810BD00BF0048004010B588B00C4C236870
+S3150800464823F0010323604FF4614301930023029387
+S31508004658039304930C2205920693079301A920460F
+S31508004668FDF794FE236843F00103236008B010BDE4
+S315080046780048004070B506460D46812904D82846E4
+S31508004688FFF7C4FF00240BE083210748FFF730FC37
+S31508004698F5E7FFF735FC305DFFF7B8FF0134A4B23C
+S315080046A8ABB2A342F5D870BD8052000870B5254B49
+S315080046B81C78BCB92448FFF79BFF012801D020467F
+S315080046C870BD214B1B78013BDBB2802BF7D8FFF76F
+S315080046D883FF1E4B18601E4B00221A70194B0122C5
+S315080046E81A70ECE706460D46194B1B78013316482F
+S315080046F81844FFF77DFF0446012815D1144B1A788C
+S315080047080132D2B21A70104B1B789A4201D0002493
+S31508004718D5E71049304600F023FB0A4B00221A70E9
+S315080047280B4B1B782B70CAE7FFF756FF074B1B681E
+S31508004738C833984203D90024024B1C70BFE70024EB
+S31508004748BDE700BFB609002034090020B8090020D3
+S31508004758B7090020350900202DE9F04184B0044640
+S315080047680D46174698466846FDF74AFF0299174BBD
+S31508004778A3FB01318909002301E00133DBB2112BC0
+S315080047881FD8134A12F8130002EB4302527800EBBB
+S31508004798020C0CFB044CB1FBFCFE0CFB1E16002E8F
+S315080047A8EBD11FFA8EFCA5F800C00CF1FF3C1FFAE6
+S315080047B88CFCBCF5806FE0D2387088F800200120A0
+S315080047C800E0002004B0BDE8F08100BFD34D6210B8
+S315080047D8D052000870B58CB00023ADF82E308DF88D
+S315080047E82D308DF82C300BAB0DF12D020DF12E0165
+S315080047F84FF4FA70FFF7B0FF002835D01D4C1E4B52
+S315080048082360002525766576A5760126E67625773A
+S315080048186577A560E5609DF82D30013B1B0423618B
+S315080048289DF82C30013B1B056361BDF82E3063608B
+S315080048382046FDF7FEFA0695079508964CF6E043D6
+S31508004848019302954FF6E0730393042304930595A1
+S3150800485809960E230A9301A92046FDF791FB2046DF
+S31508004868FDF72AFC0CB070BDB5210448FFF740FBDC
+S31508004878C4E700BFBC09002000640040A85200082D
+S3150800488810B588B0024640F2E173029300230493F8
+S315080048980593069101AB02A90B48FDF73BFC08B145
+S315080048A808B010BDFFF798FE00F1320401990648D2
+S315080048B8FDF7AEFC0028F3D0FFF722FBFFF78CFEC6
+S315080048C8A042F3D9ECE700BFBC09002010B588B0B0
+S315080048D803460C4601AA00210848FDF7ACFC50B966
+S315080048E8019A40F267639A4206D1039B23B9059B4E
+S315080048F82370012000E0002008B010BDBC09002084
+S315080049080120704738B50546002401E00134E4B2B1
+S31508004918062C17D8FFF7F4FA04EB44030A4A52F8A8
+S315080049282330AB42F2D804EB4402074901EB820272
+S3150800493852681344AB42E9D904EB440001EB800002
+S31508004948007A00E0FF2038BD1C53000808B5C1F3FB
+S31508004958080353B903688B4209D040F8041B4FF47F
+S31508004968007200F0FDF9012008BD0020FCE70120CF
+S31508004978FAE72DE9F0410746FFF7C2FF804610B966
+S315080049884046BDE8F081FDF7BBF900247F2C15D811
+S315080049983E6806EB840807EB84035D68FFF7B0FA00
+S315080049A82A46002341460220FDF7FEF9804640B90B
+S315080049B856F82430AB4206D10134E7E74FF0010830
+S315080049C801E04FF00008FDF7B3F9D9E738B50D4609
+S315080049D80C4B984211D004460B4B994207D1094C07
+S315080049E829462046FFF7B2FF48B1204638BDFFF7EB
+S315080049F8C0FF0028F4D10024F7E7044CF0E70024A8
+S31508004A08F3E700BFE80B002000800008E40900204F
+S31508004A182DE9F04106460C4617461D46DFF8708014
+S31508004A2801EA08080368B3F1FF3F07D0336843452E
+S31508004A380AD13168641A3444043414E04146FFF74D
+S31508004A4885FF0028F2D11FE041463046FFF7BEFF32
+S31508004A5806460028EDD1002016E017F8013B04F8B1
+S31508004A68013B013D0FD0FFF74BFA311D611AB1F52D
+S31508004A78007FF2D308F500713046FFF7A7FF064610
+S31508004A8820B1041DE9E70120BDE8F0810020FBE715
+S31508004A9800FEFFFF0023062B36D870B51C4603EB2D
+S31508004AA843021A4901EB8202127A824205D001337F
+S31508004AB8DBB2062BF2D9002070BD04EB440251F88C
+S31508004AC8225001EB8204666815F0030F02D116F02E
+S31508004AD8030F04D040F2C3210D48FFF709FA002452
+S31508004AE805E02B68B3F1FF3F0CD104350134B4EB6C
+S31508004AF8960F05D214F0FF0FF3D1FFF701FAF0E786
+S31508004B080120D9E70020D7E7002070471C53000882
+S31508004B18F4520008F0B587B004460E460023019300
+S31508004B28884205D801252CB1072E04D9002502E0AC
+S31508004B380025F8E70025FFF7E3FE10B1012D02D09E
+S31508004B48284607B0F0BD00230293022305930123E4
+S31508004B580493FDF7D5F801E00134E4B2B4420FD85E
+S31508004B682046FFF797FF07460028F5D1FFF7C8F94B
+S31508004B78039401A902A8FEF713FD0028ECD03D46C8
+S31508004B88FDF7D6F82846DCE74FF0FF33024A1360EC
+S31508004B98024A1360704700BFE4090020E80B0020AA
+S31508004BA870B50D460139134B1B1A994201D90020D5
+S31508004BB870BD04461646FFF7A5FEFF2811D028192A
+S31508004BC80138FFF79FFEFF280BD00B4B23400B4AF3
+S31508004BD8934208D02B46324621460948FFF718FF64
+S31508004BE8E6E70020E4E72B46324621460548FFF764
+S31508004BF80FFFDDE7FFFF0F0800FEFFFF0080000834
+S31508004C08E4090020E80B00204A1E0D4B1B1A9A429D
+S31508004C1801D90020704770B505460C46FFF772FEA5
+S31508004C2806462C44601EFFF76DFEFF2818BFFF2EA8
+S31508004C3801D1002070BD01463046FFF76BFFF9E742
+S31508004C48FFFF0F0800B583B000230193134B1B68B9
+S31508004C58B3F1FF3F20D0114A5368019391680B447A
+S31508004C680193D1680B44019311690B440193516967
+S31508004C780B44019391690B440193D2691344019338
+S31508004C88DB4301930133019301AA04210448FFF782
+S31508004C9887FF03B05DF804FB0120FAE7E80B00205C
+S31508004CA8C88100080A4B1A68596811449A68114459
+S31508004CB8DA6811441A6911445A6911449A690A4406
+S31508004CC8D3F8C831D34201D0002070470120704775
+S31508004CD80080000808B50C4B1B68B3F1FF3F06D1E6
+S31508004CE80A4B1B68B3F1FF3F07D1012008BD0648E8
+S31508004CF8FFF73FFE0028F3D1F8E70448FFF739FE27
+S31508004D080028F3D00120F1E7E80B0020E409002089
+S31508004D18004870470080000808B500F03DFA08BD4D
+S31508004D2810B500F029FA00B910BDFEF797FD00285E
+S31508004D38FAD0FFF799F9FBF7ABFFFFF725FC00F068
+S31508004D481FFA054B0340054A936000F019FA4468B0
+S31508004D5800F024FAA047E7E780FFFF1F00ED00E010
+S31508004D6870B50D46044606E015F8013B04F8013B04
+S31508004D78FFF7C6F83246531E9EB2002AF4D170BD14
+S31508004D88094B03F11801002232B19A7400225A61BC
+S31508004D98064B054A1A6070479A74596118331831D0
+S31508004DA80132D2B2F0E700BF2C0E00205C0E0020BC
+S31508004DB80A4B1B6883B110B4084A5C6914601974F5
+S31508004DC89860D86000225A741860013908445860F7
+S31508004DD8987C5DF8044B7047FF2070475C0E0020EE
+S31508004DE838B504460D46012824D804EB4403164A68
+S31508004DF802EBC3035A7C1B7C9A4221D004EB44037A
+S31508004E08114A02EBC303DA6815705A7C01325A74E0
+S31508004E18DA680132DA605B689A4213D90A4B04EBFE
+S31508004E28440253F8322004EB440403EBC404E2605A
+S31508004E38012008E04FF4E0710448FFF759F8D4E771
+S31508004E48002000E0012038BD2C0E00207053000811
+S31508004E5808B50146024B1878FFF7C2FF08BD00BF20
+S31508004E68600E002038B504460D46012822D804EB02
+S31508004E784403144A02EBC303587C10B304EB4403F7
+S31508004E8802EBC3039A6812782A705A7C013A5A7454
+S31508004E989A6801329A605B689A4211D9094B04EB01
+S31508004EA8440253F8322004EB440403EBC404A2601A
+S31508004EB8012006E04FF4F1710348FFF719F8D6E721
+S31508004EC8012038BD2C0E00207053000808B501468D
+S31508004ED8024B1878FFF7C6FF08BD00BFA40E0020CE
+S31508004EE810B50446012806D804EB4404054800EB27
+S31508004EF8C404607C10BD40F202210348FEF7F8FF9F
+S31508004F08F2E700BF2C0E00207053000838B5FFF7EB
+S31508004F1837FF1A4C4021601CFFF74AFF2070184DCE
+S31508004F284021681CFFF744FF28702378FF2B1BD005
+S31508004F38FF2819D0134C002213492046FBF71AFDFF
+S31508004F4812492046FBF74CFD0120FEF79EFC204639
+S31508004F58FBF75AFDD4F8C402FCF742FBFFF714F82E
+S31508004F68B0F5FA6F05D338BD84210948FEF7C0FFA6
+S31508004F78E0E74FF4FA60FFF701F8F4E7600E00205F
+S31508004F88A40E0020E80E00200C0000208400002053
+S31508004F987053000810B5064CD4F8C402FCF732FB67
+S31508004FA82046FBF703FD0020FEF76FFC10BD00BF87
+S31508004FB8E80E002070B506460D463F2906D828464D
+S31508004FC8FFF746FF012806D100240BE0B9210D4852
+S31508004FD8FEF78EFFF3E7BD210A48FEF789FFF3E7D8
+S31508004FE80134A4B2ABB2A3420BD9FEF789FF305DF0
+S31508004FF8FFF72EFF0128F3D0C6210248FEF778FFEF
+S31508005008EEE770BD7053000870B506460D461F4B8F
+S31508005018D3F8C402FCF788F81D4B1C789CB91D48C0
+S31508005028FFF754FF012801D0204670BD194B1B789D
+S31508005038013BDBB23E2BF7D8154B01221A70164BEB
+S3150800504800221A70F0E7144B1B78013311481844EC
+S31508005058FFF73CFF0446012801D00024E4E70E4B7D
+S315080050681A780132D2B21A700A4B1B789A4201D0C2
+S315080050780024D9E709493046FFF772FE044B002297
+S315080050881A70054B1B782B70CEE700BFE80E002078
+S31508005098F8110020B8110020F9110020B9110020D4
+S315080050A830B583B0144B1878FFF71AFF08B30546CE
+S315080050B8402800D94025002405E09DF807200F4B15
+S315080050C81A550134E4B2A5420DD90DF107010A4B68
+S315080050D81878FFF7C7FE0128EFD04FF4A3710848E0
+S315080050E8FEF706FFE9E72B46044A81210548FEF73D
+S315080050F8EFFE03B030BD00BF600E0020EC0D0020A7
+S3150800510870530008E80E002070B50446FEF7B4FD93
+S31508005118064621460F48FEF788FE85B2002401E0B8
+S315080051280134A4B2AC420CD2315D0B4B1878FFF7A8
+S3150800513857FE0128F4D04FF4B4710848FEF7D8FE94
+S31508005148EEE7FEF799FD0246402301210148FEF7DE
+S31508005158C7FE70BDE80E0020A40E00207053000894
+S3150800516808B5FFF711FD08BD08B5FFF719FD08BD15
+S3150800517808B5FFF749FD08BD08B5FFF793FD08BD53
+S3150800518808B5FFF7C5FD08BD08B5FFF75BFD00B90B
+S3150800519808BDFFF79FFDFBE772B6704762B6704712
+S315080051A870B50D4D0D4C641BA4100026A64209D1F6
+S315080051B80B4D0C4C00F018F8641BA4100026A642E8
+S315080051C805D170BD55F8043B98470136EEE755F802
+S315080051D8043B98470136F2E79853000898530008A5
+S315080051E8985300089C530008F8B500BFF8BC08BCDB
+S315080051F89E467047F8B500BFF8BC08BC9E4670477F
+S315080052080000000000000000010203040607080960
+S31508005218000000000102030457696E5553422042F4
+S31508005228756C6B2044657669636500004F70656E1A
+S31508005238424C542055736572000000004465666147
+S31508005248756C740057696E5553422042756C6B200D
+S31508005258496E746572666163650000006D61696E02
+S315080052682E630000757362645F636F6E662E630053
+S315080052784F70656E424C54002E2E2F2E2E2F2E2E32
+S315080052882F536F757263652F41524D434D375F53E0
+S31508005298544D333246372F72733233322E63000039
+S315080052A82E2E2F2E2E2F2E2E2F536F757263652FA7
+S315080052B841524D434D375F53544D333246372F636A
+S315080052C8616E2E6300000000050206020603070346
+S315080052D80803090309040A040B040C040C050D0544
+S315080052E80E050F050F061006100710082E2E2F2E6E
+S315080052F82E2F2E2E2F536F757263652F41524D43ED
+S315080053084D375F53544D333246372F666C61736891
+S315080053182E630000008000080080000001000000DD
+S315080053280000010800800000020000000080010853
+S3150800533800800000030000000000020800000200C8
+S31508005348040000000000040800000400050000002E
+S3150800535800000808000004000600000000000C0809
+S3150800536800000400070000002E2E2F2E2E2F2E2EAA
+S315080053782F536F757263652F41524D434D375F53EF
+S31508005388544D333246372F7573622E63000000007A
+S30908005398ED0100080D
+S3090800539CC90100082D
+S315080053A00024F4000100000010000000B9360008CF
+S315080053B0C536000895370008713700085D370008BC
+S315080053C0B1370008D5370008D1360008050F210087
+S315080053D0011C100500DF60DDD88945C74C9CD265E5
+S315080053E09D9E648A9F000003069E0001000000003F
+S315080053F01201010200000040501DAC6000010102CC
+S3150800540003010000040309041A0300000000000059
+S31508005410000000000000000000000000000000007E
+S3150800542000000000513C0008393C0008B93B000860
+S315080054300000000000000000A13B0008AB3B00088C
+S315080054408D3B00080000000000000000000000007E
+S31508005450753B000800000000813B00080902200097
+S31508005460010100C0320904000002FF000000070520
+S3150800547081024000FF070501024000FF0A061001ED
+S3150800548000000040010000000A00000000000306BA
+S315080054909E001400030057494E5553420000000071
+S315080054A000000000000080000400010028004400FD
+S315080054B06500760069006300650049006E007400A7
+S315080054C065007200660061006300650047005500CC
+S315080054D04900440000004E007B00380030003700C9
+S315080054E0390039003900430033002D0045003400E7
+S315080054F0450030002D0034003000450041002D00E5
+S3150800550038003100380038002D00340038004500D6
+S3150800551038003500320042003500340046003200BB
+S30D0800552042007D0000000400B2
+S70508000209E7
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/makefile b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/makefile
index 9a6797cae..9a722b4f4 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/makefile
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/makefile
@@ -41,7 +41,8 @@ PROJ_NAME=openblt_stm32f746
# format, open the directory in the Windows command prompt and run the following command:
# cmd /c for %A in ("%cd%") do @echo %~sA
#TOOL_PATH=/opt/gcc-arm-none-eabi-8-2018-q4-major/bin/
-TOOL_PATH=C:/PROGRA~2/GNUTOO~1/82018-~1/bin/
+#TOOL_PATH=C:/PROGRA~2/GNUTOO~1/82018-~1/bin/
+TOOL_PATH=
#|--------------------------------------------------------------------------------------|
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h
index 13647fbd2..79c4ef8cf 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c
index 344676bb5..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,10 +69,11 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
-#define USB_SIZ_BOS_DESC 0x0C
+#define USB_SIZ_BOS_DESC 0x21
/* USER CODE BEGIN PRIVATE_DEFINES */
@@ -123,9 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
/**
* @}
@@ -145,7 +147,7 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
, USBD_FS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};
@@ -158,13 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
-#if (USBD_LPM_ENABLED == 1)
- 0x01, /*bcdUSB */ /* changed to USB version 2.01
- in order to support LPM L1 suspend
- resume test of USBCV3.0*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
#else
0x00, /*bcdUSB */
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -174,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -184,27 +185,36 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
/* USB_DeviceDescriptor */
/** BOS descriptor. */
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
#if defined ( __ICCARM__ ) /* IAR Compiler */
#pragma data_alignment=4
#endif /* defined ( __ICCARM__ ) */
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
- 0x5,
- USB_DESC_TYPE_BOS,
- 0xC,
- 0x0,
- 0x1, /* 1 device capability*/
- /* device capability*/
- 0x7,
- USB_DEVICE_CAPABITY_TYPE,
- 0x2,
- 0x2, /* LPM capability bit set*/
- 0x0,
- 0x0,
- 0x0
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
};
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -367,7 +377,7 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
/**
* @brief Return the BOS descriptor
* @param speed : Current device speed
@@ -380,7 +390,7 @@ uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
*length = sizeof(USBD_FS_BOSDesc);
return (uint8_t*)USBD_FS_BOSDesc;
}
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @brief Create the serial number string descriptor
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec
index fb1232156..41e565d5a 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec
@@ -1,33 +1,33 @@
S01900006F70656E626C745F73746D3332663734362E73726563F8
-S3150800000050140020B5620008DD620008E1620008AD
-S31508000010E5620008E9620008ED62000800000000D9
-S31508000020000000000000000000000000F162000867
-S31508000030F562000800000000F9620008FD62000889
-S315080000400163000805630008096300080D630008DA
-S315080000501163000815630008196300081D6300088A
-S315080000602163000825630008296300082D6300083A
-S315080000703163000835630008396300083D630008EA
-S315080000804163000845630008496300084D6300089A
-S315080000905163000855630008596300085D6300084A
-S315080000A06163000865630008696300086D630008FA
-S315080000B07163000875630008796300087D630008AA
-S315080000C08163000885630008896300088D6300085A
-S315080000D09163000895630008996300089D6300080A
-S315080000E0A1630008A5630008A9630008AD630008BA
-S315080000F0B1630008B5630008B9630008BD6300086A
-S31508000100C1630008C5630008C9630008CD63000819
-S31508000110D1630008D5630008D9630008DD630008C9
-S31508000120E1630008E5630008E9630008ED63000879
-S31508000130F1630008F5630008F9630008FD63000829
-S315080001400164000805640008096400080D640008D5
-S315080001501164000815640008196400081D64000885
-S315080001602164000825640008296400082D64000835
-S31508000170316400083564000839640008000000008E
-S315080001803D640008416400084564000849640008A5
-S315080001904D64000851640008556400085964000855
-S315080001A05D64000861640008656400086964000805
-S315080001B06D640008716400087564000879640008B5
-S315080001C07D640008816400080EB418B50400089818
+S31508000000E01500200D65000835650008396500080B
+S315080000103D650008416500084565000800000000C8
+S31508000020000000000000000000000000496500080C
+S315080000304D6500080000000051650008C55C000811
+S3150800004055650008596500085D6500086165000882
+S3150800005065650008696500086D6500087165000832
+S3150800006075650008796500087D65000881650008E2
+S3150800007085650008896500088D6500089165000892
+S3150800008095650008996500089D650008A165000842
+S31508000090A5650008A9650008AD650008B1650008F2
+S315080000A0B5650008B9650008BD650008C1650008A2
+S315080000B0C5650008C9650008CD650008D165000852
+S315080000C0D5650008D9650008DD650008E165000802
+S315080000D0E5650008E9650008ED650008F1650008B2
+S315080000E0F5650008F9650008FD6500080166000861
+S315080000F005660008096600080D660008116600080E
+S3150800010015660008196600081D66000821660008BD
+S3150800011025660008296600082D660008316600086D
+S3150800012035660008396600083D660008416600081D
+S3150800013045660008496600084D66000851660008CD
+S3150800014055660008596600085D660008616600087D
+S3150800015065660008696600086D660008716600082D
+S3150800016075660008796600087D66000881660008DD
+S3150800017085660008896600088D660008000000008C
+S315080001809166000895660008996600089D6600084D
+S31508000190A1660008A5660008A9660008AD660008FD
+S315080001A0B1660008B5660008B9660008BD660008AD
+S315080001B0C1660008C5660008C9660008CD6600085D
+S315080001C0D1660008D56600080EB418B5040008986C
S315080001D0012817D1A06B30F48030A063E168DFF8FE
S315080001E030090140E160E06830F44010E0600F98A3
S315080001F0012803D1E06850F48010E060200000F088
@@ -272,13 +272,13 @@ S315080010D00020704700383C80410D0300007833EC4F
S315080010E00078F3EF0000F81F0B30544F38B50400B2
S315080010F000F044F8050014F1010F02D00448007806
S31508001100241800F03BF8401BA042FAD331BD00BFBB
-S31508001110BD00002080B500F00DF81348134908609B
+S315080011108501002080B500F00DF8134813490860D2
S31508001120002013490860052012490860002012496A
S31508001130086001BD00200F49086000200B490860BF
S3150800114000200B49086070470A480068C00304D5A8
S3150800115009480068401C08490860704780B5FFF7D1
S31508001160F3FF0548006802BDBF4B030014E000E02A
-S3150800117018E000E010E000E03810002080B5FFF726
+S3150800117018E000E010E000E0C411002080B5FFF799
S31508001180EDFF02BD38B58AB00400002C01D101205C
S31508001190CCE0256894F8BD03002805D1002084F822
S315080011A0BC03200000F06CFE032084F8BD03E86B46
@@ -534,8 +534,8 @@ S315080021301449086200201349486200201149C86200
S315080021400020104908630F48FFF71CF8002804D040
S3150800215040F22511094800F0AEFA80210948FFF738
S3150800216021FF402200210748FFF7ECFE80220121CB
-S315080021700448FFF7E7FE002002BD0000645F000880
-S3150800218010ED00E0C000002080B500210021D0F845
+S315080021700448FFF7E7FE002002BD000004610008DE
+S3150800218010ED00E08801002080B500210021D0F87C
S31508002190C402FFF7CDF8C0B200F099F8C0B202BD8C
S315080021A080B500210021D0F8C402FFF7D5F8C0B2E7
S315080021B000F08DF8C0B202BD80B500210021D0F82C
@@ -575,7 +575,7 @@ S315080023C00020704780B50322D0F8B832002B05D01C
S315080023D0C9B2D0F8B8221268904702001000C0B2FD
S315080023E002BD80B5D0F8B822002A04D0C9B2D0F808
S315080023F0B82252689047002002BD10B5040004F2C6
-S31508002400AA2000F039FD0120C4F89402B4F8B002FD
+S31508002400AA2000F04FFD0120C4F89402B4F8B002E7
S31508002410C4F8980294F8AA0210F01F00002803D006
S3150800242002280DD006D311E004F2AA21200000F0FC
S3150800243075F912E004F2AA21200000F0AEF90CE0CA
@@ -584,23 +584,23 @@ S3150800245011F080012000FFF7DAFEC0B210BD10B5FA
S31508002460040010000A00D2B2002A2CD114F5AA7270
S31508002470D4F89412032912D1D1689368994210D2DC
S315080024809368D1685B1A93609168D368994201D2C0
-S31508002490926800E0D2680100200000F056FD002096
+S31508002490926800E0D2680100200000F06CFD002080
S315080024A010BDD4F8B8020069002808D094F89C0238
S315080024B0032804D12000D4F8B812096988472000F7
-S315080024C000F04BFDEBE7D4F8B802806900280FD07E
+S315080024C000F061FDEBE7D4F8B802806900280FD068
S315080024D094F89C0203280BD1C9B22000D4F8B8227C
S315080024E0926990470100C9B20029D8D0C0B2D7E78F
S315080024F00320D5E710B5040010000A00D2B2002A5E
S3150800250056D114F11402D4F89412022944D1D16890
S31508002510936899420FD29368D1685B1A9360926860
-S315080025200100200000F009FD002300220021200000
+S315080025200100200000F01FFD0023002200212000EA
S31508002530FFF7B9FE30E0D0689168884217D1506835
S31508002540D168884213D35068D4F8981288420ED2BC
-S3150800255000220021200000F0F0FC0020C4F89802B8
+S3150800255000220021200000F006FD0020C4F89802A1
S315080025600023002200212000FFF79DFE14E0D4F886
S31508002570B802C068002808D094F89C02032804D141
S315080025802000D4F8B812C968884780212000FFF7D0
-S315080025903EFE200000F0ECFC94F8A002012805D1CC
+S315080025903EFE200000F002FD94F8A002012805D1B5
S315080025A02000FFF70DFF002084F8A002002010BDD0
S315080025B0D4F8B802406900280FD094F89C02032882
S315080025C00BD1C9B22000D4F8B8225269904701004D
@@ -618,1003 +618,1052 @@ S31508002670032908D1D0F8B812C969002903D0D0F8BF
S31508002680B812C9698847002002BD0020704700209B
S3150800269070470020704780B5012180F89C12D0F859
S315080026A0B812002905D04168C9B2D0F8B8225268D4
-S315080026B09047002002BD80B500F069FCFCE70000E9
+S315080026B09047002002BD80B500F07FFCFCE70000D3
S315080026C000690840884201D1012000E00020C0B21C
S315080026D0704780B54FF400510548FFF7F1FF002811
-S315080026E001D0002002E000F081FC012002BD0000BC
-S315080026F00008024080B5642000F053FC01BD80B597
-S3150800270000F052FC01BD7047704770470100087819
+S315080026E001D0002002E000F097FC012002BD0000A6
+S315080026F00008024080B5642000F069FC01BD80B581
+S3150800270000F068FC01BD7047704770470100087803
S31508002710491C097850EA012080B2704710B5002498
S315080027200A7812F06002002A09D0202A01D0402A2D
S315080027302ED1D0F8B8229268904704002AE04A7849
S31508002740002A19D0012A1DD0032A18D0052A09D033
S31508002750062A04D0082A0CD0092A06D015E000F06B
-S3150800276078F914E000F078FA11E000F0A4FA040011
-S315080027700DE000F027FB0AE000F043FB07E000F05D
-S315080027805FFB04E000F066FB01E000F08DFB01E072
-S3150800279000F08AFB2000C0B210BD70B505000E001F
+S3150800276078F914E000F08DFA11E000F0B9FA0400E7
+S315080027700DE000F03DFB0AE000F059FB07E000F031
+S3150800278075FB04E000F07CFB01E000F0A3FB01E030
+S3150800279000F0A0FB2000C0B210BD70B505000E0009
S315080027A00024307810F06000002803D0202801D0DB
S315080027B0402823D195F89C02401E022819D8307962
S315080027C0022811D231002800D5F8B822926890471D
S315080027D00400F08800280BD12000C0B2002807D1D9
-S315080027E0280000F0BAFB03E03100280000F05CFB8B
-S315080027F003E03100280000F057FB03E03100280011
-S3150800280000F052FB2000C0B270BD70B504000E0087
+S315080027E0280000F0D0FB03E03100280000F072FB5F
+S315080027F003E03100280000F06DFB03E031002800FB
+S3150800280000F068FB2000C0B270BD70B504000E0071
S315080028100025B188307810F0600000280CD02028F8
S3150800282002D0402840F00E8131002000D4F8B822AA
S3150800283092689047050009E17078002872D001284F
S315080028403AD0032840F0F98094F89C02022802D076
S31508002850032816D02BE00800C0B200280CD00800C8
S31508002860C0B2802808D0C9B22000FFF7D0FC80216A
-S315080028702000FFF7CCFC03E03100200000F014FB39
+S315080028702000FFF7CCFC03E03100200000F02AFB23
S3150800288019E0708800280ED10800C0B200280AD0C6
S315080028900800C0B2802806D0F088002803D1C9B243
-S315080028A02000FFF7B4FC200000F057FB03E03100DE
-S315080028B0200000F0F9FAC4E094F89C02022802D03D
+S315080028A02000FFF7B4FC200000F06DFB03E03100C8
+S315080028B0200000F00FFBC4E094F89C02022802D026
S315080028C0032816D029E00800C0B200280CD008005A
S315080028D0C0B2802808D0C9B22000FFF798FC802132
-S315080028E02000FFF794FC03E03100200000F0DCFA3A
+S315080028E02000FFF794FC03E03100200000F0F2FA24
S315080028F017E0708800280FD111F07F0F03D0C9B2F6
-S315080029002000FFF791FC200000F027FB3100200093
+S315080029002000FFF791FC200000F03DFB310020007D
S31508002910D4F8B8229268904703E03100200000F00E
-S31508002920C3FA8EE094F89C02022802D0032829D024
+S31508002920D9FA8EE094F89C02022802D0032829D00E
S315080029307EE00800C0B2002808D00800C0B280288F
-S3150800294004D03100200000F0AFFA75E0080609D57A
+S3150800294004D03100200000F0C5FA75E0080609D564
S31508002950C9B211F07F011420414304EB010010F1C4
S31508002960140108E0C9B211F07F011420414304EBB9
S31508002970010010F5AA71002008600222200000F06C
-S31508002980CFFA59E008060FD50A00D2B212F00F02A4
+S31508002980E5FA59E008060FD50A00D2B212F00F028E
S315080029901420424304EB0200808C002815D1310034
-S315080029A0200000F081FA47E00A00D2B212F00F02C6
+S315080029A0200000F097FA47E00A00D2B212F00F02B0
S315080029B01420424304EB0200B0F86401002804D155
-S315080029C03100200000F070FA36E008060AD50A0041
+S315080029C03100200000F086FA36E008060AD50A002B
S315080029D0D2B212F07F021420424304EB020010F137
S315080029E0140609E00A00D2B212F07F02142042430C
S315080029F004EB020010F5AA760800C0B2002803D03E
S31508002A000800C0B2802802D1002030600AE0C9B2AE
S31508002A102000FFF716FC002802D00120306001E0F4
-S31508002A200020306002223100200000F079FA03E02D
-S31508002A303100200000F038FA03E03100200000F0F1
-S31508002A4033FA03E03100200000F02EFA2800C0B265
+S31508002A200020306002223100200000F08FFA03E017
+S31508002A303100200000F04EFA03E03100200000F0DB
+S31508002A4049FA03E03100200000F044FA2800C0B239
S31508002A5070BDF8B504000D000020ADF80000002692
-S31508002A600027688880B2000AC0B201280AD0022866
-S31508002A7010D0032823D0062800F0A580072800F0E8
-S31508002A80B280C2E06946207CD4F8B4221268904726
-S31508002A900600BFE0207C002808D16846D4F8B812A2
-S31508002AA0896A884706000220707007E06846D4F8ED
-S31508002AB0B812C96A8847060002207070AAE0A8788A
-S31508002AC0002808D002282CD018D304284FD03BD38E
-S31508002AD005285FD071E0D4F8B4024068002807D012
-S31508002AE06946207CD4F8B42252689047060004E070
-S31508002AF02900200000F0D8F97F1C63E0D4F8B4025E
-S31508002B008068002807D06946207CD4F8B4229268E9
-S31508002B109047060004E02900200000F0C5F97F1C54
-S31508002B2050E0D4F8B402C068002807D06946207C73
-S31508002B30D4F8B422D2689047060004E029002000A1
-S31508002B4000F0B2F97F1C3DE0D4F8B4020069002811
-S31508002B5007D06946207CD4F8B4221269904706004B
-S31508002B6004E02900200000F09FF97F1C2AE0D4F831
-S31508002B70B4024069002807D06946207CD4F8B422FC
-S31508002B8052699047060004E02900200000F08CF9FD
-S31508002B907F1C17E0D4F8B4028069002807D069467C
-S31508002BA0207CD4F8B42292699047060004E02900F4
-S31508002BB0200000F079F97F1C04E02900200000F0CD
-S31508002BC073F97F1C26E0207C002806D16846D4F8D5
-S31508002BD0B812496B8847060004E02900200000F077
-S31508002BE063F97F1C16E0207C002808D16846D4F8D3
-S31508002BF0B812096B884706000720707004E02900A0
-S31508002C00200000F051F97F1C04E02900200000F0A4
-S31508002C104BF97F1CFFB2002F1DD1E888002817D07A
-S31508002C20BDF8000000280ED0BDF80000E9888842EB
-S31508002C3002D3E888ADF80000BDF800203100200076
-S31508002C4000F06EF907E02900200000F02DF902E0F7
-S31508002C50200000F082F9F1BD38B504008888002804
-S31508002C6025D1C888002822D1488880281FD28D7887
-S31508002C7015F07F0594F89C02032803D1200000F084
-S31508002C8013F917E084F89E522900C9B22000FFF70D
-S31508002C90F0FA200000F061F9EDB2002D03D0022011
-S31508002CA084F89C0206E0012084F89C0202E02000D9
-S31508002CB000F0FAF831BD70B505000E0000247088E2
-S31508002CC03F4908703E480078022805D3310028009D
-S31508002CD000F0EAF8032072E095F89C02022802D078
-S31508002CE0032821D05FE036480078002818D03448F9
-S31508002CF000786860324801782800FFF763FB040013
-S31508002D002000C0B2002804D03100280000F0CCF81A
-S31508002D1009E0280000F021F9032085F89C0202E06A
-S31508002D20280000F01AF948E02548007800280ED156
-S31508002D30022085F89C0222480078686020480178BD
-S31508002D402800FFF74EFB280000F007F92AE01C4888
-S31508002D5000786968884222D06968C9B22800FFF7F6
-S31508002D6040FB174800786860154801782800FFF787
-S31508002D7029FB04002000C0B200280CD0310028002E
-S31508002D8000F092F86968C9B22800FFF72AFB02200A
-S31508002D9085F89C0206E0280000F0DFF802E028002B
-S31508002DA000F0DBF809E03100280000F07DF804485F
-S31508002DB001782800FFF715FB03242000C0B270BD78
-S31508002DC04C10002080B5CA88012A02D000F06CF8A1
-S31508002DD016E090F89C22521E012A02D9921E08D0AB
-S31508002DE00CE000218160012210F1080100F098F83A
-S31508002DF006E00122011D00F093F801E000F054F806
-S31508002E0001BD80B590F89C22521E022A15D8CA88A0
-S31508002E10022A02D000F048F811E00121C160D0F87A
-S31508002E20A412002903D0C16851F00201C160022230
-S31508002E3010F10C0100F074F801E000F035F801BD5E
-S31508002E4080B54988012904D10121C0F8A41200F0EF
-S31508002E5084F801BD80B590F89C22521E022A08D833
-S31508002E604988012904D10021C0F8A41200F075F898
-S31508002E7001E000F019F801BD38B5040008782070A3
-S31508002E80481C01786170451C2800FFF73FFC6080EC
-S31508002E90681C451C2800FFF739FCA080681C401CEC
-S31508002EA0FFF734FCE08031BD10B504008021200016
-S31508002EB0FFF7ADF900212000FFF7A9F910BDF8B515
-S31508002EC004000D0017000026002C1ED0200000F07C
-S31508002ED01DF84000801C388038783100C9B2685423
-S31508002EE0761C03203100C9B26854761C0AE02078A3
-S31508002EF03100C9B26854641C761C00203100C9B27E
-S31508002F006854761C20780028F1D1F1BD0200002013
-S31508002F1001E0401C521C11780029FAD1C0B2704752
-S31508002F2080B513000222C0F894228361C3610A00A7
-S31508002F300021FFF7ABF9002002BD80B513000A0097
-S31508002F400021FFF7A3F9002002BD80B513000A008F
-S31508002F500021FFF7A8F9002002BD80B50421C0F8BA
-S31508002F609412002300220021FFF790F9002002BDE9
-S31508002F7080B50521C0F89412002300220021FFF72E
-S31508002F8092F9002002BD80B5FFF7B4FB01BD80B5FC
-S31508002F90FFF7B5FB01BD0000816170470904816137
-S31508002FA0704715490880704780B5FEF7D7F813496A
-S31508002FB00968884219D312480078002807D10120E9
-S31508002FC00F49087080210F48FFF7E6FF06E000204A
-S31508002FD00B49087080210B48FFF7E0FFFEF7BEF8A3
-S31508002FE00549098840180549086001BD80B5802152
-S31508002FF00448FFF7D3FF01BD44100020301000201D
-S31508003000471000200004024038B50400002C01D106
-S315080030100120AEE094F82000002802D1200000F03C
-S31508003020B0FA2068006830F0020021680860FEF7F0
-S31508003030A5F805002068406880070DD5FEF79EF8BC
-S31508003040401B0B28F6D3606A50F4003060620520F6
-S3150800305084F8200001208CE02068006850F0010008
-S3150800306021680860FEF78AF8050020684068C007EE
-S315080030700DD4FEF783F8401B0B28F6D3606A50F48C
-S3150800308000306062052084F82000012071E0207E6F
-S31508003090012806D12068006850F080002168086081
-S315080030A005E02068006830F0800021680860607ECE
-S315080030B0012806D12068006850F0400021680860A1
-S315080030C005E02068006830F0400021680860A07EAE
-S315080030D0012806D12068006850F0200021680860A1
-S315080030E005E02068006830F0200021680860E07E6E
-S315080030F0012806D12068006830F0100021680860B1
-S3150800310005E02068006850F0100021680860207FFC
-S31508003110012806D12068006850F008002168086078
-S3150800312005E02068006830F0080021680860607FC4
-S31508003130012806D12068006850F00400216808605C
-S3150800314005E02068006830F0040021680860A1687E
-S31508003150E068014320690143606901436068401ED5
-S3150800316001432068C16100206062012084F82000C4
-S31508003170002032BD30B4026890F820201300DBB27C
-S31508003180012B03D0D2B2022A40F07F80594AD2F8E6
-S31508003190000250F00100C2F80002D2F8000230F432
-S315080031A07C50C2F80002D2F800024B6A50EA0320AB
-S315080031B0C2F8000201200B7D13F01F0310FA03F377
-S315080031C0D2F81C029843C2F81C02C869002816D116
-S315080031D0D2F80C029843C2F80C02486902EBC00008
-S315080031E0CC684D68C5EA0444C0F84042486902EB19
-S315080031F0C0008C680D68C5EA0444C0F84442C86932
-S31508003200012816D1D2F80C021843C2F80C024869F4
-S3150800321002EBC0000C684D68C5EA0444C0F8404299
-S31508003220486902EBC0008C68CD68C5EA0444C0F85A
-S3150800323044428869002805D1D2F804029843C2F8A6
-S31508003240040204E0D2F804021843C2F8040208692A
-S31508003250002805D1D2F814029843C2F8140204E0F3
-S31508003260D2F814021843C2F81402086A012804D1D5
-S31508003270D2F81C020343C2F81C32D2F800024008F6
-S315080032804000C2F80002002004E0416A51F480219F
-S315080032904162012030BC704738B5040094F820001C
-S315080032A0012821D1022084F82000206800684008FF
-S315080032B0400021680860FDF761FF05002068406846
-S315080032C0C0070DD5FDF75AFF401B0B28F6D3606AD9
-S315080032D050F400306062052084F82000012008E0E0
-S315080032E000206062002004E0606A50F400206062FA
-S315080032F0012032BD0064004070B490F82050046884
-S31508003300A6688C68002CFFD02C00E4B2012C02D0F1
-S31508003310EDB2022D6ED116F0E05F65D0C6F30164FA
-S31508003320032C05D3416A51F400014162012066E08D
-S315080033300125A5401D608B68002B09D10B68CD6857
-S3150800334055EA4355036826013344C3F880510AE019
-S315080033504B688D6855EAC305CB681D43036826018B
-S315080033603344C3F880510B69056826013544C5F80E
-S315080033708431097D01290BD1016823011944D1F84B
-S31508003380841151F48071036825012B44C3F8841114
-S31508003390D17993791B0453EA0163517953EA0123DE
-S315080033A011790B43016825012944C1F88C31D1787C
-S315080033B093781B0453EA0163517853EA0123117881
-S315080033C00B43016822011144C1F8883101682201C2
-S315080033D01144D1F8801151F001010068220110440E
-S315080033E0C0F8801100200AE0416A51F400114162D8
-S315080033F0012004E0416A51F480214162012070BC39
-S31508003400704710B40200002092F820301C00E4B285
-S31508003410012C02D0DBB2022B07D11268926812EA9D
-S315080034208162B2EB816F00D0012010BC704730B4C6
-S3150800343090F820402500EDB2012D03D0E4B2022C0D
-S3150800344040F0988000290AD10468E46814F0030F54
-S3150800345010D1416A51F40011416201208FE00468DD
-S31508003460246914F0030F05D1416A51F40011416231
-S31508003470012084E004680D012C44D4F8B04114F00E
-S31508003480040494609468002C07D104680D012C4448
-S31508003490D4F8B041640D146006E004680D012C44AC
-S315080034A0D4F8B041E408546004680D012C44D4F8FB
-S315080034B0B04114F00204D46004680D012C44D4F819
-S315080034C0B44114F00F04146104680D012C44D4F8B7
-S315080034D0B441C4F30724946104680D012C44D4F85C
-S315080034E0B441240C546102680C012244D2F8B82174
-S315080034F01A7002680C012244D2F8B821120A5A70CE
-S3150800350002680C012244D2F8B821120C9A7002689B
-S315080035100C012244D2F8B821120EDA7002680C01A6
-S315080035202244D2F8BC211A7102680C012244D2F84E
-S31508003530BC21120A5A7102680C012244D2F8BC2135
-S31508003540120C9A7102680C012244D2F8BC21120EA0
-S31508003550DA71002906D10168C96851F020010068AE
-S31508003560C16005E00168096951F020010068016140
-S31508003570002004E0416A51F480214162012030BCF8
-S3150800358070477047DFF80805006850F00100DFF85B
-S31508003590001508607047DFF8F8040068400810F066
-S315080035A001007047DFF8E814096831F0F80151EABC
-S315080035B0C001DFF8DC0401607047DFF8D00400685A
-S315080035C0400810F001007047DFF8CC04006810F0DE
-S315080035D00C007047DFF8C004006810F0F000704770
-S315080035E0DFF8B404006810F4E0507047DFF8A80468
-S315080035F0006810F4604070470100DFF8A004006816
-S31508003600084050EA014070470100DFF8900400685E
-S31508003610084050EA01407047DFF874040068400E1D
-S3150800362010F001007047DFF87804006810F4800095
-S315080036307047DFF86C040068C0F388107047DFF83D
-S315080036406004006810F440307047DFF854040068DE
-S3150800365010F03F007047DFF838040068C00E10F01D
-S3150800366001007047DFF828040068400F10F00100D9
-S31508003670704780B5FFF786FFFFF78DFF0128FBD15E
-S315080036800020DFF814140860DFF8040400680090CE
-S315080036900099DFF81804014000910098DFF8F0134C
-S315080036A008601020FFF77EFFFFF7B6FF0028FBD162
-S315080036B0FFF7D1FF0028FBD1FFF7D4FF0028FBD185
-S315080036C0DFF8EC03DFF8D8130860DFF8E803DFF863
-S315080036D0D4130860DFF8DC03DFF8CC130860DFF8E2
-S315080036E0D803006830F4FE40DFF8CC130860DFF832
-S315080036F0C803006850F47F00DFF8BC130860DFF8E1
-S315080037009403006840084000DFF888130860DFF873
-S315080037108403006850F08070DFF878130860002092
-S3150800372002BD10B5040000F05CF92060206800F0C6
-S315080037306CF96060606800F073F9A060606800F07A
-S3150800374079F9E06010BD10B50024032824D1FFF7ED
-S3150800375053FFDFF86813401A04D0401E06D0401EF7
-S315080037600BD011E000F03DF904008DE0FFF713FFE0
-S31508003770002801D0DFF8484386E0FFF71EFF00283F
-S3150800378001D04FF400447FE000F02BF900F03DF93A
-S3150800379000F050F9040077E00C2824D1FFF72CFF3D
-S315080037A0DFF82013401A04D0001F06D0001F0BD0E4
-S315080037B011E000F016F9040066E0FFF7ECFE0028B9
-S315080037C001D0DFF8FC425FE0FFF7F7FE002801D0E2
-S315080037D04FF4004458E000F004F900F016F900F040
-S315080037E01FF9040050E0B0F5406F27D1FFF704FF3A
-S315080037F0DFF8D412884207D0DFF8D012884207D003
-S31508003800B0F10C2F0BD011E000F0EBF804003BE010
-S31508003810FFF7C1FE002801D0DFF8A44234E0FFF725
-S31508003820CCFE002801D04FF400442DE000F0D9F872
-S3150800383000F0EBF800F0FEF8040025E0302823D16C
-S31508003840FFF7DAFEDFF88812401A04D0103806D0DF
-S3150800385010380BD011E000F0C4F8040014E0FFF7AC
-S315080038609AFE002801D0DFF858420DE0FFF7A5FEC2
-S31508003870002801D04FF4004406E000F0B2F800F04A
-S31508003880C4F800F0CDF80400200010BD10B50024DF
-S31508003890C02824D1FFF7B8FEDFF83812401A04D042
-S315080038A0403806D040380BD011E000F09AF80400F2
-S315080038B095E0FFF770FE002801D0DFF804428EE09D
-S315080038C0FFF77BFE002801D04FF4004487E000F0A4
-S315080038D088F800F09AF800F0A3F804007FE0B0F545
-S315080038E0407F27D1FFF790FEDFF8EC11884207D01A
-S315080038F0DFF8E811884207D0B0F1032F0BD011E0AA
-S3150800390000F06FF804006AE0FFF745FE002801D0D2
-S31508003910DFF8AC4163E0FFF750FE002801D04FF412
-S3150800392000445CE000F05DF800F06FF800F078F80D
-S31508003930040054E0B0F5405F27D1FFF765FEDFF8D5
-S31508003940A011884207D0DFF89C11884207D0B0F151
-S31508003950302F0BD011E000F044F804003FE0FFF7E9
-S315080039601AFE002801D0DFF8584138E0FFF725FE97
-S31508003970002801D04FF4004431E000F032F800F09E
-S3150800398044F800F04DF8040029E0B0F5404F26D180
-S31508003990FFF73AFEDFF85011884207D0DFF84C11DE
-S315080039A0884207D0B0F1C02F0BD011E000F019F80B
-S315080039B0040014E0FFF7EFFD002801D0DFF800410E
-S315080039C00DE0FFF7FAFD002801D04FF4004406E0A9
-S315080039D000F007F800F019F800F022F804002000BB
-S315080039E010BD80B50020FFF7EFFD002804D004289D
-S315080039F004D0082804D006E0314805E03C4803E036
-S31508003A0000F022F800E02E4802BD10B50400FFF7CA
-S31508003A10E1FD3849C0F30310085CC440200010BD1E
-S31508003A2010B50400FFF7DCFD3349800A085CC44082
-S31508003A30200010BD10B50400FFF7D8FD2E49400B35
-S31508003A40085CC440200010BD70B500200020FFF7B8
-S31508003A50EAFD002803D0B0F5800F02D003E0184C29
-S31508003A6002E0234C00E0164CFFF7EFFD0500FFF7D8
-S31508003A70E0FD0600B4FBF5F006FB00F6FFF7DFFDF8
-S31508003A80000C401C4000B6FBF0F070BD70380240D8
-S31508003A900038024074380240083802409038024024
-S31508003AA0043802408438024088380240FFFFF2EAB0
-S31508003AB010300024003000240C38024001000300B6
-S31508003AC00024F40004000C000004000C0008000C9C
-S31508003AD0100030004000C00000010003000200038F
-S31508003AE00010003000200030004000C0008000C0F8
-S31508003AF000127A0094620008C462000880B500F0DB
-S31508003B0048F94021DFF8AC0400F057F9DFF8A814AB
-S31508003B1008704021DFF8A40400F04FF9DFF8A0147C
-S31508003B200870DFF894040078FF2804D0DFF89004C2
-S31508003B300078FF2804D18421DFF88804FEF7BBFD4E
-S31508003B400022DFF88414DFF88404FEF7DDFBDFF8D3
-S31508003B508014DFF87804FEF71BFC0120FEF7D3FD7E
-S31508003B60DFF86804FEF728FCDFF86004D0F8C40222
-S31508003B70FDF7B2FE00F064FAB0F5FA6F03D24FF41F
-S31508003B80FA6000F05AFA01BD80B5DFF84004D0F8B3
-S31508003B90C402FDF7B4FEDFF83404FEF7D4FB0020B8
-S31508003BA0FEF7B1FD01BD70B505000C002000C0B2DE
-S31508003BB0402804DBB921DFF80C04FEF77CFD200061
-S31508003BC0C0B200F07DF8C0B2012804D0BD21DFF8EC
-S31508003BD0F403FEF770FD00260FE0FFF7D8F9300072
-S31508003BE080B2285C00F06CF8C0B2012804D0C62167
-S31508003BF0DFF8D003FEF75FFD761C30002100C9B25E
-S31508003C0080B289B28842E8D370BD38B504000D0089
-S31508003C10DFF8B803D0F8C402FDF7D4FBDFF8B40325
-S31508003C200078002819D1DFF8B00300F041F8012820
-S31508003C3011D1DFF8A403007800280CD0DFF8980328
-S31508003C400078402807DA0120DFF88813087000207A
-S31508003C50DFF888130870002032BDDFF87C03DFF830
-S31508003C607C1309780844401C00F022F80128F2D198
-S31508003C70DFF868030078401CDFF860130870DFF887
-S31508003C805C030078DFF8501309788842E3D1DFF83F
-S31508003C904C03027892B2DFF84813200000F00AFAC3
-S31508003CA00020CC490870CD48007828700120D3E759
-S31508003CB080B50100C248007800F004F9C0B202BD20
-S31508003CC080B50100C9B2BC48007800F08FF8C0B2D0
-S31508003CD002BD38B5B848007800F059F9040020004C
-S31508003CE0C0B2002827D02000C0B2412800DB4024FB
-S31508003CF0002513E06946B048007800F0E3F8C0B242
-S31508003D00012804D04FF4A371AE48FEF7D4FC9DF801
-S31508003D100000B4492A00D2B288546D1C280021003C
-S31508003D20C0B2C9B28842E5D3E4B22300AD4A8121C4
-S31508003D30A648FEF7ABFA31BD70B50500002000F0C5
-S31508003D4041FA04002900C9B2A048FEF7B9FA0500ED
-S31508003D5000260FE0300080B2215C9948007800F018
-S31508003D6045F8C0B2012804D04FF4B4719548FEF75F
-S31508003D70A2FC761C3000290080B289B28842E9D3B9
-S31508003D8000F020FA0200402301219048FEF78BFA42
-S31508003D9070BD9549954A002004E088744A61183137
-S31508003DA01832401C0300DBB2002BF6D088740020C2
-S31508003DB048618D488E490860704710B48C4A12686D
-S31508003DC0002A01D1FF200FE0894A12685369884CFE
-S31508003DD0236011749060D060002353741060C9B2D8
-S31508003DE00844401E5060907C10BC704738B50400EB
-S31508003DF00D002000C0B2022804DB4FF4E0717148C0
-S31508003E00FEF759FC78492200D2B21820424301EB4A
-S31508003E100200417C744A2300DBB21820434302EBBC
-S31508003E200300007C814201D100204AE06E4922004D
-S31508003E30D2B21820424301EB0200C06805706A49F5
-S31508003E402200D2B21820424301EB0200417C491CF1
-S31508003E50654A2300DBB21820434302EB0300417492
-S31508003E6061492200D2B21820424301EB0200C06821
-S31508003E70411C5D4A2300DBB21820434302EB0300D2
-S31508003E80C16059492200D2B21820424301EB020010
-S31508003E904168554A2300DBB21820434302EB03006E
-S31508003EA0C06881420CD250492200D2B2182042433F
-S31508003EB089584D4AE4B21820444302EB0400C16015
-S31508003EC0012032BD38B504000D002000C0B202281A
-S31508003ED004DB4FF4F1713B48FEF7EDFB4249220043
-S31508003EE0D2B21820424301EB0200407C002801D1DF
-S31508003EF000204BE03C492200D2B21820424301EB95
-S31508003F00020080680078287037492200D2B218204B
-S31508003F10424301EB0200407C411E334A2300DBB2D8
-S31508003F201820434302EB030041742F492200D2B202
-S31508003F301820424301EB02008068411C2A4A2300EC
-S31508003F40DBB21820434302EB0300816026492200B6
-S31508003F50D2B21820424301EB02004168224A2300EC
-S31508003F60DBB21820434302EB0300806881420CD27F
-S31508003F701D492200D2B21820424389581A4AE4B28F
-S31508003F801820444302EB04008160012032BD10B5BD
-S31508003F9004002000C0B2022804DB40F202210948CE
-S31508003FA0FEF789FB1049E4B21820444301EB0400EC
-S31508003FB0407C10BD2D0E00202C0E0020710E002016
-S31508003FC0700E0020E06000086C000020C404002089
-S31508003FD0140000204B100020F40E00204A10002088
-S31508003FE0F50E0020340F0020B40F0020CC0F00205F
-S31508003FF03C10002080B501201849087000F023F80D
-S3150800400000F001F801BD80B500F07CF9012813D055
-S315080040101248007801280FD1FDF7A0F810490A6860
-S31508004020104909688A1812F5FA72904204D30020DA
-S315080040300A49087000F01CF801BD09490860704774
-S3150800404007480068704780B504480078012803D1FE
-S31508004050FDF784F80349086001BD000046100020FA
-S315080040602C1000202810002080B500F055F901BD5D
-S3150800407010B500F061F9002816D0FEF72AFB0028D3
-S3150800408012D000F0ECF800F074F9FDF753F800F0E0
-S3150800409057F9064908400649086000F051F9001D1D
-S315080040A0046800F03BF9A04710BD000080FFFF1F21
-S315080040B008ED00E070B504000D00160005E028784C
-S315080040C020706D1C641CFEF762FF3000461E80B22D
-S315080040D00028F4D170BD000038B50400002540233F
-S315080040E0022281212000FEF773F8402302220121D3
-S315080040F02000FEF76DF84023334A01212000FEF721
-S31508004100D2F82800C0B232BD38B504000025812196
-S315080041102000FEF76FF801212000FEF76BF8280053
-S31508004120C0B232BD10B50B00172228491C7814F00E
-S31508004130600F28D15C78062C04D00A2C13D00B2CDF
-S3150800414016D020E05C88A4B2240AA4B2212C06D199
-S315080041501F49DA88182A01DB172200E0DA8892B2AA
-S31508004160FEF7DEFE0FE001221A49FEF7D9FE0AE045
-S315080041705988C9B2002903D198781649086002E01F
-S315080041801900FEF791FE002010BD80B5FFF7A1FDCE
-S31508004190002002BD80B50800C0B2FFF7CDFD0020A3
-S315080041A002BD80B590F89C02032801D1FFF791FD66
-S315080041B0002002BD20210180074870470A2101809E
-S315080041C00648704700487047740F002055000020C5
-S315080041D05E000020401000204C000020080000204F
-S315080041E080B500F0F9F800F0A0FB012043490870FB
-S315080041F000F08EFC002041490870FFF77FFC022082
-S315080042003E49087001BD80B569463D4800F02FFC5F
-S31508004210012807D10120394908709DF8001038484F
-S3150800422000F004F96946364800F0B0FC012807D1C9
-S315080042300020324908709DF80010314800F0F6F861
-S3150800424069462F48FFF7E1FC012807D102202B49D0
-S3150800425008709DF800102A4800F0E8F801BD80B5FE
-S31508004260FFF792FC01BD38B504000D00234800781D
-S31508004270012804D12900C9B2200000F0CAFB1F4852
-S315080042800078002804D12900C9B2200000F05DFC9E
-S315080042901A480078022804D12900C9B22000FFF77D
-S315080042A082FC00F0BDF831BD14480078002805D01E
-S315080042B0022807D004D3032806D007E0402006E0EA
-S315080042C0082004E03F2002E0002000E0402080B201
-S315080042D070470A480078002805D0022807D004D37A
-S315080042E0032806D007E0402006E0082004E03F2027
-S315080042F002E0002000E0402080B27047BC000020A9
-S31508004300B40E002010B5002400F081F8002800D073
-S3150800431001242000C0B210BD72B6704762B670475D
-S3150800432080B500F0B5FC01BD80B500F0BCFC02BD4F
-S3150800433080B500F0F1FC02BD80B500F05BFD02BD62
-S3150800434080B500F0A1FD02BD80B500F010FD002883
-S3150800435001D1002001E000F07CFD02BD80B50320FC
-S3150800436000F020FF002000F045FF01F099F800203A
-S3150800437002BD80B55FF0FF30124908600020114980
-S3150800438008605FF0FF301049086000200E49086099
-S315080043905FF0FF300D49086000200C4908605FF0A7
-S315080043A0FF300B4908600020094908605FF0FF30BC
-S315080043B00849086000200749086001F0E4F8002071
-S315080043C002BD00002038024024380240103802405E
-S315080043D014380240183802400020DFF86C140870C0
-S315080043E00020DFF8641488640020DFF85C1481F884
-S315080043F043000020DFF85014A1F844000020DFF83D
-S31508004400481488700020DFF8401448707047DFF8B9
-S3150800441038040078002801D1002000E00120704708
-S315080044200020DFF8241481F84300704780B501782E
-S31508004430FF291ED100F095F8DFF80C0490F8430028
-S31508004440012802D1102000F082F8DFF8FC03B0F949
-S31508004450440001280CDB0120DFF8EC1381F8430047
-S31508004460DFF8E403B0F94410DFF8E00300F053F88E
-S3150800447001BDDFF8D413097801294BD10178C92980
-S3150800448032D0CC293FD0CF293AD0D0292FD0D12924
-S3150800449033D0D2292ED0F32917D0F4290FD0F529F5
-S315080044A00AD0F6290ED0FA2912D0FC2913D0FD29F4
-S315080044B014D0FE2915D029E000F0D5F8BCE700F0A5
-S315080044C0F5F8B9E700F0C4F8B6E700F015F9B3E770
-S315080044D000F0A6F8B0E700F09EF8ADE700F083F824
-S315080044E0AAE700F072F8A7E700F039F9A4E700F0A8
-S315080044F059F9A1E700F017F99EE700F085F99BE75F
-S3150800450000F096F998E700F0A9F995E7202000F061
-S315080045101EF891E7ACE780B589B2FFF7A4FE01BDA6
-S31508004520F8B504000D001600002704E02078C71926
-S31508004530641CFEF72CFD2800451E0028F6D1FFB2A4
-S3150800454037600120F2BD0020BF4948707047FE2140
-S31508004550BD4AD170BC4908710220BB49A1F8440084
-S31508004560704780B5FFF7EFFF0120B7490870FF20B5
-S31508004570B549C8700020B4490871B348007950F0AD
-S315080045801000B14908710020AF494871AE4840791A
-S31508004590AD494871FFF788FEAB498871FFF799FE68
-S315080045A0A949C871FFF795FE80B2000AA6490872A4
-S315080045B00120A54948720120A34988720820A2490A
-S315080045C0A1F84400FFF7ACFE01BD80B500209E4966
-S315080045D00870FFF7B8FFFF209B49C87001209A4969
-S315080045E0A1F8440001BDFF209749C87000209649EC
-S315080045F00871954840789449487100209249887115
-S3150800460000209149C87100208F49087206208E49FA
-S31508004610A1F84400704780B50020FFF798FF01BD58
-S31508004620FF208949C8708A488749886400208649D6
-S315080046300871002084494871002083498871072041
-S315080046408149C1F8070008207F49A1F8440070474E
-S31508004650FF217D4AD17040687B49886401207A49E8
-S31508004660A1F84400704710B50400FFF71DFE80B29C
-S31508004670401E6178884203DA2220FFF768FF14E0BB
-S315080046806278744892B27049896CFFF713FDFF206F
-S315080046906D49C8706C48806C617840186A498864AE
-S315080046A06078401C6849A1F8440010BD10B50400A4
-S315080046B0FFF7FAFD80B2401E6178884203DA2220AD
-S315080046C0FFF745FF17E060685F49886462786148CC
-S315080046D092B25D49896CFFF7EDFCFF205A49C87014
-S315080046E05948806C61784018574988646078401C3E
-S315080046F05549A1F8440010BD80B5FF21524AD17032
-S31508004700554A41685048806CFFF70AFF4E490871C0
-S3150800471000204D49487100204B49887108204A49B4
-S31508004720A1F8440001BD80B5FF204749C8700020A4
-S3150800473045490871002044494871FFF7B5FD4249CB
-S31508004740887100204049C87100203F49087200203E
-S315080047503D49487207203C49A1F8440001BD10B5FF
-S315080047600400FFF7A1FD621C80B2401E0100364816
-S31508004770806CFFF7D9FD002803D13120FFF7E7FE4B
-S315080047800FE0FF203049C870FFF78EFD2E49896C6F
-S3150800479080B2401E40182C49886401202A49A1F895
-S315080047A0440010BD10B50400FFF77EFD80B2801EE0
-S315080047B06178884203DA2220FFF7C9FE23E0FF204A
-S315080047C02149C87001202049A1F8440060780028D2
-S315080047D007D1FFF7B9FD002802D13120FFF7B7FE50
-S315080047E011E0A21C61781848806CFFF79DFD00282F
-S315080047F003D13120FFF7ABFE05E01348806C6178E2
-S3150800480040181149886410BD80B541680E48806C0F
-S31508004810FFF78EFD002803D13120FFF798FE06E04A
-S31508004820FF200949C87001200749A1F8440001BDC5
-S3150800483080B5FFF71DFCFF200349C8700120024917
-S31508004840A1F8440001BD00009C0D00209F0D00202A
-S31508004850D4620008A00D0020A30D002080B53120E9
-S31508004860FFF775FE01BD0000F8B584B007000C001F
-S3150800487015001E006846FEF754FF02984FF47A7139
-S31508004880B0FBF1F1002200E0521C1000C0B2122861
-S3150800489048D2380080B28B4B94465FFA8CFC13F8EA
-S315080048A01C30DFF820C296465FFA8EFE0CEB4E0CE3
-S315080048B09CF801C01CEB03035B1C5843B1FBF0F3E7
-S315080048C000FB13100028DFD1380080B27D4B9446D8
-S315080048D05FFA8CFC13F81C30DFF8E8C196465FFADD
-S315080048E08EFE0CEB4E0C9CF801C01CEB03035B1C04
-S315080048F05843B1FBF0F0208020880028C4D02088D7
-S3150800490040F201439842BFDA6E481100C9B210F866
-S31508004910110028706B48D2B200EB42004078307024
-S31508004920012000E0002005B0F0BD18B58BB00020CE
-S31508004930ADF8020000208DF8010000208DF8000077
-S3150800494040F267646B460DF101020DF102014FF466
-S31508004950FA70FFF789FF002803D1B5215A48FDF7F9
-S31508004960AAFE5A485A490860002059490876002084
-S315080049705749487600205649887601205449C87612
-S3150800498000205349087700205149487700205049AC
-S31508004990886000204E49C8609DF80100401E00044A
-S315080049A04B4908619DF80000401E000548494861CA
-S315080049B0BDF80200464948604548FEF725FB002C2D
-S315080049C002D46405434805E024F00044E40054F0AA
-S315080049D0040441480021069100210791012108910C
-S315080049E02100090C0191A4B202940100090C03915B
-S315080049F080B2049000200590012009900E200A90AC
-S31508004A0001A93348FEF7B6FB3148FEF745FC0CB062
-S31508004A1010BD18B587B0020040F2E170002803D433
-S31508004A2001900020039004E020F00040029004204A
-S31508004A30039000200490C9B205916B4601A9244849
-S31508004A40FEF75AFCC0B200280FD1FCF787FB04001A
-S31508004A50323400991E48FEF7D4FC002805D0FEF72C
-S31508004A6096FAFCF77BFB8442F3D208B010BD78B502
-S31508004A7087B003000C0040F2676600256A460021ED
-S31508004A801348FEF7D4FC002812D1002E07D400984C
-S31508004A90B0420DD1029800280AD1012508E026F077
-S31508004AA000460198B04203D10298042800D1012596
-S31508004AB02800C0B2012801D1049820702800C0B28D
-S31508004AC008B070BD7C610008A4600008006400405E
-S31508004AD0E40F00200400E0FFFCFF1F00016851F00E
-S31508004AE00101016070470168490849000160704783
-S31508004AF0C069400910F001007047C069C00910F08C
-S31508004B0001007047406AC0B27047C9B281627047F7
-S31508004B1000B587B05748FFF7E6FF4FF461400090AD
-S31508004B200020019000200290002003900C200490A1
-S31508004B30002005900020069069464E4800F0A2FD28
-S31508004B404C48FFF7CBFF07B000BD70B504000D0059
-S31508004B502800C0B2412803DB83214748FDF7ABFD97
-S31508004B602800C0B200F06FF8002607E0FEF70FFA3B
-S31508004B70300080B2205C00F066F8761C3000290010
-S31508004B80C9B280B289B28842F0D370BD38B5040084
-S31508004B900D003A480078002817D1394800F044F843
-S31508004BA001283FD13648007800283BD034480078A1
-S31508004BB0412837DAFCF7D2FA324908600020324930
-S31508004BC0087001202D4908702CE02D482E490978D7
-S31508004BD00844401C00F028F8012819D12A48007812
-S31508004BE0401C2949087028480078254909788842D0
-S31508004BF018D12548027892B224492000FFF75AFABC
-S31508004C0000201E49087020480078287001200AE014
-S31508004C10FCF7A4FA1B4909686431814202D20020D4
-S31508004C2016490870002032BD10B504001148FFF778
-S31508004C305FFF002805D00F48FFF764FF20700120AA
-S31508004C4000E0002010BD10B50100C9B20948FFF701
-S31508004C505CFFFCF783FA04000A340648FFF74DFFA9
-S31508004C60002805D1FEF793F9FCF778FA8442F4D2C6
-S31508004C7010BD00000048004064600008491000208C
-S31508004C80E80D00203410002048100020E90D00200F
-S31508004C905FF0FF30DFF83C1408605FF0FF30DFF8A4
-S31508004CA038140860704770B504000D001600DFF868
-S31508004CB02C04816CDFF82404C06C4118491E091BBA
-S31508004CC0681E814201D2002025E0200000F0D2F9BA
-S31508004CD0FF2805D02819401E00F0CCF9FF2801D17D
-S31508004CE0002018E02100490A4FF400704143DFF81C
-S31508004CF0EC030068814207D12B0032002100DFF85F
-S31508004D00D80300F0F6F806E02B0032002100DFF8A1
-S31508004D10C40300F0EEF870BD70B504000D00DFF8AE
-S31508004D20BC03816CDFF8B403C06C4118491E091B2B
-S31508004D30681E814201D2002018E0200000F09AF98E
-S31508004D4006002C19641E200000F094F93100C9B23F
-S31508004D50FF2903D00100C9B2FF2901D1002005E0CF
-S31508004D600100C9B23000C0B200F03DF970BD80B58F
-S31508004D7000200090DFF86003006810F1010F01D1F0
-S31508004D80012036E00099DFF8500340684118009189
-S31508004D900099DFF844038068411800910099DFF80C
-S31508004DA03803C068411800910099DFF82C030069A0
-S31508004DB0411800910099DFF82003406941180091D5
-S31508004DC00099DFF814038069411800910099C248D8
-S31508004DD0C069411800910098C04300900098401C93
-S31508004DE000906A460421BD48006810F5E470FFF794
-S31508004DF05AFF02BD0021B948006800684118B74843
-S31508004E000068001D00684118B4480068083000684A
-S31508004E104118B24800680C3000684118AF4800686D
-S31508004E20103000684118AD48006814300068411811
-S31508004E30AA480068183000684118A848006810F5A4
-S31508004E40E47000684118002901D1012000E0002023
-S31508004E50704780B5A048006810F1010F06D09E483B
-S31508004E6000F092F8002801D100200CE0994800686B
-S31508004E7010F1010F06D0974800F086F8002801D1F6
-S31508004E80002000E0012002BD94480068704780B504
-S31508004E90CA0501D000200BE002688A4201D1012030
-S31508004EA006E001604FF40072001DFFF703F90120C8
-S31508004EB002BD38B504000D008748844208D1854CE8
-S31508004EC029002000FFF7E3FF002810D100200FE09B
-S31508004ED082480068854203D17F4C80480568EFE721
-S31508004EE0200000F051F80028EAD1002000E0200058
-S31508004EF032BD2DE9F0410400884616001D004746DC
-S31508004F007F0A4FF400704743206810F1010F07D15C
-S31508004F1039002000FFF7BBFF002801D1002031E04F
-S31508004F202068B84208D039002000FFF7C2FF040005
-S31508004F30002C01D1002025E02068B8EB000804EB1E
-S31508004F40080010F10408FEF722F8201DB8EB00004F
-S31508004F50B0F5007F09D317F500712000FFF7A9FF08
-S31508004F600400002C0BD014F10408307888F80000EF
-S31508004F7018F10108761C6D1E002DE4D101E0002011
-S31508004F8000E00120BDE8F0812DE9F0410600012589
-S31508004F9000F0A6F8002801D1002022E000F040FC2D
-S31508004FA0002704E0D8F80000A04215D17F1C802F06
-S31508004FB013D2D6F8008018EB870806EB87004468FA
-S31508004FC0FDF7E5FF220000234146022000F0DEFB44
-S31508004FD00028E7D0002500E0002500F033FC280073
-S31508004FE0C0B2BDE8F08178B585B004000D00012691
-S31508004FF00020009028002100C0B2C9B2884200D221
-S31508005000002620003549097AC0B2884206D33348BB
-S3150800501090F850002900C9B2884200D2002600F054
-S315080050205FF8002800D100263000C0B201281DD143
-S3150800503000200190022004900120039000F0F0FB6C
-S3150800504000E0641C28002100C0B2C9B288420BD314
-S31508005050FDF79DFF2000C0B20290694601A800F046
-S31508005060C1FC0028EDD0002600F0ECFB3000C0B2F1
-S3150800507006B070BD70B50500FF26002400E0641C6C
-S315080050802000C0B2072821D2FDF781FF134922006C
-S31508005090D2B20C20424388588542F0D30F492200E9
-S315080050A0D2B20C20424389580C4A2300DBB20C20AA
-S315080050B0434302EB0300406841188D42DFD207499B
-S315080050C0E4B20C20444301EB0400067A3000C0B277
-S315080050D070BD00009407002098090020BC5F0008F6
-S315080050E00120C0B27047000010F00700DFF8E81092
-S315080050F00A684FF6FF010A4052EA0022DFF8DC0090
-S315080051000243DFF8D4000260704733480068C0F3F2
-S3150800511002207047020052B2002A04D40901304A1C
-S3150800512040B2115407E009012E4A40B210F00F00B0
-S31508005130104400F8041C704710B410F00700D0F1B2
-S315080051400703052B01D3042301E0D0F10703041D4F
-S31508005150072C01D2002000E0C01E012414FA03F334
-S315080051605B1E19408140012313FA00F0401E1040CF
-S31508005170084310BC704780B5411EB1F1807F01D34A
-S3150800518001200EE0401E184908600F215FF0FF302D
-S31508005190FFF7C0FF0020154908600720144908607A
-S315080051A0002002BD80B5FFF79FFF01BD70B5040062
-S315080051B00D0016000020FFF7A8FF32002900FFF7B0
-S315080051C0BBFF0100200040B2FFF7A4FF70BD80B509
-S315080051D0FFF7D1FF02BD00000CED00E00000FA0564
-S315080051E000E400E018ED00E014E000E018E000E05C
-S315080051F010E000E010B504004FF47A700D49097804
-S31508005200B0FBF1F00C490968B1FBF0F0FFF7DFFFDE
-S31508005210002801D001200CE0102C09D20022210020
-S315080052205FF0FF30FFF7C2FF04480460002000E08B
-S31508005230012010BDBD000020040000200000002051
-S31508005240DFF8A803006850F48030DFF8A013086080
-S315080052507047DFF89813096831F440410843DFF8CE
-S315080052608C1308607047DFF88803006850F48020C4
-S31508005270DFF87C1308607047DFF87403006850F4A1
-S315080052808030DFF86C1308607047DFF86403006845
-S31508005290400C10F001007047DFF8581309688908B8
-S315080052A089000843D34908607047D248006810F05F
-S315080052B00C007047CF49096831F0F0010843CD4921
-S315080052C008607047CB49096831F4E0510843C94979
-S315080052D008607047C749096831F460410843C54901
-S315080052E008607047C248006850F08070C04908607E
-S315080052F07047BF480068400E10F00100704730B490
-S31508005300BD4C2568BD4C25402843084350EA821009
-S315080053101843B949086030BC704730B4B64C2568A4
-S31508005320B74C25402843084350EA82101843B2492F
-S31508005330086030BC704781B0B24909680143B14A78
-S315080053401160B049096808400090009801B070479C
-S31508005350AC49096831EA0000AA490860704781B07B
-S31508005360A94909680143A84A1160A749096808407C
-S315080053700090009801B07047A349096831EA000017
-S31508005380A1490860704781B0A049096801439F4A4E
-S3150800539011609E49096808400090009801B070475E
-S315080053A09A49096831EA000098490860704781B04F
-S315080053B0974909680143964A116095490968084062
-S315080053C00090009801B070479149096831EA0000D9
-S315080053D08F49086070478F49096809090901084318
-S315080053E08C49086070478B48006810F00F007047BA
-S315080053F009048161704780B500F005F800F09AFB52
-S3150800540000F0A6FBFCE780B5FEF7A8FF00F001F860
-S3150800541001BD80B50720FFF7DEFFFFF7E4FF072889
-S3150800542003D067217C48FDF746F94FF44040FFF763
-S3150800543010FFFFF705FFFFF716FFFFF71DFFFFF742
-S3150800544024FF0128FBD100234FF4D87208215FF40A
-S315080054508000FFF754FF5FF010634FF4D8720821FD
-S315080054605FF48000FFF759FFFFF73CFFFFF741FFA6
-S315080054700128FBD10020FFF71DFF4FF4A050FFF7CE
-S3150800548021FF4FF40040FFF725FF0220FFF704FF36
-S31508005490FFF70BFF0828FBD1604800F063FB01BD4E
-S315080054A080B586B04FF48040FFF781FF5FF08050EB
-S315080054B0FFF769FF0120FFF73EFF0220FFF73BFFDA
-S315080054C00420FFF738FF0820FFF735FF5FF4802038
-S315080054D0FFF759FF5FF00070FFF755FF8020009037
-S315080054E001200190002002900020039000200490E3
-S315080054F069464B4800F052FC80214948FFF778FF7F
-S315080055004FF4005000900020019000200490694656
-S31508005510444800F043FC4FF440700090022001908C
-S315080055200320029000200390002004900720059095
-S3150800553069463D4800F032FC4FF440700090022066
-S315080055400190032002900020039000200490092077
-S3150800555005906946324800F021FC4FF4C05000908F
-S31508005560022001900320029000200390002004905E
-S315080055700A20059069462D4800F010FC8020FFF7A8
-S31508005580EEFE07B000BD80B5FEF773F8802124480B
-S31508005590FFF72EFF244800F06FFB224800F06CFB53
-S315080055A01F4800F069FB214800F066FB8020FFF7E2
-S315080055B0E3FE5FF00070FFF7F3FE5FF48020FFF76D
-S315080055C0EFFE0820FFF7C4FE0420FFF7C1FE022005
-S315080055D0FFF7BEFE0120FFF7BBFE5FF08050FFF726
-S315080055E0DFFE4FF48040FFF7EFFE01BD007000407C
-S315080055F00038024008380240043802400080BCFFE8
-S315080056000080BFF03038024034380240403802404B
-S3150800561044380240003C02401060000800E6DF0CF7
-S315080056200004024000080240000C0240000002404C
-S31508005630006810F001007047426832F44052114386
-S3150800564041607047826832F4407211438160704746
-S31508005650B2F5004F0FD11A00520812EB4102B2FB05
-S31508005660F3F189B24FF6F0720A40C1F3420189B2EA
-S315080056700A43C26005E011EB5301B1FBF3F189B2AD
-S31508005680C1607047F8B505000F0001260024280000
-S31508005690FFF7CEFF002862D129683B4801407868A9
-S315080056A00143F868014338690143B8690143296031
-S315080056B0B9682800FFF7C0FF79692800FFF7C2FF1D
-S315080056C02948854204D10320FEF73DF804003AE054
-S315080056D02648854204D10C20FEF735F8040032E04E
-S315080056E02348854204D13020FEF72DF804002AE02D
-S315080056F02048854204D1C020FEF7C8F8040022E0FD
-S315080057001D48854205D14FF44070FEF7BFF80400E6
-S3150800571019E01A48854205D14FF44060FEF713F8A0
-S31508005720040010E01648854205D14FF44050FEF7B4
-S31508005730ADF8040007E01348854204D14FF4404011
-S31508005740FEF7A4F80400002C09D03868002806D013
-S3150800575000263B68BA6921002800FFF779FF300068
-S31508005760C0B2F2BD00000000001001400044004035
-S3150800577000480040004C0040005000400014014022
-S3150800578000780040007C0040F369FFEFF8B506009A
-S315080057900F0014001D000120DFF83002007D0128EB
-S315080057A001D102203BE00120DFF8201208754CF2F7
-S315080057B0503000F04FF80100C9B200292AD1220062
-S315080057C02B00002E05D0022E0FD008D3032E11D0A1
-S315080057D014E01100C9B2380000F0ADF80EE011006F
-S315080057E089B2380000F091F808E01100380000F09E
-S315080057F076F803E0380000F058F8FFE74CF250302E
-S3150800580000F028F8DFF8C811096849084900DFF8E8
-S31508005810C02111600021DFF8B4211175C0B2F2BDB4
-S3150800582000206B49096800290AD56B496B4A116043
-S315080058306B496A4A116066490968002900D5012042
-S31508005840C0B270476248006850F00040604908607E
-S315080058500020704738B50400002000205B498861A5
-S31508005860FBF78CFC05005B480068C0030BD514F1F8
-S31508005870010FF8D0002C04D0FBF780FC401B8442B3
-S31508005880F1D2032010E05348006810F0F20F03D05D
-S3150800589000F065F8012007E04E480068C00702D509
-S315080058A001204C490860002032BD10B448490968F7
-S315080058B031F44071464C21604549096851F44071FC
-S315080058C0434C21604249096851F00101404C21606E
-S315080058D00260001D0360BFF34F8F10BC70473C4A3F
-S315080058E0126832F440723A4B1A60394A126852F416
-S315080058F00072374B1A60364A126852F00102344B6E
-S315080059001A600160BFF34F8F7047314A126832F44C
-S3150800591040722F4B1A602E4A126852F480722C4B32
-S315080059201A602B4A126852F00102294B1A6001804C
-S31508005930BFF34F8F7047264A126832F44072244BE1
-S315080059401A60234A1268224B1A60214A126852F0DA
-S3150800595001021F4B1A600170BFF34F8F70471D4835
-S315080059600068800705D51948806950F02000174956
-S31508005970886118480068C00605D51448806950F043
-S3150800598010001249886113480068800605D50F483B
-S31508005990806950F008000D4988610E480068400685
-S315080059A005D50A48806950F0040008498861094805
-S315080059B00068000605D50548806950F002000349CD
-S315080059C08861F22003490860704700000C10002027
-S315080059D0103C02400C3C024023016745043C02404F
-S315080059E0AB89EFCD70B504000D0001200020DFF86B
-S315080059F03C01007D012801D1022045E00120DFF8A5
-S31508005A002C1108754CF25030FFF724FF0100C9B27B
-S31508005A10002934D15FF0FF3129602168012910D1AE
-S31508005A20E068C0B200F031F84CF25030FFF712FFD0
-S31508005A30DFF8FC10096831F00401DFF8F420116082
-S31508005A401DE0666800E0761CA26861688A189642BE
-S31508005A5015D2E168C9B2300000F02FF84CF2503088
-S31508005A60FFF7F8FEDFF8C810096831F07A01DFF8A9
-S31508005A70C02011600100C9B20029E4D02E600021BF
-S31508005A80DFF8A8201175C0B270BD2949096831F43C
-S31508005A904071274A11602649096851F00401244AD1
-S31508005AA0116023490968C0B251EA002151F48031D6
-S31508005AB01F480160BFF34F8F704700220A00D2B219
-S31508005AC0002A01D100210EE00A00D2B2012A02D131
-S31508005AD04FF4807107E0C9B2022902D14FF4007170
-S31508005AE001E04FF44071124A126832F44072104BCA
-S31508005AF01A600F4A126811430D4A11600C49096869
-S31508005B0031F0F8010A4A11600949096851EAC001E9
-S31508005B1051F00201064801600548006850F48030DB
-S31508005B2003490860BFF34F8F704700000C10002030
-S31508005B30103C024080B5FEF797FAFDF724FAFBF70A
-S31508005B40E9FAFEF7EDFBFEF74BFBFEF753FA01BD4C
-S31508005B5080B5FDF71CFAFBF7F7FAFEF754FBFEF7DC
-S31508005B6052FA01BD01490860704700000400002090
-S31508005B7030B4046891FAA1F3B3FA83F30325DBB2D0
-S31508005B805B009D40AC4391FAA1F1B1FA81F1C9B22B
-S31508005B9049008A402243026030BC704743688B4301
-S31508005BA0514319434160704730B4846891FAA1F3B0
-S31508005BB0B3FA83F30325DBB25B009D40AC4391FA4D
-S31508005BC0A1F1B1FA81F1C9B249008A402243826043
-S31508005BD030BC704730B4C46891FAA1F3B3FA83F3C2
-S31508005BE00325DBB25B009D40AC4391FAA1F1B1FA03
-S31508005BF081F1C9B249008A402243C26030BC70476D
-S31508005C0030B4046A91FAA1F3B3FA83F30F25DBB231
-S31508005C109B009D40AC4391FAA1F1B1FA81F1C9B25A
-S31508005C2089008A402243026230BC704730B4446A15
-S31508005C300B001B0A93FAA3F3B3FA83F30F25DBB21F
-S31508005C409B009D40AC43090A91FAA1F1B1FA81F192
-S31508005C50C9B289008A402243426230BC7047434930
-S31508005C60096808434149086070474049096831EAAC
-S31508005C7000003E490860704710B500243C49884238
-S31508005C8006D10120FFF7EBFF0120FFF7EEFF6AE0E0
-S31508005C903849884206D10220FFF7E1FF0220FFF7C4
-S31508005CA0E4FF60E03449884206D10420FFF7D7FFB5
-S31508005CB00420FFF7DAFF56E03049884206D108206B
-S31508005CC0FFF7CDFF0820FFF7D0FF4CE02C498842AC
-S31508005CD006D11020FFF7C3FF1020FFF7C6FF42E0EA
-S31508005CE02849884206D12020FFF7B9FF2020FFF770
-S31508005CF0BCFF38E02449884206D14020FFF7AFFFB1
-S31508005D004020FFF7B2FF2EE02049884206D18020C6
-S31508005D10FFF7A5FF8020FFF7A8FF24E01C4988426B
-S31508005D2008D14FF48070FFF79AFF4FF48070FFF7A1
-S31508005D309CFF18E01749884208D14FF40070FFF716
-S31508005D408EFF4FF40070FFF790FF0CE0124988426F
-S31508005D5008D14FF48060FFF782FF4FF48060FFF7A9
-S31508005D6084FF00E001242000C0B210BD10380240B4
-S31508005D70000002400004024000080240000C0240F5
-S31508005D80001002400014024000180240001C0240A5
-S31508005D90002002400024024000280240F8B5050011
-S31508005DA00E0000200020306890FAA0F0B0FA80F7C4
-S31508005DB034E0726921002800FFF738FF28E03468CC
-S31508005DC00120B8400440002C27D07068012802D072
-S31508005DD07068022809D1B26821002800FFF7E4FE9E
-S31508005DE0F26831682800FFF7D9FE326921002800D9
-S31508005DF0FFF7F0FE706802280AD194FAA4F0B0FA08
-S31508005E0080F00828D5D2726921002800FFF7F8FE2D
-S31508005E10726821002800FFF7ABFE7F1C3068F84047
-S31508005E200028CCD10020F2BD122008802C487047EB
-S31508005E30042008802B48704780B50A00C0B20028A5
-S31508005E4004D129492948FDF73AF803E026492748A5
-S31508005E50FDF735F8244802BD80B50A0022492448D2
-S31508005E60FDF72DF8204802BD80B51A20088000F0FD
-S31508005E7022F8204802BD80B50A00C0B2002804D125
-S31508005E8019491D48FDF71BF803E017491A48FDF79D
-S31508005E9016F8154802BD80B50A00C0B2002804D11C
-S31508005EA011491648FDF70BF803E00F491348FDF7AB
-S31508005EB006F80D4802BD10B51148006811490C686E
-S31508005EC0114909680818002808D008220F4900F067
-S31508005ED021F804220E49200000F01CF810BD00002D
-S31508005EE0880000209C0000209C0B0020806200088F
-S31508005EF0A4620008A0000020CC62000868620008BE
-S31508005F0020F4F01F24F4F01F28F4F01FA20000204C
-S31508005F10B200002030B4002300231AE00400240F46
-S31508005F2037341D00EDB201F815400AE00400240FCD
-S31508005F300A2CF3D20400240F30341D00EDB201F808
-S31508005F401540000100241D00EDB201EB45056C70FB
-S31508005F505B1C1C001500E4B2EDB2AC42E6D330BCC3
-S31508005F6070470000433A5C576F726B5C736F6674D8
-S31508005F70776172655C4F70656E424C545C54617211
-S31508005F806765745C44656D6F5C41524D434D375F80
-S31508005F9053544D333246375F4E75636C656F5F46B3
-S31508005FA03734365A475F4941525C426F6F745C75A5
-S31508005FB07362645F636F6E662E630000008000087C
-S31508005FC000800000010000000000010800800000B9
-S31508005FD002000000008001080080000003000000A5
-S31508005FE00000020800000200040000000000040887
-S31508005FF00000040005000000000008080000040076
-S315080060000600000000000C0800000400070000005D
-S31508006010433A5C576F726B5C736F6674776172652F
-S315080060205C4F70656E424C545C5461726765745C73
-S3150800603044656D6F5C41524D434D375F53544D3344
-S315080060403246375F4E75636C656F5F463734365A2E
-S31508006050475F4941525C426F6F745C6D61696E2E91
-S3150800606063000000433A5C576F726B5C736F66742B
-S31508006070776172655C4F70656E424C545C54617210
-S315080060806765745C536F757263655C41524D434D29
-S31508006090375F53544D333246375C72733233322E80
-S315080060A063000000433A5C576F726B5C736F6674EB
-S315080060B0776172655C4F70656E424C545C546172D0
-S315080060C06765745C536F757263655C41524D434DE9
-S315080060D0375F53544D333246375C63616E2E630027
-S315080060E0433A5C576F726B5C736F6674776172655F
-S315080060F05C4F70656E424C545C5461726765745CA3
-S31508006100536F757263655C41524D434D375F535407
-S315080061104D333246375C7573622E630030B4002502
-S3150800612012E050F8042BD30744BF4A44521E091FF5
-S31508006130042942F8045BFAD213468C0744BF15803B
-S315080061409B1CC90748BF1D7050F8041B0029E8D1DD
-S3150800615030BC704710B5074979441831064C7C4461
-S31508006160163404E00A68081D114488470146A1420E
-S31508006170F8D110BD500000006C00000005020602B0
-S31508006180060307030803090309040A040B040C049D
-S315080061900C050D050E050F050F061006100710084D
-S315080061A04EF68851CEF20001086840F47000086087
-S315080061B0BFF34F8FBFF36F8F4FF00070E1EE100AF9
-S315080061C07047000059FFFFFF900F0000C000002035
-S315080061D000000000AFBCFFFFAC0200003001000069
-S315080061E0000000200548006850F470000349086064
-S315080061F05FF00060024908607047000088ED00E023
-S3150800620008ED00E000F00DF8002801D0FFF7A2FF26
-S31508006210AFF300800020AFF30080FFF7ECF800F042
-S3150800622002F80120704700F001B80000074638461A
-S3150800623000F002F8FBE7000080B5AFF30080024AE1
-S3150800624011001820ABBEFBE72600020005480146F0
-S3150800625003B4684680F30988AFF30080FFF7A0FF10
-S31508006260FFF7D0FFA5EDF5FE57696E55534220425C
-S31508006270756C6B20496E7465726661636500000013
-S3150800628057696E5553422042756C6B204465766992
-S31508006290636500000000000000000000010203041E
-S315080062A0060708094F70656E424C5420557365728F
-S315080062B0000000000148804701480047E5610008E2
-S315080062C04D6200080000000001020304446566618F
-S315080062D0756C74004F70656E424C5400FFF7FEBF34
-S315080062E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD4
-S315080062F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC4
-S31508006300FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB3
-S31508006310FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA3
-S31508006320FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF93
-S31508006330FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF83
-S31508006340FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF73
-S31508006350FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF63
-S31508006360FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF53
-S31508006370FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF43
-S31508006380FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF33
-S31508006390FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF23
-S315080063A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF13
-S315080063B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF03
-S315080063C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF3
-S315080063D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE3
-S315080063E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD3
-S315080063F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC3
-S31508006400FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB2
-S31508006410FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA2
-S31508006420FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF92
-S31508006430FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF82
-S31508006440FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF72
-S31508006450FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF62
-S31508006460FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF52
-S31508006470FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF42
-S31508006480FFF7FEBF0010FC000624F4000A0600020F
-S31508006490FD00014001FD000BD94000080941000834
-S315080064A025410008F8000B8B41000895410008A318
-S315080064B0410008F40003B5410008FC0012BD410084
-S315080064C00809022000010100C0320904000002FF89
-S315080064D0FD002D070581024000FF07050102400067
-S315080064E0FF295E0008315E0008595E0008395E0023
-S315080064F008695E0008775E0008975E0008120100CA
-S3150800650002FD001240501DAC6000020102030100AA
-S3110800651000040309041A03E60001040154
-S7050800624D43
+S31508002A600027688880B2000AC0B201281FD0022851
+S31508002A7025D0032838D0062800F0BA80072800F0A9
+S31508002A80C7800F2840F0D680D4F8B402C069002861
+S31508002A9007D06946207CD4F8B422D269904706004C
+S31508002AA004E02900200000F015FA7F1CC7E06946FB
+S31508002AB0207CD4F8B422126890470600BFE0207C38
+S31508002AC0002808D16846D4F8B812896A88470600EB
+S31508002AD00220707007E06846D4F8B812C96A8847B9
+S31508002AE0060002207070AAE0A878002808D00228FC
+S31508002AF02CD018D304284FD03BD305285FD071E0DB
+S31508002B00D4F8B4024068002807D06946207CD4F877
+S31508002B10B42252689047060004E02900200000F01D
+S31508002B20D9F97F1C63E0D4F8B4028068002807D07E
+S31508002B306946207CD4F8B42292689047060004E0DF
+S31508002B402900200000F0C6F97F1C50E0D4F8B40232
+S31508002B50C068002807D06946207CD4F8B422D26819
+S31508002B609047060004E02900200000F0B3F97F1C16
+S31508002B703DE0D4F8B4020069002807D06946207CF5
+S31508002B80D4F8B42212699047060004E02900200010
+S31508002B9000F0A0F97F1C2AE0D4F8B40240690028A6
+S31508002BA007D06946207CD4F8B422526990470600BB
+S31508002BB004E02900200000F08DF97F1C17E0D4F806
+S31508002BC0B4028069002807D06946207CD4F8B4226C
+S31508002BD092699047060004E02900200000F07AF97F
+S31508002BE07F1C04E02900200000F074F97F1C26E011
+S31508002BF0207C002806D16846D4F8B812496B884765
+S31508002C00060004E02900200000F064F97F1C16E0A5
+S31508002C10207C002808D16846D4F8B812096B884782
+S31508002C2006000720707004E02900200000F052F921
+S31508002C307F1C04E02900200000F04CF97F1CFFB23D
+S31508002C40002F1DD1E888002817D0BDF800000028FD
+S31508002C500ED0BDF80000E988884202D3E888ADF8AE
+S31508002C600000BDF800203100200000F06FF907E0F1
+S31508002C702900200000F02EF902E0200000F083F978
+S31508002C80F1BD38B504008888002825D1C8880028F1
+S31508002C9022D1488880281FD28D7815F07F0594F8B0
+S31508002CA09C02032803D1200000F014F917E084F8E9
+S31508002CB09E522900C9B22000FFF7DBFA200000F077
+S31508002CC062F9EDB2002D03D0022084F89C0206E0DA
+S31508002CD0012084F89C0202E0200000F0FBF831BDD8
+S31508002CE070B505000E0000247088404908703F48FA
+S31508002CF00078022805D33100280000F0EBF80320FD
+S31508002D0072E095F89C02022802D0032821D05FE0E1
+S31508002D1036480078002818D0344800786860334868
+S31508002D2001782800FFF74EFB04002000C0B20028F7
+S31508002D3004D03100280000F0CDF809E0280000F0A2
+S31508002D4022F9032085F89C0202E0280000F01BF90E
+S31508002D5048E02648007800280ED1022085F89C0213
+S31508002D60224800786860214801782800FFF739FB77
+S31508002D70280000F008F92AE01C48007869688842AB
+S31508002D8022D06968C9B22800FFF72BFB17480078DC
+S31508002D906860164801782800FFF714FB0400200035
+S31508002DA0C0B200280CD03100280000F093F86968FA
+S31508002DB0C9B22800FFF715FB022085F89C0206E039
+S31508002DC0280000F0E0F802E0280000F0DCF809E04E
+S31508002DD03100280000F07EF8044801782800FFF743
+S31508002DE000FB03242000C0B270BD0000D8110020EB
+S31508002DF080B5CA88012A02D000F06CF816E090F86F
+S31508002E009C22521E012A02D9921E08D00CE00021EB
+S31508002E108160012210F1080100F098F806E001220D
+S31508002E20011D00F093F801E000F054F801BD80B5EB
+S31508002E3090F89C22521E022A15D8CA88022A02D065
+S31508002E4000F048F811E00121C160D0F8A412002969
+S31508002E5003D0C16851F00201C160022210F10C01D1
+S31508002E6000F074F801E000F035F801BD80B5498836
+S31508002E70012904D10121C0F8A41200F084F801BD8B
+S31508002E8080B590F89C22521E022A08D84988012942
+S31508002E9004D10021C0F8A41200F075F801E000F092
+S31508002EA019F801BD38B5040008782070481C017867
+S31508002EB06170451C2800FFF729FC6080681C451CCA
+S31508002EC02800FFF723FCA080681C401CFFF71EFCA7
+S31508002ED0E08031BD10B5040080212000FFF797F986
+S31508002EE000212000FFF793F910BDF8B504000D0086
+S31508002EF017000026002C1ED0200000F01DF8400008
+S31508002F00801C388038783100C9B26854761C032092
+S31508002F103100C9B26854761C0AE020783100C9B27B
+S31508002F206854641C761C00203100C9B26854761CAB
+S31508002F3020780028F1D1F1BD0200002001E0401CF4
+S31508002F40521C11780029FAD1C0B2704780B5130017
+S31508002F500222C0F894228361C3610A000021FFF7A8
+S31508002F6095F9002002BD80B513000A000021FFF77D
+S31508002F708DF9002002BD80B513000A000021FFF775
+S31508002F8092F9002002BD80B50421C0F894120023EE
+S31508002F9000220021FFF77AF9002002BD80B505213D
+S31508002FA0C0F89412002300220021FFF77CF90020C4
+S31508002FB002BD80B5FFF79EFB01BD80B5FFF79FFBFD
+S31508002FC001BD000081617047090481617047154998
+S31508002FD00880704780B5FEF7C1F81349096888422A
+S31508002FE019D312480078002807D101200F49087024
+S31508002FF080210F48FFF7E6FF06E000200B4908701E
+S3150800300080210B48FFF7E0FFFEF7A8F80549098875
+S3150800301040180549086001BD80B580210448FFF7BE
+S31508003020D3FF01BDD0110020BC110020D311002010
+S315080030300004024038B50400002C01D10120AEE09E
+S3150800304094F82000002802D1200000F0B0FA206889
+S31508003050006830F0020021680860FEF78FF8050066
+S315080030602068406880070DD5FEF788F8401B0B28B6
+S31508003070F6D3606A50F400306062052084F82000B8
+S3150800308001208CE02068006850F001002168086083
+S31508003090FEF774F8050020684068C0070DD4FEF7EF
+S315080030A06DF8401B0B28F6D3606A50F40030606256
+S315080030B0052084F82000012071E0207E012806D131
+S315080030C02068006850F080002168086005E02068E4
+S315080030D0006830F0800021680860607E012806D10B
+S315080030E02068006850F040002168086005E0206804
+S315080030F0006830F0400021680860A07E012806D1EB
+S315080031002068006850F020002168086005E0206803
+S31508003110006830F0200021680860E07E012806D1AA
+S315080031202068006830F010002168086005E0206813
+S31508003130006850F0100021680860207F012806D139
+S315080031402068006850F008002168086005E02068DB
+S31508003150006830F0080021680860607F012806D101
+S315080031602068006850F004002168086005E02068BF
+S31508003170006830F0040021680860A168E06801432F
+S3150800318020690143606901436068401E0143206865
+S31508003190C16100206062012084F82000002032BD51
+S315080031A030B4026890F820201300DBB2012B03D05C
+S315080031B0D2B2022A40F07F80594AD2F8000250F073
+S315080031C00100C2F80002D2F8000230F47C50C2F8BE
+S315080031D00002D2F800024B6A50EA0320C2F8000245
+S315080031E001200B7D13F01F0310FA03F3D2F81C021B
+S315080031F09843C2F81C02C869002816D1D2F80C02F6
+S315080032009843C2F80C02486902EBC000CC684D68C6
+S31508003210C5EA0444C0F84042486902EBC0008C681D
+S315080032200D68C5EA0444C0F84442C869012816D1A5
+S31508003230D2F80C021843C2F80C02486902EBC00027
+S315080032400C684D68C5EA0444C0F84042486902EB78
+S31508003250C0008C68CD68C5EA0444C0F84442886951
+S31508003260002805D1D2F804029843C2F8040204E003
+S31508003270D2F804021843C2F804020869002805D1E6
+S31508003280D2F814029843C2F8140204E0D2F81402E1
+S315080032901843C2F81402086A012804D1D2F81C029D
+S315080032A00343C2F81C32D2F8000240084000C2F8B4
+S315080032B00002002004E0416A51F4802141620120A5
+S315080032C030BC704738B5040094F82000012821D195
+S315080032D0022084F820002068006840084000216821
+S315080032E00860FDF74BFF050020684068C0070DD54C
+S315080032F0FDF744FF401B0B28F6D3606A50F40030F4
+S315080033006062052084F82000012008E00020606241
+S31508003310002004E0606A50F400206062012032BD9B
+S315080033200064004070B490F820500468A6688C6861
+S31508003330002CFFD02C00E4B2012C02D0EDB2022DF5
+S315080033406ED116F0E05F65D0C6F30164032C05D391
+S31508003350416A51F400014162012066E00125A54059
+S315080033601D608B68002B09D10B68CD6855EA43555B
+S31508003370036826013344C3F880510AE04B688D6818
+S3150800338055EAC305CB681D43036826013344C3F8D1
+S3150800339080510B69056826013544C5F88431097DD5
+S315080033A001290BD1016823011944D1F8841151F47C
+S315080033B08071036825012B44C3F88411D179937968
+S315080033C01B0453EA0163517953EA012311790B432C
+S315080033D0016825012944C1F88C31D17893781B04FA
+S315080033E053EA0163517853EA012311780B430168C4
+S315080033F022011144C1F88831016822011144D1F82B
+S31508003400801151F00101006822011044C0F88011B2
+S3150800341000200AE0416A51F400114162012004E0EB
+S31508003420416A51F480214162012070BC704710B492
+S315080034300200002092F820301C00E4B2012C02D0D1
+S31508003440DBB2022B07D11268926812EA8162B2EBEC
+S31508003450816F00D0012010BC704730B490F820402E
+S315080034602500EDB2012D03D0E4B2022C40F098807D
+S3150800347000290AD10468E46814F0030F10D1416AE0
+S3150800348051F40011416201208FE00468246914F0A8
+S31508003490030F05D1416A51F400114162012084E00D
+S315080034A004680D012C44D4F8B04114F00404946067
+S315080034B09468002C07D104680D012C44D4F8B04157
+S315080034C0640D146006E004680D012C44D4F8B0417C
+S315080034D0E408546004680D012C44D4F8B04114F093
+S315080034E00204D46004680D012C44D4F8B44114F0E5
+S315080034F00F04146104680D012C44D4F8B441C4F3D4
+S315080035000724946104680D012C44D4F8B441240CB2
+S31508003510546102680C012244D2F8B8211A70026874
+S315080035200C012244D2F8B821120A5A7002680C011A
+S315080035302244D2F8B821120C9A7002680C0122446F
+S31508003540D2F8B821120EDA7002680C012244D2F8B9
+S31508003550BC211A7102680C012244D2F8BC21120A55
+S315080035605A7102680C012244D2F8BC21120C9A71D5
+S3150800357002680C012244D2F8BC21120EDA71002925
+S3150800358006D10168C96851F020010068C16005E0EC
+S315080035900168096951F0200100680161002004E012
+S315080035A0416A51F480214162012030BC704770475E
+S315080035B0DFF80805006850F00100DFF8001508601C
+S315080035C07047DFF8F8040068400810F001007047FB
+S315080035D0DFF8E814096831F0F80151EAC001DFF8AC
+S315080035E0DC0401607047DFF8D0040068400810F07A
+S315080035F001007047DFF8CC04006810F00C00704733
+S31508003600DFF8C004006810F0F0007047DFF8B40473
+S31508003610006810F4E0507047DFF8A804006810F45A
+S31508003620604070470100DFF8A0040068084050EACF
+S31508003630014070470100DFF890040068084050EA2E
+S3150800364001407047DFF874040068400E10F001006E
+S315080036507047DFF87804006810F480007047DFF8D8
+S315080036606C040068C0F388107047DFF860040068CF
+S3150800367010F440307047DFF85404006810F03F003B
+S315080036807047DFF838040068C00E10F00100704774
+S31508003690DFF828040068400F10F00100704780B575
+S315080036A0FFF786FFFFF78DFF0128FBD10020DFF823
+S315080036B014140860DFF80404006800900099DFF825
+S315080036C01804014000910098DFF8F01308601020F4
+S315080036D0FFF77EFFFFF7B6FF0028FBD1FFF7D1FF04
+S315080036E00028FBD1FFF7D4FF0028FBD1DFF8EC0355
+S315080036F0DFF8D8130860DFF8E803DFF8D4130860AA
+S31508003700DFF8DC03DFF8CC130860DFF8D8030068BD
+S3150800371030F4FE40DFF8CC130860DFF8C803006811
+S3150800372050F47F00DFF8BC130860DFF894030068E4
+S3150800373040084000DFF888130860DFF88403006853
+S3150800374050F08070DFF878130860002002BD10B5CD
+S31508003750040000F05CF92060206800F06CF96060F5
+S31508003760606800F073F9A060606800F079F9E060BD
+S3150800377010BD10B50024032824D1FFF753FFDFF846
+S315080037806813401A04D0401E06D0401E0BD011E024
+S3150800379000F03DF904008DE0FFF713FF002801D083
+S315080037A0DFF8484386E0FFF71EFF002801D04FF4F4
+S315080037B000447FE000F02BF900F03DF900F050F9E5
+S315080037C0040077E00C2824D1FFF72CFFDFF820133C
+S315080037D0401A04D0001F06D0001F0BD011E000F0DD
+S315080037E016F9040066E0FFF7ECFE002801D0DFF8C2
+S315080037F0FC425FE0FFF7F7FE002801D04FF40044D3
+S3150800380058E000F004F900F016F900F01FF904007A
+S3150800381050E0B0F5406F27D1FFF704FFDFF8D41268
+S31508003820884207D0DFF8D012884207D0B0F10C2FB3
+S315080038300BD011E000F0EBF804003BE0FFF7C1FE07
+S31508003840002801D0DFF8A44234E0FFF7CCFE0028B8
+S3150800385001D04FF400442DE000F0D9F800F0EBF861
+S3150800386000F0FEF8040025E0302823D1FFF7DAFE41
+S31508003870DFF88812401A04D0103806D010380BD05A
+S3150800388011E000F0C4F8040014E0FFF79AFE0028DF
+S3150800389001D0DFF858420DE0FFF7A5FE002801D059
+S315080038A04FF4004406E000F0B2F800F0C4F800F067
+S315080038B0CDF80400200010BD10B50024C02824D17E
+S315080038C0FFF7B8FEDFF83812401A04D0403806D0A1
+S315080038D040380BD011E000F09AF8040095E0FFF7A5
+S315080038E070FE002801D0DFF804428EE0FFF77BFE69
+S315080038F0002801D04FF4004487E000F088F800F073
+S315080039009AF800F0A3F804007FE0B0F5407F27D1CD
+S31508003910FFF790FEDFF8EC11884207D0DFF8E811D0
+S31508003920884207D0B0F1032F0BD011E000F06FF8F2
+S3150800393004006AE0FFF745FE002801D0DFF8AC4135
+S3150800394063E0FFF750FE002801D04FF400445CE026
+S3150800395000F05DF800F06FF800F078F8040054E025
+S31508003960B0F5405F27D1FFF765FEDFF8A011884262
+S3150800397007D0DFF89C11884207D0B0F1302F0BD062
+S3150800398011E000F044F804003FE0FFF71AFE0028B3
+S3150800399001D0DFF8584138E0FFF725FE002801D0AE
+S315080039A04FF4004431E000F032F800F044F800F03B
+S315080039B04DF8040029E0B0F5404F26D1FFF73AFE4E
+S315080039C0DFF85011884207D0DFF84C11884207D03B
+S315080039D0B0F1C02F0BD011E000F019F8040014E084
+S315080039E0FFF7EFFD002801D0DFF800410DE0FFF7F3
+S315080039F0FAFD002801D04FF4004406E000F007F86D
+S31508003A0000F019F800F022F80400200010BD80B577
+S31508003A100020FFF7EFFD002804D0042804D008286A
+S31508003A2004D006E0314805E03C4803E000F022F8FF
+S31508003A3000E02E4802BD10B50400FFF7E1FD384945
+S31508003A40C0F30310085CC440200010BD10B5040084
+S31508003A50FFF7DCFD3349800A085CC440200010BD2E
+S31508003A6010B50400FFF7D8FD2E49400B085CC4408A
+S31508003A70200010BD70B500200020FFF7EAFD0028E1
+S31508003A8003D0B0F5800F02D003E0184C02E0234CB7
+S31508003A9000E0164CFFF7EFFD0500FFF7E0FD060016
+S31508003AA0B4FBF5F006FB00F6FFF7DFFD000C401C43
+S31508003AB04000B6FBF0F070BD703802400038024096
+S31508003AC074380240083802409038024004380240F0
+S31508003AD08438024088380240FFFFF2EA103000249A
+S31508003AE0003000240C380240010003000024F400D2
+S31508003AF004000C000004000C0008000C1000300044
+S31508003B004000C0000001000300020003001000305E
+S31508003B1000200030004000C0008000C000127A007B
+S31508003B20EC6400081C6500080020DFF8041581F81D
+S31508003B3081000020DFF8F814C1F888000020DFF8BB
+S31508003B40F01481F884000020DFF8E414A1F8860058
+S31508003B500020DFF8DC1481F883000020DFF8D01499
+S31508003B6081F882007047DFF8C80490F881000028C1
+S31508003B7001D1002000E0012070470020DFF8B014D2
+S31508003B8081F88400704780B50178FF291ED100F0BE
+S31508003B90B3F8DFF89C0490F88400012802D11020BD
+S31508003BA000F085F8DFF88804B0F9860001280CDBF8
+S31508003BB00120DFF87C1481F88400DFF87404B0F97A
+S31508003BC08610DFF86C0400F054F801BDDFF86014C5
+S31508003BD091F8811001294BD10178C92932D0CC2915
+S31508003BE03FD0CF293AD0D0292FD0D12933D0D229C6
+S31508003BF02ED0F32917D0F4290FD0F5290AD0F629A3
+S31508003C000ED0FA2912D0FC2913D0FD2914D0FE298A
+S31508003C1015D029E000F0FEF8BBE700F021F9B8E777
+S31508003C2000F0E9F8B5E700F047F9B2E700F0C9F89F
+S31508003C30AFE700F0C1F8ACE700F0A5F8A9E700F097
+S31508003C4093F8A6E700F075F9A3E700F098F9A0E75E
+S31508003C5000F053F99DE700F0C7F99AE700F0DDF99F
+S31508003C6097E700F0EDF994E7202000F020F890E7B8
+S31508003C70ABE780B589B200F02CFA01BDF8B50400AF
+S31508003C800D001600002704E02078C719641CFFF70A
+S31508003C9094F92800451E0028F6D1FFB237600120A6
+S31508003CA0F2BD0020DFF8881381F882007047FE21F4
+S31508003CB0DFF87C231170DFF8781348700220DFF8EC
+S31508003CC07013A1F886007047010000200A78104397
+S31508003CD04A7850EA02208A7850EA0240C97850EABF
+S31508003CE00160704708700200120A4A700200120C3E
+S31508003CF08A70000EC870704780B5FFF7D2FF0120A2
+S31508003D00DFF82C1381F88100FF20DFF824130870F0
+S31508003D100020DFF81C134870C548407850F01000A2
+S31508003D20C34948700020C2498870C1488078C04994
+S31508003D30887000F0EFF9BE49C87000F000FABC4977
+S31508003D40087100F0FCF980B2000AB94948710120EF
+S31508003D50B74988710120B649C8710820B449A1F845
+S31508003D60860000F00FFA01BD80B50020B04981F841
+S31508003D708100FFF796FFFF20AD4908700120AC4986
+S31508003D80A1F8860001BDFF20A94908700020A849AE
+S31508003D904870A74890F88200A54988700020A44971
+S31508003DA0C8700020A24908710020A1494871062060
+S31508003DB09F49A1F88600704780B50020FFF777FF76
+S31508003DC001BD80B5FF209A4908709A489849C1F8FC
+S31508003DD08800002096494870002095498870002080
+S31508003DE09349C87007209449FFF77CFF082090493B
+S31508003DF0A1F8860001BD80B5FF218D4A1170001D0E
+S31508003E00FFF762FF8A49C1F8880001208849A1F8AE
+S31508003E10860001BD10B5040000F07CF980B2401E92
+S31508003E206178884203DA2220FFF741FF17E06278BB
+S31508003E30824892B27E49D1F8881000F0E7F9FF204F
+S31508003E407B4908707A48D0F8880061784018784924
+S31508003E50C1F888006078401C7549A1F8860010BD35
+S31508003E6010B5040000F056F980B2401E6178884209
+S31508003E7003DA2220FFF71BFF1DE0201DFFF724FFB2
+S31508003E806B49C1F8880062786C4892B26849D1F8E3
+S31508003E90881000F0BBF9FF20654908706448D0F81F
+S31508003EA08800617840186249C1F888006078401C2B
+S31508003EB05F49A1F8860010BD80B500210091FF2159
+S31508003EC05B4A1170001DFFF7FFFE6A46010058485D
+S31508003ED0D0F88800FFF7D2FE554948705649009831
+S31508003EE0FFF700FF00205249887000205049C8702B
+S31508003EF008204F49A1F8860001BD80B5FF204C492E
+S31508003F00087000204A49487000204949887000F026
+S31508003F1001F94749C87000204549087100204449FD
+S31508003F20487100204249887107204149A1F8860056
+S31508003F3001BD10B5040000F0EDF8621C80B2401E09
+S31508003F4001003B48D0F8880000F020F9002803D18A
+S31508003F503120FFF7ACFE11E0FF203549087000F06C
+S31508003F60D9F83349D1F8881080B2401E4018304934
+S31508003F70C1F8880001202E49A1F8860010BD10B5A9
+S31508003F80040000F0C7F880B2801E6178884203DA20
+S31508003F902220FFF78CFE26E0FF2025490870012025
+S31508003FA02349A1F886006078002807D100F0FEF8BA
+S31508003FB0002802D13120FFF77AFE14E0A21C6178AE
+S31508003FC01B48D0F8880000F0E1F8002803D131201A
+S31508003FD0FFF76DFE07E01648D0F8880061784018AC
+S31508003FE01349C1F8880010BD10B51149D1F88840A9
+S31508003FF0001DFFF769FE0100200000F0CBF800283D
+S3150800400003D13120FFF753FE06E0FF200849087068
+S3150800401001200749A1F8860010BD80B500F0D4F844
+S31508004020FF200349087001200149A1F8860001BD57
+S31508004030640E00202C650008680E0020650E00201E
+S3150800404080B53120FFF733FE01BD000080B5FFF7CC
+S315080040506BFD00F04EF901204349087000F03CFA68
+S3150800406000204149087000F0F7FA02203E4908701E
+S3150800407001BD80B569463D4800F0DDF9012807D144
+S315080040800120394908709DF800103848FFF77BFD74
+S315080040906946364800F05EFA012807D10020324901
+S315080040A008709DF800103148FFF76DFD69462F48E6
+S315080040B000F059FB012807D102202B4908709DF80A
+S315080040C000102A48FFF75FFD01BD80B500F00AFB26
+S315080040D001BD38B504000D0023480078012804D135
+S315080040E02900C9B2200000F078F91F480078002896
+S315080040F004D12900C9B2200000F00BFA1A4800784A
+S31508004100022804D12900C9B2200000F0FAFAFFF704
+S3150800411034FD31BD14480078002805D0022807D0A0
+S3150800412004D3032806D007E0812006E0082004E02F
+S315080041303F2002E0002000E0812080B270470A4854
+S315080041400078002805D0022807D004D3032806D013
+S3150800415007E0812006E0082004E03F2002E0002076
+S3150800416000E0812080B2704784010020F00E002014
+S3150800417010B50024FFF7F7FC002800D00124200022
+S31508004180C0B210BD80B500F0E3FC01BD80B500F0FB
+S31508004190EAFC02BD80B500F01FFD02BD80B500F047
+S315080041A08BFD02BD80B500F0DBFD02BD80B500F0D9
+S315080041B03EFD002801D1002001E000F0B4FD02BD5B
+S315080041C080B500F046FF01BD10B5FFF7E7FF0028F0
+S315080041D016D0FEF77EFA002812D0FFF776FF00F019
+S315080041E048FFFCF7A7FFFFF7DDFF06490840064929
+S315080041F00860FFF7D7FF001D046800F02CFFA047F2
+S3150800420010BD000080FFFF1F08ED00E070B5040038
+S315080042100D00160005E0287820706D1C641CFEF75A
+S31508004220CCFE3000461E80B20028F4D170BD0000D6
+S31508004230F8B584B007000C0015001E006846FFF7A5
+S3150800424086FA02984FF47A71B0FBF1F1002200E089
+S31508004250521C1000C0B2122848D2380080B28B4BCC
+S3150800426094465FFA8CFC13F81C30DFF820C2964699
+S315080042705FFA8EFE0CEB4E0C9CF801C01CEB030398
+S315080042805B1C5843B1FBF0F300FB13100028DFD189
+S31508004290380080B27D4B94465FFA8CFC13F81C30CC
+S315080042A0DFF8E8C196465FFA8EFE0CEB4E0C9CF8DA
+S315080042B001C01CEB03035B1C5843B1FBF0F02080E4
+S315080042C020880028C4D0208840F201439842BFDAEB
+S315080042D06E481100C9B210F8110028706B48D2B2A6
+S315080042E000EB420040783070012000E0002005B065
+S315080042F0F0BD18B58BB00020ADF8020000208DF88F
+S31508004300010000208DF8000040F267646B460DF14D
+S3150800431001020DF102014FF4FA70FFF789FF002838
+S3150800432003D1B5215A48FEF7C6F95A485A490860D2
+S3150800433000205949087600205749487600205649F2
+S31508004340887601205449C87600205349087700200A
+S315080043505149487700205049886000204E49C86076
+S315080043609DF80100401E00044B4908619DF80000B5
+S31508004370401E000548494861BDF8020046494860A4
+S315080043804548FEF757FE002C02D46405434805E06D
+S3150800439024F00044E40054F0040441480021069146
+S315080043A000210791012108912100090C0191A4B26D
+S315080043B002940100090C039180B204900020059034
+S315080043C0012009900E200A9001A93348FEF7E8FE5D
+S315080043D03148FEF777FF0CB010BD18B587B002005C
+S315080043E040F2E170002803D401900020039004E015
+S315080043F020F0004002900420039000200490C9B2E7
+S3150800440005916B4601A92448FEF78CFFC0B2002827
+S315080044100FD1FCF7A3FE0400323400991E48FFF7BB
+S3150800442006F8002805D0FEF7C8FDFCF797FE84427B
+S31508004430F3D208B010BD78B587B003000C0040F27F
+S31508004440676600256A4600211348FFF706F8002824
+S3150800445012D1002E07D40098B0420DD10298002838
+S315080044600AD1012508E026F000460198B04203D19A
+S315080044700298042800D101252800C0B2012801D1DC
+S31508004480049820702800C0B208B070BDD463000834
+S31508004490D462000800640040701100200400E0FFA8
+S315080044A0FCFF1F00016851F00101016070470168B7
+S315080044B04908490001607047C069400910F00100C9
+S315080044C07047C069C00910F001007047406AC0B261
+S315080044D07047C9B28162704700B587B05748FFF781
+S315080044E0E6FF4FF461400090002001900020029002
+S315080044F0002003900C2004900020059000200690D0
+S3150800450069464E4800F012FE4C48FFF7CBFF07B04D
+S3150800451000BD70B504000D002800C0B2822803DB78
+S3150800452083214748FEF7C7F82800C0B200F06FF8A5
+S31508004530002607E0FEF741FD300080B2205C00F05F
+S3150800454066F8761C30002900C9B280B289B2884262
+S31508004550F0D370BD38B504000D003A48007800283D
+S3150800456017D1394800F044F801283FD13648007879
+S3150800457000283BD034480078822837DAFCF7EEFD6D
+S315080045803249086000203249087001202D49087018
+S315080045902CE02D482E4909780844401C00F028F8DC
+S315080045A0012819D12A480078401C2949087028484A
+S315080045B0007825490978884218D12548027892B2A8
+S315080045C024492000FFF722FE00201E4908702048D3
+S315080045D00078287001200AE0FCF7C0FD1B4909682D
+S315080045E0C831814202D2002016490870002032BD27
+S315080045F010B504001148FFF75FFF002805D00F48E3
+S31508004600FFF764FF2070012000E0002010BD10B500
+S315080046100100C9B20948FFF75CFFFCF79FFD0400DB
+S315080046200A340648FFF74DFF002805D1FEF7C5FCFA
+S31508004630FCF794FD8442F4D210BD00000048004007
+S3150800464080620008D5110020740F0020C0110020D8
+S31508004650D4110020750F002080B500F048F94021DC
+S31508004660DFF8AC0400F057F9DFF8A8140870402109
+S31508004670DFF8A40400F04FF9DFF8A0140870DFF89B
+S3150800468094040078FF2804D0DFF890040078FF2807
+S3150800469004D18421DFF88804FEF70DF80022DFF83C
+S315080046A08414DFF88404FDF72FFEDFF88014DFF8A2
+S315080046B07804FDF76DFE0120FEF725F8DFF868049B
+S315080046C0FDF77AFEDFF86004D0F8C402FDF704F9B6
+S315080046D000F0D6FDB0F5FA6F03D24FF4FA6000F099
+S315080046E0CCFD01BD80B5DFF84004D0F8C402FDF763
+S315080046F006F9DFF83404FDF726FE0020FEF703F876
+S3150800470001BD70B505000C002000C0B2402804DBCE
+S31508004710B921DFF80C04FDF7CEFF2000C0B200F087
+S315080047207DF8C0B2012804D0BD21DFF8F403FDF7F7
+S31508004730C2FF00260FE0FEF740FC300080B2285C7E
+S3150800474000F06CF8C0B2012804D0C621DFF8D00307
+S31508004750FDF7B1FF761C30002100C9B280B289B2DC
+S315080047608842E8D370BD38B504000D00DFF8B803F9
+S31508004770D0F8C402FCF726FEDFF8B4030078002858
+S3150800478019D1DFF8B00300F041F8012811D1DFF89C
+S31508004790A403007800280CD0DFF898030078402896
+S315080047A007DA0120DFF8881308700020DFF888137D
+S315080047B00870002032BDDFF87C03DFF87C13097827
+S315080047C00844401C00F022F80128F2D1DFF86803FB
+S315080047D00078401CDFF860130870DFF85C03007887
+S315080047E0DFF8501309788842E3D1DFF84C030278E2
+S315080047F092B2DFF848132000FFF708FD0020CC49E5
+S315080048000870CD48007828700120D3E780B50100EC
+S31508004810C248007800F004F9C0B202BD80B50100B4
+S31508004820C9B2BC48007800F08FF8C0B202BD38B5EE
+S31508004830B848007800F059F904002000C0B20028F2
+S3150800484027D02000C0B2412800DB4024002513E011
+S315080048506946B048007800F0E3F8C0B2012804D0F1
+S315080048604FF4A371AE48FDF726FF9DF80000B44942
+S315080048702A00D2B288546D1C28002100C0B2C9B2E1
+S315080048808842E5D3E4B22300AD4A8121A648FDF764
+S31508004890FDFC31BD70B50500002000F08AFD04005E
+S315080048A02900C9B2A048FDF70BFD050000260FE058
+S315080048B0300080B2215C9948007800F045F8C0B213
+S315080048C0012804D04FF4B4719548FDF7F4FE761C20
+S315080048D03000290080B289B28842E9D300F069FD28
+S315080048E00200402301219048FDF7DDFC70BD954983
+S315080048F0954A002004E088744A6118311832401C31
+S315080049000300DBB2002BF6D08874002048618D487E
+S315080049108E490860704710B48C4A1268002A01D183
+S31508004920FF200FE0894A12685369884C2360117486
+S315080049309060D060002353741060C9B20844401ECA
+S315080049405060907C10BC704738B504000D002000FC
+S31508004950C0B2022804DB4FF4E0717148FDF7ABFEE4
+S3150800496078492200D2B21820424301EB0200417C6A
+S31508004970744A2300DBB21820434302EB0300007C91
+S31508004980814201D100204AE06E492200D2B21820A5
+S31508004990424301EB0200C06805706A492200D2B2A0
+S315080049A01820424301EB0200417C491C654A23005A
+S315080049B0DBB21820434302EB03004174614922002D
+S315080049C0D2B21820424301EB0200C068411C5D4A7E
+S315080049D02300DBB21820434302EB0300C1605949A8
+S315080049E02200D2B21820424301EB02004168554A20
+S315080049F02300DBB21820434302EB0300C068814260
+S31508004A000CD250492200D2B21820424389584D4A46
+S31508004A10E4B21820444302EB0400C160012032BD11
+S31508004A2038B504000D002000C0B2022804DB4FF49C
+S31508004A30F1713B48FDF73FFE42492200D2B21820E9
+S31508004A40424301EB0200407C002801D100204BE0E4
+S31508004A503C492200D2B21820424301EB020080688A
+S31508004A600078287037492200D2B21820424301EB59
+S31508004A700200407C411E334A2300DBB21820434320
+S31508004A8002EB030041742F492200D2B21820424398
+S31508004A9001EB02008068411C2A4A2300DBB2182079
+S31508004AA0434302EB0300816026492200D2B2182054
+S31508004AB0424301EB02004168224A2300DBB2182078
+S31508004AC0434302EB0300806881420CD21D49220051
+S31508004AD0D2B21820424389581A4AE4B218204443ED
+S31508004AE002EB04008160012032BD10B504002000ED
+S31508004AF0C0B2022804DB40F202210948FDF7DBFDBB
+S31508004B001049E4B21820444301EB0400407C10BD70
+S31508004B10F90F0020F80F00203D1000203C1000205F
+S31508004B20246300080C0100208C05002014000020D6
+S31508004B30D711002080100020D611002081100020F7
+S31508004B40C01000204011002058110020C811002074
+S31508004B505FF0FF30DFF8E41408605FF0FF30DFF83D
+S31508004B60E0140860704770B504000D001600DFF801
+S31508004B70D404816CDFF8CC04C06C4118491E091BAB
+S31508004B80681E814201D2002025E0200000F025FAA7
+S31508004B90FF2805D02819401E00F01FFAFF2801D16A
+S31508004BA0002018E02100490A4FF400704143DFF85D
+S31508004BB094040068814207D12B0032002100DFF8F7
+S31508004BC0800400F002F906E02B0032002100DFF82D
+S31508004BD06C0400F0FAF870BD70B504000D00DFF83B
+S31508004BE06404816CDFF85C04C06C4118491E091B1B
+S31508004BF0681E814201D2002018E0200000F0EDF97D
+S31508004C0006002C19641E200000F0E7F93100C9B22D
+S31508004C10FF2903D00100C9B2FF2901D1002005E010
+S31508004C200100C9B23000C0B200F08AF970BD80B583
+S31508004C3000200090DFF80804006810F1010F01D188
+S31508004C40012038E00099DFF8F80340684118009120
+S31508004C500099DFF8EC038068411800910099DFF8A5
+S31508004C60E003C068411800910099DFF8D403006991
+S31508004C70411800910099DFF8C8034069411800916E
+S31508004C800099DFF8BC038069411800910099DFF8A4
+S31508004C90B003C069411800910098C043009000987D
+S31508004CA0401C00906A460421DFF89803006810F556
+S31508004CB0E470FFF758FF02BD0021DFF8880300689B
+S31508004CC000684118DFF87C030068001D0068411879
+S31508004CD0DFF870030068083000684118DFF86403DD
+S31508004CE000680C3000684118DFF858030068103077
+S31508004CF000684118DFF84C03006814300068411852
+S31508004D00DFF840030068183000684118DFF83403FC
+S31508004D10006810F5E47000684118002901D10120E7
+S31508004D2000E00020704780B5DFF81403006810F132
+S31508004D30010F07D0DFF8080300F092F8002801D128
+S31508004D4000200CE0BD48006810F1010F06D0BB48F2
+S31508004D5000F086F8002801D1002000E0012002BDFD
+S31508004D60B8480068704780B5CA0501D000200BE036
+S31508004D7002688A4201D1012006E001604FF4007200
+S31508004D80001DFFF743FA012002BD38B504000D00E7
+S31508004D90AB48844208D1A94C29002000FFF7E3FF5D
+S31508004DA0002810D100200FE0A6480068854203D1EC
+S31508004DB0A34CA4480568EFE7200000F051F8002846
+S31508004DC0EAD1002000E0200032BD2DE9F0410400C0
+S31508004DD0884616001D0047467F0A4FF40070474371
+S31508004DE0206810F1010F07D139002000FFF7BBFF3B
+S31508004DF0002801D1002031E02068B84208D03900E7
+S31508004E002000FFF7C2FF0400002C01D1002025E096
+S31508004E102068B8EB000804EB080010F10408FEF758
+S31508004E20CCF8201DB8EB0000B0F5007F09D317F5C4
+S31508004E3000712000FFF7A9FF0400002C0BD014F125
+S31508004E400408307888F8000018F10108761C6D1EF1
+S31508004E50002DE4D101E0002000E00120BDE8F0814A
+S31508004E602DE9F0410600012500F0F0F8002801D1EF
+S31508004E70002022E000F0F8FA002704E0D8F8000045
+S31508004E80A04215D17F1C802F13D2D6F8008018EBCC
+S31508004E90870806EB87004468FEF78FF82200002390
+S31508004EA04146022000F096FA0028E7D0002500E0E7
+S31508004EB0002500F0EBFA2800C0B2BDE8F081F8B58D
+S31508004EC00024002200E0521C1100C9B2072934D27E
+S31508004ED05C4B1500EDB20C214D4303EB0501097A35
+S31508004EE00300DBB29942EED156491300DBB20C201F
+S31508004EF04343CD585349D2B20C20424301EB02003A
+S31508004F00466815F0030F02D116F0030F04D04FF4CC
+S31508004F1031714D48FDF7CFFB0124002701E02D1D17
+S31508004F207F1CB7EB960F08D2380601D1FEF745F875
+S31508004F30286810F1010FF2D000242000C0B2F2BD9B
+S31508004F4078B585B004000D000126002000902800E1
+S31508004F502100C0B2C9B2884200D2002620003949D1
+S31508004F60097AC0B2884206D3364890F8500029001C
+S31508004F70C9B2884200D2002600F068F8002800D19D
+S31508004F8000263000C0B2012823D10020019002205B
+S31508004F9004900120039000F067FA00E0641C2800E2
+S31508004FA02100C0B2C9B2884211D32000C0B2FFF7AF
+S31508004FB086FF0028F2D1FEF700F82000C0B2029062
+S31508004FC0694601A800F032FB0028E7D0002600F069
+S31508004FD05DFA3000C0B206B070BD70B50500FF2698
+S31508004FE0002400E0641C2000C0B2072821D2FDF787
+S31508004FF0E4FF14492200D2B20C2042438858854265
+S31508005000F0D310492200D2B20C20424389580D4AE7
+S315080050102300DBB20C20434302EB0300406841182F
+S315080050208D42DFD20749E4B20C20444301EB040069
+S31508005030067A3000C0B270BD000000005C0800208F
+S31508005040600A00202C620008D86100080120C0B25E
+S31508005050704772B6704762B67047000080B5032085
+S3150800506000F0EAFB002000F00FFC00F063FD0020D2
+S3150800507002BD80B55FF0FF30124908600020114973
+S3150800508008605FF0FF301049086000200E4908608C
+S315080050905FF0FF300D49086000200C4908605FF09A
+S315080050A0FF300B4908600020094908605FF0FF30AF
+S315080050B00849086000200749086000F0AEFD002096
+S315080050C002BD000020380240243802401038024051
+S315080050D01438024018380240006810F00100704782
+S315080050E0426832F44052114341607047826832F494
+S315080050F04072114381607047B2F5004F0FD11A0014
+S31508005100520812EB4102B2FBF3F189B24FF6F07284
+S315080051100A40C1F3420189B20A43C26005E011EBB5
+S315080051205301B1FBF3F189B2C1607047F8B50500C8
+S315080051300F00012600242800FFF7CEFF002862D1C1
+S3150800514029683B48014078680143F8680143386993
+S315080051500143B86901432960B9682800FFF7C0FF11
+S3150800516079692800FFF7C2FF2948854204D1032040
+S31508005170FEF7FFFA04003AE02648854204D10C20DF
+S31508005180FEF7F7FA040032E02348854204D13020BE
+S31508005190FEF7EFFA04002AE02048854204D1C02031
+S315080051A0FEF78AFB040022E01D48854205D14FF42C
+S315080051B04070FEF781FB040019E01A48854205D1C4
+S315080051C04FF44060FEF7D5FA040010E01648854211
+S315080051D005D14FF44050FEF76FFB040007E0134873
+S315080051E0854204D14FF44040FEF766FB0400002CCC
+S315080051F009D03868002806D000263B68BA6921001D
+S315080052002800FFF779FF3000C0B2F2BD00000000A9
+S31508005210001001400044004000480040004C004097
+S31508005220005000400014014000780040007C004017
+S31508005230F369FFEF80B501201849087000F023F8DC
+S3150800524000F001F801BD80B5FEF792FF012813D0E2
+S315080052501248007801280FD1FBF780FF10490A6829
+S31508005260104909688A1812F5FA72904204D3002088
+S315080052700A490870FEF7A8FF01BD0949086070478A
+S3150800528007480068704780B504480078012803D1AC
+S31508005290FBF764FF0349086001BD0000D211002036
+S315080052A0B8110020B411002038B5040000254023A9
+S315080052B0022281212000FCF78BFF402302220121D4
+S315080052C02000FCF785FF40233B4A01212000FCF71C
+S315080052D0EAFF2800C0B232BD38B504000025812196
+S315080052E02000FCF787FF01212000FCF783FF280038
+S315080052F0C0B232BD10B51722304B0C7814F06004DA
+S31508005300002C0ED0402C35D14A78012A08D189883C
+S31508005310072905D12A499E2292B2FDF717FEFFE713
+S3150800532028E04C78062C04D00A2C14D00B2C17D065
+S3150800533020E04C88A4B2240AA4B2212C06D1214B21
+S31508005340CA88182A01DB172200E0CA8892B2190017
+S31508005350FDF7FCFD0EE001221B49FDF7F7FD09E00C
+S315080053604A88D2B2002A03D188781749086001E032
+S31508005370FDF7B0FD002010BD80B5FFF758FA0020F4
+S3150800538002BD80B50800C0B2FFF784FA002002BD4E
+S3150800539080B590F89C02032801D1FFF748FA00204F
+S315080053A002BD20210180094870470A21018008486A
+S315080053B07047014870470000001100205500002082
+S315080053C06C0000205E000020CC1100204C0000205C
+S315080053D008000020F8B506000F0014001D00012083
+S315080053E0DFF83002007D012801D102203BE00120D0
+S315080053F0DFF8201208754CF2503000F04FF8010023
+S31508005400C9B200292AD122002B00002E05D0022E6F
+S315080054100FD008D3032E11D014E01100C9B23800FA
+S3150800542000F0ADF80EE0110089B2380000F091F8EE
+S3150800543008E01100380000F076F803E0380000F0C4
+S3150800544058F8FFE74CF2503000F028F8DFF8C8119A
+S31508005450096849084900DFF8C02111600021DFF812
+S31508005460B4211175C0B2F2BD00206B490968002944
+S315080054700AD56B496B4A11606B496A4A11606649DD
+S315080054800968002900D50120C0B270476248006843
+S3150800549050F00040604908600020704738B50400A5
+S315080054A0002000205B498861FBF768FE05005B4821
+S315080054B00068C0030BD514F1010FF8D0002C04D0F6
+S315080054C0FBF75CFE401B8442F1D2032010E05348F0
+S315080054D0006810F0F20F03D000F065F8012007E02D
+S315080054E04E480068C00702D501204C4908600020D4
+S315080054F032BD10B44849096831F44071464C216000
+S315080055004549096851F44071434C2160424909688C
+S3150800551051F00101404C21600260001D0360BFF399
+S315080055204F8F10BC70473C4A126832F440723A4BAF
+S315080055301A60394A126852F40072374B1A60364AB2
+S31508005540126852F00102344B1A600160BFF34F8FA4
+S315080055507047314A126832F440722F4B1A602E4A4D
+S31508005560126852F480722C4B1A602B4A126852F059
+S315080055700102294B1A600180BFF34F8F7047264AF4
+S31508005580126832F44072244B1A60234A1268224B7E
+S315080055901A60214A126852F001021F4B1A60017004
+S315080055A0BFF34F8F70471D480068800705D5194817
+S315080055B0806950F020001749886118480068C006BD
+S315080055C005D51448806950F01000124988611348BF
+S315080055D00068800605D50F48806950F008000D4917
+S315080055E088610E480068400605D50A48806950F06B
+S315080055F004000849886109480068000605D5054879
+S31508005600806950F0020003498861F2200349086066
+S315080056107047000098110020103C02400C3C0240E4
+S3150800562023016745043C0240AB89EFCD70B5040001
+S315080056300D0001200020DFF83C01007D012801D182
+S31508005640022045E00120DFF82C1108754CF2503095
+S31508005650FFF724FF0100C9B2002934D15FF0FF31FA
+S3150800566029602168012910D1E068C0B200F031F83C
+S315080056704CF25030FFF712FFDFF8FC10096831F0E2
+S315080056800401DFF8F42011601DE0666800E0761C6E
+S31508005690A26861688A18964215D2E168C9B23000D4
+S315080056A000F02FF84CF25030FFF7F8FEDFF8C8107C
+S315080056B0096831F07A01DFF8C02011600100C9B22B
+S315080056C00029E4D02E600021DFF8A8201175C0B2A9
+S315080056D070BD2949096831F44071274A1160264985
+S315080056E0096851F00401244A116023490968C0B2C7
+S315080056F051EA002151F480311F480160BFF34F8FF2
+S31508005700704700220A00D2B2002A01D100210EE019
+S315080057100A00D2B2012A02D14FF4807107E0C9B259
+S31508005720022902D14FF4007101E04FF44071124A88
+S31508005730126832F44072104B1A600F4A126811430D
+S315080057400D4A11600C49096831F0F8010A4A1160DE
+S315080057500949096851EAC00151F002010648016089
+S315080057600548006850F4803003490860BFF34F8F3E
+S315080057707047000098110020103C024010F0070006
+S31508005780DFF8E8100A684FF6FF010A4052EA0022DD
+S31508005790DFF8DC000243DFF8D400026070473348C4
+S315080057A00068C0F302207047020052B2002A04D4EF
+S315080057B00901304A40B2115407E009012E4A40B2A5
+S315080057C010F00F00104400F8041C704710B410F0D5
+S315080057D00700D0F10703052B01D3042301E0D0F11C
+S315080057E00703041D072C01D2002000E0C01E012477
+S315080057F014FA03F35B1E19408140012313FA00F0E3
+S31508005800401E1040084310BC704780B5411EB1F1D8
+S31508005810807F01D301200EE0401E184908600F2141
+S315080058205FF0FF30FFF7C0FF00201549086007202A
+S3150800583014490860002002BD80B5FFF79FFF01BD2F
+S3150800584070B504000D0016000020FFF7A8FF32000F
+S315080058502900FFF7BBFF0100200040B2FFF7A4FFB5
+S3150800586070BD80B5FFF7D1FF02BD00000CED00E06A
+S315080058700000FA0500E400E018ED00E014E000E09E
+S3150800588018E000E010E000E010B504004FF47A706C
+S315080058900D490978B0FBF1F00C490968B1FBF0F045
+S315080058A0FFF7DFFF002801D001200CE0102C09D2F9
+S315080058B0002221005FF0FF30FFF7C2FF04480460B2
+S315080058C0002000E0012010BD850100200400002012
+S315080058D000000020DFF8A803006850F48030DFF8E5
+S315080058E0A01308607047DFF89813096831F440413F
+S315080058F00843DFF88C1308607047DFF888030068F0
+S3150800590050F48020DFF87C1308607047DFF87403D2
+S31508005910006850F48030DFF86C1308607047DFF8D1
+S3150800592064030068400C10F001007047DFF8581354
+S315080059300968890889000843D34908607047D2482E
+S31508005940006810F00C007047CF49096831F0F00183
+S315080059500843CD4908607047CB49096831F4E051DE
+S315080059600843C94908607047C749096831F4604166
+S315080059700843C54908607047C248006850F08070FF
+S31508005980C04908607047BF480068400E10F0010023
+S31508005990704730B4BD4C2568BD4C254028430843A4
+S315080059A050EA82101843B949086030BC704730B4D1
+S315080059B0B64C2568B74C25402843084350EA821060
+S315080059C01843B249086030BC704781B0B2490968CB
+S315080059D00143B14A1160B04909680840009000982F
+S315080059E001B07047AC49096831EA0000AA49086065
+S315080059F0704781B0A94909680143A84A1160A749B7
+S31508005A00096808400090009801B07047A3490968E2
+S31508005A1031EA0000A1490860704781B0A0490968C9
+S31508005A2001439F4A11609E49096808400090009802
+S31508005A3001B070479A49096831EA00009849086038
+S31508005A40704781B0974909680143964A116095499C
+S31508005A50096808400090009801B0704791490968A4
+S31508005A6031EA00008F49086070478F4909680909BB
+S31508005A70090108438C49086070478B48006810F094
+S31508005A800F00704709048161704780B500F005F87A
+S31508005A9000F019F900F025F9FCE780B5FFF7DEFA02
+S31508005AA000F001F801BD80B50720FFF7DEFFFFF71C
+S31508005AB0E4FF072803D067217C48FCF7FCFD4FF478
+S31508005AC04040FFF710FFFFF705FFFFF716FFFFF748
+S31508005AD01DFFFFF724FF0128FBD100234FF4D872DE
+S31508005AE008215FF48000FFF754FF5FF010634FF45E
+S31508005AF0D87208215FF48000FFF759FFFFF73CFFD3
+S31508005B00FFF741FF0128FBD10020FFF71DFF4FF4E7
+S31508005B10A050FFF721FF4FF40040FFF725FF0220B2
+S31508005B20FFF704FFFFF70BFF0828FBD1604800F0DA
+S31508005B30E3F801BD80B586B04FF48040FFF781FFDA
+S31508005B405FF08050FFF769FF0120FFF73EFF022054
+S31508005B50FFF73BFF0420FFF738FF0820FFF735FF64
+S31508005B605FF48020FFF759FF5FF00070FFF755FFDD
+S31508005B7080200090012001900020029000200390D0
+S31508005B800020049069464B4800F0D2F98021494824
+S31508005B90FFF778FF4FF40050009000200190002096
+S31508005BA004906946444800F0C3F94FF440700090E9
+S31508005BB00220019003200290002003900020049008
+S31508005BC00720059069463D4800F0B2F94FF4407049
+S31508005BD000900220019003200290002003900020EC
+S31508005BE00490092005906946324800F0A1F94FF45F
+S31508005BF0C0500090022001900320029000200390DC
+S31508005C00002004900A20059069462D4800F090F976
+S31508005C108020FFF7EEFE07B000BD80B5FDF73FFD1B
+S31508005C2080212448FFF72EFF244800F0EFF8224889
+S31508005C3000F0ECF81F4800F0E9F8214800F0E6F813
+S31508005C408020FFF7E3FE5FF00070FFF7F3FE5FF4D6
+S31508005C508020FFF7EFFE0820FFF7C4FE0420FFF7B9
+S31508005C60C1FE0220FFF7BEFE0120FFF7BBFE5FF074
+S31508005C708050FFF7DFFE4FF48040FFF7EFFE01BDCF
+S31508005C8000700040003802400838024004380240DC
+S31508005C900080BCFF0080BFF0303802403438024034
+S31508005CA04038024044380240003C02407061000817
+S31508005CB000E6DF0C0004024000080240000C024027
+S31508005CC000000240704780B5FEF77AFAFDF771F9D1
+S31508005CD0FBF720FAFEF756FAFEF7B8F9FFF7AAFA25
+S31508005CE001BD80B5FDF769F9FBF72EFAFEF7C1F994
+S31508005CF0FFF7A9FA01BD00000149086070470000D6
+S31508005D000400002030B4046891FAA1F3B3FA83F3CF
+S31508005D100325DBB25B009D40AC4391FAA1F1B1FAD1
+S31508005D2081F1C9B249008A402243026030BC7047FB
+S31508005D3043688B43514319434160704730B48468C4
+S31508005D4091FAA1F3B3FA83F30325DBB25B009D4016
+S31508005D50AC4391FAA1F1B1FA81F1C9B249008A407E
+S31508005D602243826030BC704730B4C46891FAA1F30C
+S31508005D70B3FA83F30325DBB25B009D40AC4391FA8B
+S31508005D80A1F1B1FA81F1C9B249008A402243C26041
+S31508005D9030BC704730B4046A91FAA1F3B3FA83F3BE
+S31508005DA00F25DBB29B009D40AC4391FAA1F1B1FAF5
+S31508005DB081F1C9B289008A402243026230BC704729
+S31508005DC030B4446A0B001B0A93FAA3F3B3FA83F3BD
+S31508005DD00F25DBB29B009D40AC43090A91FAA1F15D
+S31508005DE0B1FA81F1C9B289008A402243426230BCC5
+S31508005DF07047434909680843414908607047404964
+S31508005E00096831EA00003E490860704710B5002469
+S31508005E103C49884206D10120FFF7EBFF0120FFF736
+S31508005E20EEFF6AE03849884206D10220FFF7E1FF13
+S31508005E300220FFF7E4FF60E03449884206D10420D7
+S31508005E40FFF7D7FF0420FFF7DAFF56E0304988420C
+S31508005E5006D10820FFF7CDFF0820FFF7D0FF4CE05A
+S31508005E602C49884206D11020FFF7C3FF1020FFF700
+S31508005E70C6FF42E02849884206D12020FFF7B9FF2D
+S31508005E802020FFF7BCFF38E02449884206D140208D
+S31508005E90FFF7AFFF4020FFF7B2FF2EE02049884208
+S31508005EA006D18020FFF7A5FF8020FFF7A8FF24E092
+S31508005EB01C49884208D14FF48070FFF79AFF4FF4C7
+S31508005EC08070FFF79CFF18E01749884208D14FF405
+S31508005ED00070FFF78EFF4FF40070FFF790FF0CE09D
+S31508005EE01249884208D14FF48060FFF782FF4FF4C9
+S31508005EF08060FFF784FF00E001242000C0B210BDD7
+S31508005F001038024000000240000402400008024027
+S31508005F10000C024000100240001402400018024023
+S31508005F20001C0240002002400024024000280240D3
+S31508005F30F8B505000E0000200020306890FAA0F0A1
+S31508005F40B0FA80F734E0726921002800FFF738FFBD
+S31508005F5028E034680120B8400440002C27D0706837
+S31508005F60012802D07068022809D1B26821002800E9
+S31508005F70FFF7E4FEF26831682800FFF7D9FE3269B8
+S31508005F8021002800FFF7F0FE706802280AD194FA6B
+S31508005F90A4F0B0FA80F00828D5D27269210028004A
+S31508005FA0FFF7F8FE726821002800FFF7ABFE7F1C9A
+S31508005FB03068F8400028CCD10020F2BD12200880B5
+S31508005FC02E487047042008802D48704780B50A007F
+S31508005FD0C0B2002804D12B492B48FCF786FF03E002
+S31508005FE028492948FCF781FF264802BD80B50A00E2
+S31508005FF024492648FCF779FF224802BD80B51A20B5
+S31508006000088000F026F8224802BD80B50A00C0B212
+S31508006010002804D11B491F48FCF767FF03E019490C
+S315080060201C48FCF762FF174802BD80B50A00C0B2DB
+S31508006030002804D113491848FCF757FF03E0114913
+S315080060401548FCF752FF0F4802BD21200880134867
+S31508006050704710B51248006812490C681249096859
+S315080060600818002808D00822104900F023F804224E
+S315080060700F49200000F01EF810BD00002C0100207A
+S3150800608064010020640C0020D8640008FC64000841
+S315080060906801002024650008C0640008400100204B
+S315080060A020F4F01F24F4F01F28F4F01F6A010020E2
+S315080060B07A01002030B4002300231AE00400240FDC
+S315080060C037341D00EDB201F815400AE00400240F2C
+S315080060D00A2CF3D20400240F30341D00EDB201F867
+S315080060E01540000100241D00EDB201EB45056C705A
+S315080060F05B1C1C001500E4B2EDB2AC42E6D330BC22
+S3150800610070470000433A5C576F726B5C736F667436
+S31508006110776172655C4F70656E424C545F57696E65
+S315080061205553425F4175746F5F496E7374616C6C49
+S315080061305C5461726765745C44656D6F5C41524D71
+S31508006140434D375F53544D333246375F4E75636C54
+S31508006150656F5F463734365A475F4941525C426F2E
+S315080061606F745C757362645F636F6E662E6300009E
+S31508006170433A5C576F726B5C736F667477617265CE
+S315080061805C4F70656E424C545F57696E5553425F5B
+S315080061904175746F5F496E7374616C6C5C5461729F
+S315080061A06765745C44656D6F5C41524D434D375F5E
+S315080061B053544D333246375F4E75636C656F5F4691
+S315080061C03734365A475F4941525C426F6F745C6D8B
+S315080061D061696E2E63000000433A5C576F726B5C10
+S315080061E0736F6674776172655C4F70656E424C5466
+S315080061F05F57696E5553425F4175746F5F496E7399
+S3150800620074616C6C5C5461726765745C536F75720B
+S3150800621063655C41524D434D375F53544D333246A7
+S31508006220375C666C6173682E6300000000800008A6
+S315080062300080000001000000000001080080000046
+S315080062400200000000800108008000000300000032
+S315080062500000020800000200040000000000040814
+S315080062600000040005000000000008080000040003
+S315080062700600000000000C080000040007000000EB
+S31508006280433A5C576F726B5C736F667477617265BD
+S315080062905C4F70656E424C545F57696E5553425F4A
+S315080062A04175746F5F496E7374616C6C5C5461728E
+S315080062B06765745C536F757263655C41524D434DF7
+S315080062C0375F53544D333246375C72733233322E4E
+S315080062D063000000433A5C576F726B5C736F6674B9
+S315080062E0776172655C4F70656E424C545F57696E94
+S315080062F05553425F4175746F5F496E7374616C6C78
+S315080063005C5461726765745C536F757263655C4152
+S31508006310524D434D375F53544D333246375C6361B4
+S315080063206E2E6300433A5C576F726B5C736F6674CC
+S31508006330776172655C4F70656E424C545F57696E43
+S315080063405553425F4175746F5F496E7374616C6C27
+S315080063505C5461726765745C536F757263655C4102
+S31508006360524D434D375F53544D333246375C757340
+S31508006370622E630030B4002512E050F8042BD307D0
+S3150800638044BF4A44521E091F042942F8045BFAD244
+S3150800639013468C0744BF15809B1CC90748BF1D7050
+S315080063A050F8041B0029E8D130BC704710B50749DE
+S315080063B079441831064C7C44163404E00A68081DF2
+S315080063C0114488470146A142F8D110BD500000008B
+S315080063D06C0000000502060206030703080309030A
+S315080063E009040A040B040C040C050D050E050F051B
+S315080063F00F061006100710084EF68851CEF2000157
+S31508006400086840F470000860BFF34F8FBFF36F8FC2
+S315080064104FF00070E1EE100A7047000059FFFFFFC9
+S3150800642054100000880100200000000057BAFFFF42
+S31508006430A8020000A8020000000000200548006825
+S3150800644050F47000034908605FF000600249086074
+S315080064507047000088ED00E008ED00E000F00DF858
+S31508006460002801D0FFF7A2FFAFF300800020AFF3AA
+S315080064700080FFF70AFB00F002F80120704700F0E1
+S3150800648001B800000746384600F002F8FBE70000AE
+S3150800649080B5AFF30080024A11001820ABBEFBE7B7
+S315080064A0260002000548014603B4684680F30988B9
+S315080064B0AFF30080FFF7A0FFFFF7D0FFA5EDF5FECD
+S315080064C057696E5553422042756C6B20496E746548
+S315080064D0726661636500000057696E555342204233
+S315080064E0756C6B20446576696365000000000000E2
+S315080064F00000000001020304060708094F70656ED4
+S31508006500424C5420557365720000000001488047CC
+S31508006510014800473D640008A56400080000000023
+S315080065200102030444656661756C74004F70656EFC
+S31508006530424C5400FFF7FEBFFFF7FEBFFFF7FEBF52
+S31508006540FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF71
+S31508006550FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF61
+S31508006560FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF51
+S31508006570FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF41
+S31508006580FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF31
+S31508006590FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF21
+S315080065A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF11
+S315080065B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF01
+S315080065C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF1
+S315080065D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE1
+S315080065E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD1
+S315080065F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC1
+S31508006600FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB0
+S31508006610FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA0
+S31508006620FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF90
+S31508006630FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF80
+S31508006640FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF70
+S31508006650FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF60
+S31508006660FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF50
+S31508006670FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF40
+S31508006680FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF30
+S31508006690FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF20
+S315080066A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF10
+S315080066B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF00
+S315080066C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF0
+S315080066D0FFF7FEBFFFF7FEBF0010FC000624F4001C
+S315080066E00A061001FD00014001FD000BA952000831
+S315080066F0D9520008F5520008F8000B7953000883B0
+S3150800670053000891530008F40003A3530008FC0043
+S3150800671012AB53000809022000010100C032090427
+S31508006720000002FFFD000E070581024000FF070575
+S3150800673001024000FF0AFB000D03069E0014000339
+S315080067400057494E555342F6002C800004000100BC
+S31508006750280044006500760069006300650049006A
+S315080067606E007400650072006600610063006500D3
+S3150800677047005500490044FD004C4E007B00380098
+S3150800678030003700390039003900430033002D0046
+S3150800679045003400450030002D0034003000450027
+S315080067A041002D0038003100380038002D00340033
+S315080067B03800450038003500320042003500340004
+S315080067C04600320042007DFB0023BD5F0008C55F1E
+S315080067D00008ED5F0008CD5F0008FD5F00080B604C
+S315080067E000082B6000084B60000812010102FD003A
+S315080067F02C40501DAC600001010203010000050F8A
+S315080068002100011C100500DF60DDD88945C74C9CB6
+S31508006810D2659D9E648A9F000003069E0001FC00C7
+S3110800682005040309041A03E6000104013C
+S705080064A5E9
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h
index 13647fbd2..79c4ef8cf 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c
index 344676bb5..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,10 +69,11 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
-#define USB_SIZ_BOS_DESC 0x0C
+#define USB_SIZ_BOS_DESC 0x21
/* USER CODE BEGIN PRIVATE_DEFINES */
@@ -123,9 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
/**
* @}
@@ -145,7 +147,7 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
, USBD_FS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};
@@ -158,13 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
-#if (USBD_LPM_ENABLED == 1)
- 0x01, /*bcdUSB */ /* changed to USB version 2.01
- in order to support LPM L1 suspend
- resume test of USBCV3.0*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
#else
0x00, /*bcdUSB */
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -174,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -184,27 +185,36 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
/* USB_DeviceDescriptor */
/** BOS descriptor. */
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
#if defined ( __ICCARM__ ) /* IAR Compiler */
#pragma data_alignment=4
#endif /* defined ( __ICCARM__ ) */
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
- 0x5,
- USB_DESC_TYPE_BOS,
- 0xC,
- 0x0,
- 0x1, /* 1 device capability*/
- /* device capability*/
- 0x7,
- USB_DEVICE_CAPABITY_TYPE,
- 0x2,
- 0x2, /* LPM capability bit set*/
- 0x0,
- 0x0,
- 0x0
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
};
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -367,7 +377,7 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
/**
* @brief Return the BOS descriptor
* @param speed : Current device speed
@@ -380,7 +390,7 @@ uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
*length = sizeof(USBD_FS_BOSDesc);
return (uint8_t*)USBD_FS_BOSDesc;
}
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @brief Create the serial number string descriptor
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.srec
index b4551e94d..6cef033c4 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.srec
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.srec
@@ -1,1282 +1,1313 @@
-S31508000000C016002069020008710200087302000881
-S31508000010750200087702000879020008000000004F
-S315080000200000000000000000000000007B0200083D
-S315080000307D020008000000007F020008072C000867
-S315080000408102000881020008810200088102000876
-S315080000508102000881020008810200088102000866
-S315080000608102000881020008810200088102000856
-S315080000708102000881020008810200088102000846
-S315080000808102000881020008810200088102000836
-S315080000908102000881020008810200088102000826
-S315080000A08102000881020008810200088102000816
-S315080000B08102000881020008810200088102000806
-S315080000C081020008810200088102000881020008F6
-S315080000D081020008810200088102000881020008E6
-S315080000E081020008810200088102000881020008D6
-S315080000F081020008810200088102000881020008C6
-S3150800010081020008810200088102000881020008B5
-S3150800011081020008810200088102000881020008A5
-S315080001208102000881020008810200088102000895
-S315080001308102000881020008810200088102000885
-S315080001408102000881020008810200088102000875
-S315080001508102000881020008810200088102000865
-S315080001608102000881020008810200088102000855
-S3150800017081020008810200088102000800000000D0
-S315080001808102000881020008810200088102000835
-S315080001908102000881020008810200088102000825
-S315080001A08102000881020008810200088102000815
-S315080001B08102000881020008810200088102000805
-S315080001C0810200088102000800F002F800F03CF8FD
+S3150800000048180020A9020008B1020008B302000837
+S31508000010B5020008B7020008B9020008000000008F
+S31508000020000000000000000000000000BB020008FD
+S31508000030BD02000800000000BF020008032D0008EA
+S31508000040C3020008C3020008C3020008C30200086E
+S31508000050C3020008C3020008C3020008C30200085E
+S31508000060C3020008C3020008C3020008C30200084E
+S31508000070C3020008C3020008C3020008C30200083E
+S31508000080C3020008C3020008C3020008C30200082E
+S31508000090C3020008C3020008C3020008C30200081E
+S315080000A0C3020008C3020008C3020008C30200080E
+S315080000B0C3020008C3020008C3020008C3020008FE
+S315080000C0C3020008C3020008C3020008C3020008EE
+S315080000D0C3020008C3020008C3020008C3020008DE
+S315080000E0C3020008C3020008C3020008C3020008CE
+S315080000F0C3020008C3020008C3020008C3020008BE
+S31508000100C3020008C3020008C3020008C3020008AD
+S31508000110C3020008C3020008C3020008C30200089D
+S31508000120C3020008C3020008C3020008C30200088D
+S31508000130C3020008C3020008C3020008C30200087D
+S31508000140C3020008C3020008C3020008C30200086D
+S31508000150C3020008C3020008C3020008C30200085D
+S31508000160C3020008C3020008C3020008C30200084D
+S31508000170C3020008C3020008C3020008000000000A
+S31508000180C3020008C3020008C3020008C30200082D
+S31508000190C3020008C3020008C3020008C30200081D
+S315080001A0C3020008C3020008C3020008C30200080D
+S315080001B0C3020008C3020008C3020008C3020008FD
+S315080001C0C3020008C302000800F002F800F05CF859
S315080001D00AA090E8000C82448344AAF10107DA4594
-S315080001E001D100F031F8AFF2090EBAE80F0013F0AA
-S315080001F0010F18BFFB1A43F001031847F44C00001F
-S31508000200144D0000103A24BF78C878C1FAD85207AE
-S3150800021024BF30C830C144BF04680C607047000072
-S315080002200023002400250026103A28BF78C1FBD8F1
-S31508000230520728BF30C148BF0B6070471FB504F08E
-S3150800024005FE1FBD10B510BD00F063F81146FFF797
-S31508000250F5FF04F0F4FD00F081F803B4FFF7F2FFB0
-S3150800026003BC00F089F800000948804709480047A0
-S31508000270FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE748
-S31508000280FEE7000004480549054A064B704700008A
-S31508000290F92C0008C9010008C0100020C01600206B
-S315080002A0C0120020C012002010B5203AC0F00B8002
-S315080002B0B1E81850203AA0E81850B1E81850A0E85C
-S315080002C01850BFF4F5AF5FEA027C24BFB1E81850B6
-S315080002D0A0E8185044BF18C918C0BDE810405FEA26
-S315080002E0827C24BF51F8043B40F8043B08BF7047A2
-S315080002F0D20728BF31F8023B48BF11F8012B28BFA7
-S3150800030020F8023B48BF00F8012B7047704770473A
-S315080003107047754600F02CF8AE4605006946534608
-S3150800032020F00700854618B020B5FFF7ABFFBDE8FB
-S3150800033020404FF000064FF000074FF000084FF03E
-S31508000340000B21F00701AC46ACE8C009ACE8C009CF
-S31508000350ACE8C009ACE8C0098D46704710B504463C
-S31508000360AFF300802046BDE81040FFF776BF0000D7
-S31508000370004870475C10002001491820ABBEFEE714
-S3150800038026000200704700F0D2F9FCE710B500F02D
-S3150800039075F9012812D00A4C207801280ED102F0EE
-S315080003A0B9FCD4E90112114401F5FA71884205D362
-S315080003B000202070BDE8104000F0D2B910BD000042
-S315080003C0D40000200148406870470000D40000208F
-S315080003D010B504490120087000F006F8BDE8104081
-S315080003E0FFF7D4BFD400002010B5044C20780128AC
-S315080003F002D102F08FFCA06010BD0000D4000020DE
-S315080004000149486070470000D400002010B500F08C
-S3150800041092F900F087F902F085FC02F0F5F900F090
-S3150800042019F9BDE81040FFF7D3BF10B500F07FF902
-S3150800043002F092FC00F02AF9BDE81040FFF7A6BFCB
-S315080004402DE9FF470746884691469A46684601F0D1
-S315080004507FFF02984FF47A71B0FBF1F60024154835
-S315080004604FF4806100EB440310F814205B78D5182C
-S315080004706D1C7D43B6FBF5F205FB1262A2B9B6FB0D
-S31508000480F5F295B2A8F800506D1E8D420CD210F800
-S31508000490141089F8001000EB440040788AF8000030
-S315080004A0012004B0BDE8F087641CE4B2122CD9D34D
-S315080004B00020F6E7764E000830B58DB000240C947F
-S315080004C00B940A940AAB0BAA0CA94FF4FA70FFF71F
-S315080004D0B7FF18B9B5211BA0FFF755FF24482349D4
-S315080004E001600476447684760125C57604774477D8
-S315080004F08460C4609DF82C10491E090401619DF8AA
-S315080005002810491E09054161BDF83010416000F008
-S3150800051090FD0594069407954CF6E04000900194EA
-S315080005204FF6E070029004200390049408950E207C
-S31508000530099069460E4800F071FC0D4800F032FE3D
-S315080005400DB030BD2E2E5C2E2E5C2E2E5C2E2E5C13
-S31508000550536F757263655C41524D434D375F535413
-S315080005604D333246375C63616E2E6300006400408B
-S31508000570E407002070B588B00E4640F2676500248F
-S3150800058003460948002101AA00F0D0FC28B90198C1
-S31508000590A84202D1039800B90124012C01D105987B
-S315080005A0307008B0204670BDE407002010B588B04A
-S315080005B040F2E1730293002304930593069101AB7D
-S315080005C002A902460B4800F0AFFB002810D102F042
-S315080005D0A1FB00F1320405E000F0A9F802F09AFB4D
-S315080005E0A04205D80348019900F0CCFD0028F3D1B4
-S315080005F008B010BDE407002004F0AAB8094800783E
-S31508000600002807D0012807D0022807D0032807D0DA
-S315080006104020704740207047082070473F207047A9
-S3150800062000207047E000002009480078002807D01D
-S31508000630012807D0022807D0032807D04020704792
-S3150800064040207047082070473F20704700207047B9
-S31508000650E000002010B504F043FBFFF72DFF064C21
-S315080006600120207002F01AFA0020207004F080F8A9
-S315080006700220207010BD0000E000002010B5002404
-S3150800068004F03CFB00B10124204610BD38B51448DF
-S315080006906946FFF76FFF134C012805D120709DF8B6
-S315080006A000100F4804F034FB0D48694602F022FAA0
-S315080006B0012806D1002020709DF80010084804F093
-S315080006C027FB0748694604F0B5F8012806D1022039
-S315080006D020709DF80010024804F01AFB38BD00008F
-S315080006E058070020E000002070B506460C460C4D61
-S315080006F02878012803D13046E1B2FFF757FF28785A
-S3150800070018B93046E1B202F04BFA2878022803D12C
-S315080007103046E1B204F014F9BDE8704004F064BB59
-S31508000720E0000020AFF30080642002F03BB8AFF38E
-S31508000730008002F03DB8AFF3008072B6704762B62B
-S31508000740704770B505460C46164605E014F8010BC9
-S3150800075005F8010BFFF7EBFF761EB6B2F6D270BDB1
-S3150800076010B502F053F8002818D000F01DF800283C
-S3150800077014D0FFF741FF00F041FD02F0E5FA02F060
-S3150800078041F8074908400749086002F03BF8446801
-S31508000790FFF7D5FFA446BDE81040604710BD00002E
-S315080007A080FFFF1F08ED00E010B54FF40050074921
-S315080007B00969884303D0002018B1002010BD012024
-S315080007C0FAE701F0E7FF012010BD0000000802402B
-S315080007D00022002905D001291CD002291DD04FF47A
-S315080007E040720F490B6823F440730B600B68134380
-S315080007F00B600A6822F0F8020A600A68022303EB13
-S31508000800C00002430A60086840F480300860BFF3FD
-S315080008104F8F70474FF48072E3E74FF40072E0E7BA
-S31508000820103C024009490A6822F440720A600A68C4
-S3150800083042F004020A600A684FF4803343EA002053
-S3150800084002430A60BFF34F8F70470000103C024016
-S31508000850074A136823F44073136013681360136818
-S3150800086043F0010313600170BFF34F8F7047000018
-S31508000870103C024010B509490C6824F440740C6019
-S315080008800C6844F440740C600C6844F001040C6075
-S3150800089002604360BFF34F8F10BD0000103C02405A
-S315080008A0084A136823F440731360136843F480738B
-S315080008B01360136843F0010313600180BFF34F8F81
-S315080008C070470000103C0240084A136823F440733E
-S315080008D01360136843F400731360136843F001034D
-S315080008E013600160BFF34F8F70470000103C024051
-S315080008F0134908688207134803D5826942F0200223
-S3150800090082610A68D20603D5826942F010028261C2
-S315080009100A68920603D5826942F0080282610A686B
-S31508000920520603D5826942F0040282610A681206F9
-S3150800093003D5826942F002028261F220086070479C
-S315080009400C3C0240F800002070B50446114900200E
-S31508000950886100F029FD05460F4E09E0601C07D0A6
-S3150800096024B100F021FD401BA04201D9032070BD2F
-S315080009703068C003F2D4306810F0F20F03D0FFF7E6
-S31508000980B7FF012070BD3068C00701D00120306074
-S31508000990002070BDF80000200C3C02402DE9F0470D
-S315080009A004460D4616461F464FEA55294FEA492979
-S315080009B02068401C04D14946204600F0C9F838B3DF
-S315080009C02068484505D04946204600F0D3F8044635
-S315080009D004B32068281A05192D1D4FF4007809F567
-S315080009E00079FFF7A4FE281B001F404506D3494699
-S315080009F0204600F0BFF8044674B1251D16F8010B11
-S31508000A0005F8010B7F1E002FEBD10120BDE8F0870A
-S31508000A100020FBE70020F9E70020F7E710B50B48B0
-S31508000A200068401C03D0094800F016F948B1084888
-S31508000A300068401C03D0064800F00EF918B10120E2
-S31508000A4010BD002010BD002010BD0000100A0020B7
-S31508000A500C08002070B505460C460D48411B601E63
-S31508000A60814201D2002070BD284600F03FF80646B4
-S31508000A702819401E00F03AF80146FF2E06D0FF2935
-S31508000A8004D03046BDE8704000F004B8002070BDC0
-S31508000A90FFFF0F0870B586B004460E4601250020F4
-S31508000AA00190B44200D900250CB1072E00D90025C3
-S31508000AB0012D17D10290022005900120049000F024
-S31508000AC05DFC0BE0FFF733FE039401A902A800F0D2
-S31508000AD0C1FB08B1002503E0641CE4B2B442F1D9B5
-S31508000AE000F000FC06B0284670BD00002DE9F04174
-S31508000AF00546FF2700240E4EFFF719FE04EB4401B6
-S31508000B0056F82120AA420BD806EB8100406810440B
-S31508000B10A84205D904EB440006EB8000077A03E0F7
-S31508000B20641CE4B2072CE7D33846BDE8F081000020
-S31508000B309C4E0008004870470080000803494FF0A3
-S31508000B40FF30086001F50171086070470C08002045
-S31508000B5010B5CA0501D0002010BD02688A4201D12D
-S31508000B60012010BD02C04FF40072FFF7EAFD012014
-S31508000B7010BD000070B504460D460D48844202D1EA
-S31508000B80A0F5017409E00B48854202D1084C0546D8
-S31508000B9003E0204600F060F830B129462046FFF70A
-S31508000BA0D7FF18B1204670BD002070BD002070BD6B
-S31508000BB0100A0020008000080B48016842681144AA
-S31508000BC082681144C2681144026911444269114499
-S31508000BD082691144D0F8C8010844002801D00020D1
-S31508000BE070470120704700000080000870B5044671
-S31508000BF00D4616461448011B681E814201D2002084
-S31508000C0070BD2046FFF772FFFF2812D06019401EFC
-S31508000C10FFF76CFFFF280CD0600A40020B49884298
-S31508000C2009D12B46324621460948BDE87040FFF7F0
-S31508000C30B5BE002070BD2B46324621460548BDE8A4
-S31508000C407040FFF7ABBE0000FFFF0F0800800008EA
-S31508000C50100A00200C0800202DE9F04106464FF046
-S31508000C60010800F08BFB0024306800EB840706EBD4
-S31508000C7084004568FFF75BFD00232A4602203946B3
-S31508000C8000F03AFB10B14FF0000808E03868A842B7
-S31508000C9002D04FF0000802E0641C802CE4D300F078
-S31508000CA021FB4046BDE8F08108B5002000900E48BB
-S31508000CB00168491C15D0416882681144C26811440C
-S31508000CC0026911444269114482691144C0690844A1
-S31508000CD0C043401C0090054804216A46FFF786FF7A
-S31508000CE008BD012008BD0000100A0020C8810008C0
-S31508000CF010B50B480168001D0468001D006808440B
-S31508000D0000280BD00749082201F057F905490422A3
-S31508000D102046BDE81040103101F04FB910BD000063
-S31508000D2020F4F01FBA000020F0B590F820500468AF
-S31508000D30A468012D07D0022D05D0416A41F480210F
-S31508000D4041620120F0BD04F0806504F00066354379
-S31508000D5001D1E5005BD5C4F30164022C05D9416ACB
-S31508000D6041F4000141620120F0BD0125A5401D6046
-S31508000D704FF4C0758B689BB1CE6805EB04173343F7
-S31508000D804E6843EAC6030668F35107684FF4C27310
-S31508000D9003EB04130E69FE50097D012909D00DE005
-S31508000DA00E8805EB0417CB6843EA46530668F351E9
-S31508000DB0EBE70168CE5846F48076CE50D3791179A0
-S31508000DC0567941EA036193791B0443EA06231943DA
-S31508000DD003684FF4C67606EB04169951D378117852
-S31508000DE041EA0361937852781B0443EA02221143CD
-S31508000DF002684FF4C47303EB0413D150006805EB83
-S31508000E000411425842F0010242500020F0BD416AE6
-S31508000E1041F4001141620120F0BD000010B590F8C0
-S31508000E202020012A07D0022A05D0416A41F48021F0
-S31508000E304162012010BD3C4800F50070026842F08E
-S31508000E4001020260026822F47C52026002684B6A60
-S31508000E5042EA032202600A7D02F01F0301229A4039
-S31508000E60C3699343C361A0F50070CB69B3B9D0F8E1
-S31508000E700C329343C0F80C328C894B6864F31F43D9
-S31508000E804C6900EBC404C4F840320C890B6864F35F
-S31508000E901F434C6900EBC404C4F84432CB69012BE8
-S31508000EA016D1D0F80C321343C0F80C320C884B68B4
-S31508000EB064F31F434C6900EBC404C4F840320C8940
-S31508000EC0CB6864F31F434C6900EBC404C4F844328E
-S31508000ED08B697BB1D0F804321343C0F804320B692E
-S31508000EE073B1D0F814321343C0F81432096A0129D1
-S31508000EF00CD010E0D0F804329343C0F80432EEE781
-S31508000F00D0F814329343C0F81432EFE7D0F81C1225
-S31508000F101143C0F81C12D0F8001221F00101C0F8E4
-S31508000F200012002010BD00000064004030B590F8A3
-S31508000F302040012C07D0022C05D0416A41F48021BB
-S31508000F404162012030BD21B104682469A4075FD03D
-S31508000F5003E00468E468A40754D005684FF4D8741D
-S31508000F6004EB01142D5905F004059560F5B30568E1
-S31508000F702D59ED08556005682C5904F00204D46013
-S31508000F8005684FF4DA7404EB01142D5905F00F05C2
-S31508000F90156105682D59C5F30725956105682C590E
-S31508000FA0240C546104684FF4DC7202EB0112A45855
-S31508000FB01C700468A458240A5C700468A458240C9D
-S31508000FC09C700468A258120EDA7004684FF4DE7238
-S31508000FD002EB0112A4581C710468A458240A5C7117
-S31508000FE00468A458240C9C71046800E016E0A25812
-S31508000FF0120EDA71B9B10068016941F02001016188
-S31508001000002030BD416A41F400114162012030BD23
-S31508001010416A41F400114162012030BD05682D592D
-S315080010206D0D1560A7E70068C16841F02001C16031
-S31508001030E6E770B50446002C03D094F8200010B1FA
-S3150800104004E0012070BD204600F0ABF82068016876
-S3150800105021F00201016000F0A7F9054605260CE01B
-S3150800106000F0A2F9401B0A2807D9606A40F400304C
-S31508001070606284F82060012070BD2068406880079F
-S31508001080EED42068016841F00101016000F08CF996
-S3150800109005460CE000F088F9401B0A2807D9606A63
-S315080010A040F40030606284F82060012070BD20683A
-S315080010B04068C007EED0207E01283FD0206801682E
-S315080010C021F080010160607E01283DD0206801681A
-S315080010D021F040010160A07E01283BD0206801680C
-S315080010E021F020010160E07E012839D020680168DE
-S315080010F041F010010160207F012837D0206801687F
-S3150800110021F008010160607F012835D02068016858
-S3150800111021F004010160D4E902010843D4E904126C
-S31508001120114308436168491E08432168C8610020C5
-S315080011306062012084F82000002070BD20680168E4
-S3150800114041F080010160BEE72068016841F0400176
-S315080011500160C0E72068016841F020010160C2E72C
-S315080011602068016821F010010160C4E72068016861
-S3150800117041F008010160C6E72068016841F00401F2
-S315080011800160C8E70346002093F82020012A01D011
-S31508001190022A05D11A6889069268914300D001206F
-S315080011A07047704770B5044694F82000012805D0AA
-S315080011B0606A40F400206062012070BD022084F855
-S315080011C020002068016821F00101016000F0ECF8B8
-S315080011D005460DE000F0E8F8401B0A2808D9606AC1
-S315080011E040F400306062052084F82000012070BDBC
-S315080011F020684068C007EDD1606270BD10B50B4A23
-S315080012004FF0FF30106000211160121D1060116050
-S31508001210064A103A10601160121D10601160121D06
-S315080012201060116000F0F0F8002010BD2038024070
-S3150800123070B5044600F0B8F80546601C02D00448AC
-S315080012400078044400F0B0F8401BA042FAD370BD01
-S31508001250080000202DE9F04704460E46DFF87C809A
-S3150800126098F81400012809D0012088F814004CF2D7
-S3150800127050394846FFF768FB18B12AE00220BDE856
-S31508001280F0874FF0FF3131602168154F012901D0F1
-S31508001290656819E0207BFFF7C5FA4846FFF754FB57
-S315080012A0396821F00401396013E0217B2846FFF7ED
-S315080012B08FFA4846FFF748FB396821F07A0139600A
-S315080012C008B1356005E06D1CD4E901211144A94235
-S315080012D0EBD8002188F81410D1E70000F8000020A8
-S315080012E0103C02400348016841F0004101600020BB
-S315080012F070470000103C02402DE9F0470646894633
-S3150800130014461D461B4F387D012808D00120387524
-S315080013104CF250384046FFF717FB18B126E002207A
-S31508001320BDE8F08736B1012E09D0022E0CD0032E67
-S3150800133014D10EE04846E1B2FFF78AFA0EE0A1B2F0
-S315080013404846FFF7ADFA09E021464846FFF7BCFADA
-S3150800135004E022462B464846FFF78CFA4046FFF73C
-S31508001360F3FA05490A6822F001020A600021397574
-S31508001370D6E70000F8000020103C0240002007498C
-S315080013800A68002A09DA054A054B0C3A1360054B28
-S3150800139013600968002900DA01207047103C0240F2
-S315080013A023016745AB89EFCD01F0B4BC10B5032026
-S315080013B000F008F9002000F005F800F067F80020B2
-S315080013C010BD000070B504460D4D4FF47A712878AB
-S315080013D0B1FBF0F00B490968B1FBF0F000F0D2FD63
-S315080013E008B1012070BD102C07D200222146501EDC
-S315080013F000F0C8F86C60002070BD012070BD0000C8
-S31508001400080000200000002010B500F051FF1A4C1B
-S315080014104FF40001A161194800F01CFE184800F0BD
-S3150800142019FE204600F016FE164800F013FE164870
-S31508001430016821F080010160134C0C34206820F00B
-S3150800144000702060206820F480202060082000F0CA
-S31508001450D1FD042000F0CEFD022000F0CBFD0120D6
-S3150800146000F0C8FD206820F080502060201D01682B
-S3150800147021F48041016010BD00040240000C0240C6
-S315080014800008024000000240343802402DE9F041CD
-S3150800149088B03748016841F480410160006800F46B
-S315080014A0804001904FF0805000F0C8FD012000F008
-S315080014B0A9FD022000F0A6FD042000F0A3FD0820E7
-S315080014C000F0A0FD4FF4802000F0B8FD4FF000704A
-S315080014D000F0B4FD802002900120039000240494BB
-S315080014E00594069402A9DFF88C80404600F03EFE7B
-S315080014F04FF40000C8F8180080120290039406946E
-S3150800150002A91D4800F032FE4FF4407702970225E3
-S31508001510039503260496059406940720079002A9C6
-S31508001520164800F023FE0297039504960594069440
-S315080015300920079002A9404600F018FEF002029022
-S3150800154003950496059406940A20079002A90C4868
-S3150800155000F00CFE06481038016841F08001016071
-S31508001560006800F08000019008B0BDE8F081000036
-S31508001570443802400004024000080240000C0240C1
-S3150800158000000240F0B40D460D4B1B68C3F302235E
-S31508001590C3F10704042C00D90424191D072901D214
-S315080015A0002300E0DB1E012606FA04F1491E294045
-S315080015B099409E40761E16403143F0BC03F02FBC7E
-S315080015C00CED00E000F00701054A10684FF6FF032E
-S315080015D0184040EA0120034908431060704700009C
-S315080015E00CED00E00000FA0501680122C0F8FC23B2
-S315080015F0002280F8F423886940F000608861486D0D
-S31508001600024A104348650020704700000300001096
-S315080016107047006841620020704770B50368586AD1
-S31508001620002907D09C6A00EB14440020491E4FF499
-S3150800163082750AE040EA024098620DE005EB8006F2
-S315080016409E5904EB1644401CC0B28842F6D305EBFB
-S31508001650810144EA02405850002070BD10B5044686
-S31508001660012002F0A9FFD4F80004BDE8104001F0FB
-S315080016700CBFC1EBC10200EB8202D0F80004926CE9
-S3150800168001F063BEC1EBC10200EB8202D0F8000490
-S31508001690D2F8082201F0B8BE10B50446002C0CD0CA
-S315080016A0032084F8BD03204600F02EFC204600F0F7
-S315080016B0C9FB002084F8BD0310BD012010BD10B57C
-S315080016C0044694F8BC03012809D0012084F8BC0319
-S315080016D0206802F037FB002084F8BC0310BD022006
-S315080016E010BD10B5044694F8BC03012809D00120A2
-S315080016F084F8BC03206802F031FB002084F8BC03A0
-S3150800170010BD022010BD10B50446002002F054FF9B
-S31508001710D4F80004BDE8104001F0B9BE70B504461F
-S315080017204FF0010201F00F004FF000050B06C0EB69
-S31508001730C00104EB810102D53C314A7002E001F593
-S31508001740FE714D70087094F8BC03012808D084F81F
-S31508001750BC23206802F092FA84F8BC53002070BDBE
-S31508001760022070BD70B5044601F00F006268904211
-S3150800177001D9012070BD0B064FF0010201F00F01DF
-S315080017804FF00005C1EBC10104EB810102D53C31E4
-S315080017904A7002E001F5FE714D708D70087094F87C
-S315080017A0BC03012808D084F8BC23206802F05EFC3C
-S315080017B084F8BC53002070BD022070BD01F00F01F3
-S315080017C0C1EBC10100EB8100D0F8140270472DE986
-S315080017D0F04104464FF0010601F00F004FF00005F6
-S315080017E00F06C0EBC00104EB810102D53C314E70F7
-S315080017F002E001F5FE714D7008708A60CB704A7878
-S3150800180002B1C880022B00D10D7194F8BC030128DF
-S3150800181009D084F8BC63206802F08CF9284684F85D
-S31508001820BC53BDE8F0810220FBE770B50D4605F014
-S315080018300F04C4EBC40100EB810101F5FE71CA6017
-S315080018404B6100238B614B700C700369012B00D12F
-S315080018500A612A0705D0027C006802F05FFC0020B6
-S3150800186070BD027C006802F04DFBF8E770B50446CF
-S315080018700D4605F00F006168884201D9012070BD48
-S3150800188029064FF000064FF0010206D5C0EBC0014D
-S3150800189004EB81013C314A7006E0C5EBC50104EB57
-S315080018A0810101F5FE714E708A70087094F8BC03C8
-S315080018B0012807D084F8BC23206802F003FC280717
-S315080018C002D007E0022070BD217C04F57172206801
-S315080018D002F0A2FB84F8BC63002070BD70B50D460B
-S315080018E005F00F04C4EBC40100EB81013C31CA606A
-S315080018F04B6100238B6101234B700C700369012B2C
-S3150800190000D10A612A0705D0027C006802F006FCAD
-S31508001910002070BD027C006802F0F4FAF8E72DE9B1
-S31508001920F84F04462568284602F02AFD00287ED18D
-S31508001930206802F051FD002879D0206802F04CFD9D
-S31508001940800704D52068416901F0020141612068D9
-S3150800195002F042FDC10604F57170009035D5206885
-S31508001960816921F0100181612F6A07F00F00C0EB31
-S31508001970C00004EB800606F5FE76C7F3434002284E
-S3150800198002D0062812D01BE047F6F070074217D09F
-S31508001990C7F30A12F1681746284602F021FDF068D7
-S315080019A03844F060B0693844B06109E0009908220B
-S315080019B0284602F015FDB069C7F30A110844B0615C
-S315080019C02068816941F010018161206802F004FDF8
-S315080019D000034FF001084FF008094FF0100A3ED5F2
-S315080019E00026206802F0D7FC834635E05FEACB7014
-S315080019F02FD02068F1B202F0E7FC0746F80707D0B7
-S31508001A0005EB4610C0F8088B3146204600F026FF45
-S31508001A10380707D505EB4610C0F8089B314620461F
-S31508001A2000F0F8FEF80605D505EB461000E087E15C
-S31508001A30C0F808ABB80604D505EB46112020C1F856
-S31508001A40080BB80405D505EB46114FF40050C1F84C
-S31508001A50080B761C4FEA5B0BBBF1000FC6D120685A
-S31508001A6002F0BAFC400359D5206802F08DFC834683
-S31508001A70002650E05FEACB704AD02068F1B202F047
-S31508001A8091FC0746F80723D006F00F0108FA01F083
-S31508001A90D5F834188143C5F8341805EB4610C0F854
-S31508001AA00889206901280FD1C6EBC60004EB80001F
-S31508001AB0D0E911211144816436B9206D20B9206816
-S31508001AC00121009A02F0A8FA2046F1B2FFF7D1FDEB
-S31508001AD0380703D505EB4610C0F80899F80603D56C
-S31508001AE005EB4610C0F808A9780604D505EB46119B
-S31508001AF04020C1F80809B80704D505EB46110220AD
-S31508001B00C1F80809380603D53146204600F018FF03
-S31508001B10761C4FEA5B0BBBF1000FABD1206802F0D5
-S31508001B205BFC002811DAD5F8040820F00100C5F896
-S31508001B30040894F8F403012839D0204600F0A6F9E1
-S31508001B402068416901F000414161206802F044FCC7
-S31508001B5000050BD5D5F80808C00702D0204600F0C6
-S31508001B60F1F92068416901F400614161206802F0D9
-S31508001B7033FC00010AD52068416901F00061416122
-S31508001B8094F8F403D8B1204600F0DCF9206802F096
-S31508001B9023FCC00473D5D5F8040820F00100C5F865
-S31508001BA004082068102102F0C9FB002132E0002059
-S31508001BB084F8F40300212046FFF72AFDC0E784F8DD
-S31508001BC0F4832068406DC0F38300C4F8F80301214C
-S31508001BD02046FFF71DFDD9E705EB41104FF67F328A
-S31508001BE000F510608260036823F40013036003683D
-S31508001BF043F000630360C0F80822D0F8002222F4FC
-S31508001C000012C0F80022D0F8002242F00062C0F8A4
-S31508001C100022491C60688842DED8D5F81C0840F0C6
-S31508001C200110C5F81C08206B60B1D5F8840840F08F
-S31508001C300B00C5F88408D5F8440840F00B00C5F831
-S31508001C4044080CE0D5F8140842F22B010843C5F8FD
-S31508001C501408D5F8100840F00B00C5F81008D5F898
-S31508001C60000820F4FE60C5F80008217C2068009A68
-S31508001C7002F0D2F92068416901F480514161206877
-S31508001C8002F0AAFB800415D5206801F095FF2068AC
-S31508001C9002F066FBE06000F06FF9227B01462068DF
-S31508001CA002F0DCFB204600F0CFF82068416901F419
-S31508001CB000514161206802F08FFB000707D52046D6
-S31508001CC000F0EEF82068416901F0080141612068DA
-S31508001CD002F082FBC00208D50021204600F032F847
-S31508001CE02068416901F480114161206802F074FBA3
-S31508001CF0800208D50021204600F028F820684169AE
-S31508001D0001F400114161206802F066FB400007D526
-S31508001D102046FFF7A3FC2068416901F08041416134
-S31508001D20206802F059FB40070AD52068456868070D
-S31508001D3002D52046FFF7E7FC206841682943416041
-S31508001D40BDE8F88FD0F8000401F0FEBBD0F8000417
-S31508001D5001F0FCBB2DE9F0418AB00446002C05D001
-S31508001D60266894F8BD03002520B108E001200AB0D2
-S31508001D70BDE8F08184F8BC53204600F064F80320DF
-S31508001D8084F8BD03F06BC00500D42561206802F015
-S31508001D90B3F804F11001684628228846FEF784FA4B
-S31508001DA094E80F0001F016FF022718B184F8BD73F6
-S31508001DB00120DCE72068002102F021FB0021012632
-S31508001DC00DE0C1EBC10004EB80003C3046700170A9
-S31508001DD0C180C5708560C5604561491CC9B2606827
-S31508001DE08842EED800210DE0C1EBC10004EB80006B
-S31508001DF000F5FE7045700170C5708560C560456167
-S31508001E00491CC9B260688842EED82822414668460D
-S31508001E10FEF74AFA94E80F0001F0ACFF18B184F80F
-S31508001E20BD730120A3E784F8385084F8BD63606A5F
-S31508001E30012802D12046FFF7D7FB206801F08EFF64
-S31508001E40002094E77047704770B504460125E0689E
-S31508001E50002810D0022803D0912108A0FEF793FA93
-S31508001E60D4F80004294601F0C8FBD4F80004BDE8FC
-S31508001E70704001F082BB0025F2E700002E2E5C754B
-S31508001E807362645F636F6E662E63000010B5044666
-S31508001E9002F0C6FCD4F80004BDE8104001F097BB78
-S31508001EA0D0F8000401F09DBB10B5044694F8BC03B5
-S31508001EB001280BD0012084F8BC0384F83810206868
-S31508001EC002F0B5FA002084F8BC0310BD022010BD4C
-S31508001ED0D0F8002400F57171104601F09ABB10B5D0
-S31508001EE0044694F8BC0301280CD0012084F8BC03EE
-S31508001EF0206801F027FF206802F00AFA002084F81B
-S31508001F00BC0310BD022010BD70B5044694F8BC038E
-S31508001F1001280ED0012084F8BC03206801F0ECFFEC
-S31508001F20206802F015FB002528B184F8BC5301206F
-S31508001F3070BD022070BD206801F010FF84F8BC5304
-S31508001F40002070BD10B50446D4F8000401F0ACFBBF
-S31508001F502068D0F8001E41F00101C0F8001E206A72
-S31508001F6020B10448016841F006010160BDE810404F
-S31508001F7002F023BB10ED00E001480068704700003E
-S31508001F800000002010B5401EB0F1807F01D301206B
-S31508001F9010BD4FF0E02460610F21601702F03FFF8B
-S31508001FA00020A06107202061002010BD10B5FFF7B2
-S31508001FB0FDF9BDE8104000F027BEF0B500230A255C
-S31508001FC030263727002412E0B5EB107F04D906EB3C
-S31508001FD0107C01F813C003E007EB107C01F813C06E
-S31508001FE0000101EB430C8CF801405B1CDBB2934209
-S31508001FF0EAD3F0BD02490A6882430A6070470000C6
-S315080020003038024008B504490A6802430A6009687C
-S315080020100140009108BD00003038024002490A68B4
-S3150800202002430A60704700001038024002490A68F5
-S3150800203082430A60704700001038024008B5044918
-S315080020400A6802430A6009680140009108BD000059
-S315080020504038024070B500243949884206D101202B
-S31508002060FFF7DCFF0120FFF7E1FF67E0354988420B
-S3150800207006D10220FFF7D2FF0220FFF7D7FF5DE067
-S315080020803149884206D10420FFF7C8FF0420FFF72C
-S31508002090CDFF53E02D49884206D10820FFF7BEFF41
-S315080020A00820FFF7C3FF49E02949884206D11020D6
-S315080020B0FFF7B4FF1020FFF7B9FF3FE02549884234
-S315080020C006D12020FFF7AAFF2020FFF7AFFF35E053
-S315080020D02149884206D14020FFF7A0FF4020FFF79C
-S315080020E0A5FF2BE01D49884206D18020FFF796FF01
-S315080020F08020FFF79BFF21E01949884207D1851503
-S315080021002846FFF78BFF2846FFF790FF16E015498C
-S31508002110884207D145152846FFF780FF2846FFF76E
-S3150800212085FF0BE01049884207D105152846FFF7B9
-S3150800213075FF2846FFF77AFF00E00124204670BDA8
-S31508002140000002400004024000080240000C024061
-S31508002150001002400014024000180240001C024011
-S315080021600020024000240240002802402DE9F041E8
-S315080021700A6892FAA2F2B2FA82F30F2603258FE0D2
-S3150800218001249C402240002A7ED04C68012C01D0B4
-S31508002190022C20D18C68876892FAA2FCBCFA8CFCC7
-S315080021A04FEA4C0C05FA0CFC27EA0C0792FAA2FC3B
-S315080021B0BCFA8CFC4FEA4C0C04FA0CF427438760F3
-S315080021C0CF680C68D0F804C02CEA040C7C434CEAAF
-S315080021D0040CC0F804C00C69C76892FAA2FCBCFAE1
-S315080021E08CFC4FEA4C0C05FA0CFC27EA0C0792FA11
-S315080021F0A2FCBCFA8CFC4FEA4C0C04FA0CF42743FC
-S31508002200C7604C68022C34D192FAA2F4B4FA84F46A
-S31508002210082C16D24C69076A92FAA2FCBCFA8CFC06
-S315080022204FEA8C0C06FA0CFC27EA0C0792FAA2FC79
-S31508002230BCFA8CFC4FEA8C0C04FA0CF427430762B0
-S3150800224017E04F69D0F824C0140A94FAA4F894FA4F
-S31508002250A4F4B8FA88F8B4FA84F44FEA880806FAB7
-S3150800226008F8A4002CEA080CA7404CEA070CC0F8AA
-S3150800227024C04C68076892FAA2FCBCFA8CFC4FEAA8
-S315080022804C0805FA08FC00E009E092FAA2F227EAEF
-S315080022900C07B2FA82F252009440274307605B1C8F
-S315080022A00A6832FA03F47FF46BAF0020BDE8F081C8
-S315080022B038B5244C206840F00100206000F09EF9F3
-S315080022C00128FBD11F4900200831086020680090CA
-S315080022D01D4900980840009000982060206820F06A
-S315080022E0F80040F08000206000F0B8F90028FBD123
-S315080022F000F094F90028FBD100F098F90028FBD1EA
-S3150800230010491248091D086010480E4910388431D2
-S315080023100860091D08600B480C30016821F4FE416D
-S315080023200160016841F47F01016006487430016864
-S3150800233021F001010160016841F08071016000200F
-S3150800234038BD000000380240FFFFF2EA10300024D2
-S3150800235010B5044600F06CFB206000F03FFB60609F
-S3150800236000F04AFBA060606800F054FBE06010BD16
-S3150800237070B50024494EC0284FF4004509D0B0F581
-S31508002380407F27D0B0F5405F45D0B0F5404F63D0C9
-S3150800239081E000F08BF8A0F5400040380BD04028CB
-S315080023A00DD0802811D000F043FB00F017FB00F099
-S315080023B023FB04466FE000F03BFB04466BE000F0AD
-S315080023C01DF9002867D0344665E000F01FF908B308
-S315080023D02C4660E000F06AF8314940180DD0B0F597
-S315080023E0807F0ED0B0F5007F10D000F021FB00F002
-S315080023F0F5FA00F001FB04464DE000F019FB04462F
-S3150800240049E000F0FBF828B1344644E000F0FEF855
-S3150800241000B12C463FE000F049F8224940180DD09B
-S31508002420B0F5805F0ED0B0F5005F10D000F000FB6D
-S3150800243000F0D4FA00F0E0FA04462CE000F0F8FACE
-S31508002440044628E000F0DAF828B3344623E000F022
-S31508002450DDF800B32C461EE000F028F812494018B3
-S3150800246009D0B0F5804F0AD0A8420DD100F0CEF8B9
-S3150800247088B12C460FE000F0DBFA04460BE000F0CA
-S31508002480BDF840B1344606E000F0D2FA00F0A6FAEC
-S3150800249000F0B2FA0446204670BD00000024F4009D
-S315080024A000FFFFFC00F0FFCF00C0FF3F02490968AC
-S315080024B0014041EA004070479038024070B5002458
-S315080024C0484D03284FF4004607D00C2825D0B0F510
-S315080024D0406F42D0302861D071E000F087F86FF481
-S315080024E0403140180BD001280DD0022810D000F03A
-S315080024F09FFA00F073FA00F08DFA04465FE000F0E8
-S3150800250097FA04465BE000F079F800B32C4656E0EB
-S3150800251000F07CF8D8B1344651E000F067F8A0F531
-S315080025204020001F0BD004280DD0082810D000F03A
-S315080025307FFA00F053FA00F05FFA04463FE000F035
-S3150800254077FA04463BE000F059F800B12C4636E02D
-S3150800255000F05CF808B3344631E000F047F8224949
-S3150800256040180DD0B0F5806F0ED0B0F5006F10D0C2
-S3150800257000F05EFA00F032FA00F04CFA04461EE06B
-S3150800258000F056FA04461AE000F038F828B12C464E
-S3150800259015E000F03BF800B1344610E000F026F8EC
-S315080025A0A0F5401010380CD010280ED0202812D0D4
-S315080025B000F03EFA00F012FA00F01EFA0446204631
-S315080025C070BD00F035FA0446F9E700F017F8002860
-S315080025D0F5D02C46F3E700F019F80028EFD034467A
-S315080025E0EDE700000024F40000FCFFF30249096847
-S315080025F0014041EA004070479038024002480068AE
-S31508002600C0F34000704700000038024002480068E6
-S31508002610C0F3400070470000703802400248006866
-S31508002620C0F3C060704700000038024002480068E6
-S31508002630C0F3407070470000003802400248006846
-S3150800264000F03F0070470000043802400248006866
-S3150800265000F4800070470000043802400248006811
-S31508002660C0F3406070470000003802400149086026
-S31508002670704700000000002070B504460D4601268C
-S3150800268000202168C1F30001002960D1EA68696861
-S31508002690AB6911432A691A4311432268344B1A401D
-S315080026A011432160A968626822F440520A436260B5
-S315080026B06969A26822F440720A43A2602D498C42D5
-S315080026C003D10320FFF7FAFE33E02B498C4203D1EE
-S315080026D00C20FFF7F3FE2CE028498C4203D130206A
-S315080026E0FFF7ECFE25E026498C4203D1C020FFF710
-S315080026F03FFE1EE023498C4204D14FF44070FFF799
-S3150800270037FE16E020498C4204D14FF44060FFF7AB
-S31508002710D5FE0EE01D498C4204D14FF44050FFF718
-S3150800272027FE06E01A498C4203D14FF44040FFF7D2
-S315080027301FFE60B1296851B10026AA69B2F5004F9B
-S3150800274007D000EB5100B0FBF1F080B2E0603046F4
-S3150800275070BD400000EB5100B0FBF1F080B24FF6BF
-S31508002760F0710140C0F342000143E160EFE7000069
-S31508002770F369FFEF001001400044004000480040A4
-S31508002780004C004000500040001401400078004012
-S31508002790007C004002494FF4000088617047000041
-S315080027A000040240014948807047000014000020D8
-S315080027B010B500F0AFFA0B4C616888420CD320784C
-S315080027C0094950B1002020704FF40000886100F0DC
-S315080027D0A1FA61880844606010BD0120207080203D
-S315080027E08861F4E7140000200004024010B5FEF7E3
-S315080027F05BFA18B1BDE81040FEF710B9002010BD0D
-S31508002800FEF728B9FEF796B9FEF798B9FEF7D4B9D8
-S31508002810FEF7ECB970B504462068056C00EB41106C
-S31508002820D0F8081B0C4EB54205D9090403D54FF458
-S315080028300041C0F8081B2046FFF74AFBB54208D9F5
-S315080028402069012805D12068012104F5717201F07B
-S31508002850E3FB002070BD00000A30544F2DE9F0411B
-S3150800286004460D462668316C06EB4510D0F8083B41
-S315080028704FF40047D4F8108004F571724FF0200C1D
-S31508002880B8F1010F08D0DFF8B080414545D11904E9
-S315080028903AD5C0F8087B4CE0284E5FEA037806D59F
-S315080028A0B14246D9190444D5C0F8087B41E05FEA2D
-S315080028B0836802D5C0F808CB3BE013F0280F38D15F
-S315080028C0B14204D9190402D5C0F8087B31E0C5EB3A
-S315080028D0C501D0F8100B04EB810101F501710B68F5
-S315080028E0C0F31200181A086148681844486035B9D8
-S315080028F0D4F8100218B92068012101F08DFB204692
-S31508002900E9B2FEF7BFFE14E0990601D5C0F808CB78
-S315080029102046E9B2FEF7B6FE0BE035B9D4F8100248
-S3150800292018B90021304601F077FB2046E9B2FEF7D8
-S31508002930A9FE0020BDE8F0810A31544F0A30544FF1
-S315080029402DE9F84F80460E46D8F80070C6EBC6004B
-S3150800295008EB80043C34D4E90510884202D90120EA
-S31508002960BDE8F88F081AA168814200D20846C01C43
-S315080029704FEA900A07EB461916E0151AA268AA420A
-S3150800298000D21546E81C4FEA900A98F81000009005
-S31508002990ABB2E1683846F2B201F0FBFDE0682844C4
-S315080029A0E060A0692844A061D9F8180980B25045AA
-S315080029B005D3D4E90520904201D2002ADDD1D4E915
-S315080029C00501884208D8012006F00F018840D7F88B
-S315080029D034188143C7F834180020C1E70449096848
-S315080029E001F0F001034A0909515CC840704700002C
-S315080029F008380240564E00080449096801F4E051B7
-S31508002A00034A02EB91210978C8407047083802400A
-S31508002A10664E00080449096801F46041034A02EB5E
-S31508002A2051310978C840704708380240664E000898
-S31508002A300748006800F00C010648002906D004295A
-S31508002A4003D0082902D100F009B8034870470000EE
-S31508002A50083802400024F40000127A0010B5FFF787
-S31508002A60F5FD0C4C18B1B0F5800F00D16410FFF7D6
-S31508002A70E5FDB4FBF0F108480268C2F38812514339
-S31508002A80006800F44030012202EB10404000B1FB20
-S31508002A90F0F010BD0024F4000438024010B588B0E8
-S31508002AA00C4C206820F0010020604FF46140019032
-S31508002AB000210291039104910C200590069107913B
-S31508002AC001A92046FFF7D8FD206840F001002060E4
-S31508002AD008B010BD004800400549CA69C2F3401253
-S31508002AE0002A03D0496A0170012070470020704708
-S31508002AF0004800402DE9F04180460F461B4C002552
-S31508002B001B4E6078002810D020783044401CFFF710
-S31508002B10E3FF012819D000F0FDF8616864318842A6
-S31508002B2000D965700020BDE8F0811148FFF7D4FF91
-S31508002B300128F7D13078401E3F28F3D800F0EAF88C
-S31508002B406060257001206070ECE72078401CC2B2F6
-S31508002B502270307831469042E4D1491C4046FDF750
-S31508002B60F0FD6570207838700120DCE7F000002061
-S31508002B701810002070B5094DA86200F0CBF800F1D6
-S31508002B800A0405E0FDF7D3FD00F0C4F8A04204D816
-S31508002B90E869C0F3C0100028F4D070BD00480040B2
-S31508002BA070B505460E46402E03D9832108A0FDF7C9
-S31508002BB0EAFB3046FFF7DEFF002406E0FDF7B7FD27
-S31508002BC0285DFFF7D7FF641CA4B2B442F6D370BDE4
-S31508002BD02E2E5C2E2E5C2E2E5C2E2E5C536F75725E
-S31508002BE063655C41524D434D375F53544D3332460E
-S31508002BF0375C72733233322E6300000001784078F6
-S31508002C0041EA00207047704710B53048016821F046
-S31508002C100F0141F007010160006800F00F00072866
-S31508002C2003D069212AA0FDF7AEFB2C48016841F4C0
-S31508002C3040410160016841F480310160284801681B
-S31508002C4041F480210160016841F480310160016826
-S31508002C50C1F340410029FAD02149224A091D0B68CF
-S31508002C60214C23401A430A60204A0B68204C234013
-S31508002C701A430A60016841F0807101600168C1F376
-S31508002C8040610029FAD016480830016821F0F001A1
-S31508002C900160016821F4E05141F4A0510160016826
-S31508002CA021F4604141F400410160016821F003010B
-S31508002CB041F002010160016801F00C010829FAD10E
-S31508002CC0BDE810400B48FFF7D1BC0000003C0240AD
-S31508002CD02E2E5C6D61696E2E630000000070004048
-S31508002CE000380240086C40000080BCFF086C4009B0
-S31508002CF00080BFF000E6DF0C0548016841F470016A
-S31508002D00016003494FF00060803908607047000091
-S31508002D1088ED00E000B500F01FF80148006800BD26
-S31508002D20E400002000B500F00FF84FF0E020044959
-S31508002D30416100218161052202610248016000BDEE
-S31508002D40BF4B0300E40000204FF0E02000210161A2
-S31508002D5041618161704700004FF0E0200069C003BF
-S31508002D6003D502480168491C01607047E400002049
-S31508002D7010B501F01DFE002010BD084610B501F083
-S31508002D8097FD002010BD70B5054600242846812110
-S31508002D9000F0D2FA0121284600F0CEFA204670BD8E
-S31508002DA00A21018000487047200000202021018068
-S31508002DB0004870472C000020004870471401002086
-S31508002DC070B505460024284640230222812100F0DA
-S31508002DD0BFFB402328460222012100F0B9FB044A22
-S31508002DE040230121284600F0BFFB204670BD0000A5
-S31508002DF01401002010B590F89C02032801D101F0B7
-S31508002E00D7FD002010BD000070B51722174C0B78AF
-S31508002E1013F0600F22D14B78062B04D00A2B11D061
-S31508002E200B2B1BD114E04B882125B5EB132F05D1AD
-S31508002E300E4C0934CA88172A00D91722214600F0F1
-S31508002E405AF80BE009490122193900F054F805E04F
-S31508002E504A8812F0FF0F03D000F036F8002070BD44
-S31508002E600249D0B219390860F8E700003500002099
-S31508002E7010B5D0F8B822002A01D052689047002031
-S31508002E8010BD90F89C22012A05D0022A03D0032AF5
-S31508002E9001D000F019B84988012904D10021C0F8E9
-S31508002EA0A41200F035B8704710B513460A4600213B
-S31508002EB000F05AFB002010BD10B513460A46002143
-S31508002EC000F0FAFB002010BD10B50446802120460C
-S31508002ED000F0CFFB2046BDE81040002100F0C9BB3A
-S31508002EE010B50521C0F8941200231A46194600F0B9
-S31508002EF03BFB002010BD10B50223C0F89432826156
-S31508002F00C26113460A46002100F0D6FB002010BD18
-S31508002F1010B50421C0F8941200231A46194600F089
-S31508002F20CBFB002010BD10B50446012084F89C0296
-S31508002F30D4F8B802002803D0426820462179904781
-S31508002F40D4F8CC0210B10020C4F8CC02204600F018
-S31508002F50A2FB002804D12046BDE8104000F08CBA38
-S31508002F6010BD000010B5002806D007A00A4605497E
-S31508002F7000F08DF9034810BD03A00A46014900F088
-S31508002F8086F9F7E75805002044656661756C740094
-S31508002F901220088000487047A400002010B50028B9
-S31508002FA006D007A00A46054900F071F9034810BD86
-S31508002FB003A00A46014900F06AF9F7E75805002018
-S31508002FC057696E5553422042756C6B20496E74657D
-S31508002FD07266616365000000042008800048704737
-S31508002FE0A000002010B504A00A46024900F04FF9D7
-S31508002FF0004810BD580500204F70656E424C54209D
-S31508003000557365720000000010B5002806D007A0A9
-S315080030100A46054900F03BF9034810BD03A00A46D5
-S31508003020014900F034F9F7E75805002057696E554D
-S3150800303053422042756C6B204465766963650000CF
-S3150800304010B51A200880FDF753FE014810BD000090
-S31508003050B80000200A46D188012902D01146FFF798
-S3150800306033BF90F89C12012906D0022904D00329FF
-S3150800307009D01146FFF728BF00218160012200F11F
-S315080030800801FFF738BF0122011DFFF734BF2DE9FC
-S31508003090F84304460F46002000900026002578884D
-S315080030A0010A082970D2DFE801F0AB040C22ABABA9
-S315080030B08B9AD4F8B412207C0A686946904706466B
-S315080030C0A3E0207C4FF0020840B1D4F8B802C16AE8
-S315080030D068468847064686F8018096E0D4F8B8021E
-S315080030E0816A68468847064686F801808DE0C0B240
-S315080030F006285FD2DFE800F0031221303F4FD4F8EC
-S31508003100B402426822B1207C6946904706467CE0B4
-S3150800311039462046FFF7D8FE012576E0D4F8B402F2
-S31508003120826822B1207C6946904706466DE039469A
-S315080031302046FFF7C9FE012567E0D4F8B402C26845
-S3150800314022B1207C6946904706465EE0394620460D
-S31508003150FFF7BAFE012558E0D4F8B402026922B195
-S31508003160207C6946904706464FE039462046FFF7D9
-S31508003170ABFE012549E0D4F8B40242692AB1207CA5
-S3150800318069469047064640E03AE039462046FFF74A
-S315080031909BFE012539E0D4F8B402826922B1207C6D
-S315080031A069469047064630E039462046FFF78CFECA
-S315080031B001252AE039462046FFF786FE012524E048
-S315080031C0207C28B139462046FFF77EFE01251CE003
-S315080031D0D4F8B802416B68468847064615E0207C55
-S315080031E028B139462046FFF76FFE01250DE0D4F8D1
-S315080031F0B802016B6846884706460721717004E0E5
-S3150800320039462046FFF760FE0125002D0CD1FA88C5
-S315080032108AB1BDF8000048B1824200D90246009240
-S3150800322031462046FFF767FEBDE8F8833946204653
-S31508003230FFF74AFEF8E72046FFF76AFEF4E70021A3
-S3150800324002E0491CC9B2401C0278002AF9D1084696
-S3150800325070470A4690F89C12012906D0022904D024
-S31508003260032902D01146FFF72FBED188022902D0C2
-S315080032701146FFF729BE0121C160D0F8A41209B191
-S315080032800321C160022200F10C01FFF734BE70B5BC
-S315080032900D461646002818D004462046FFF7CFFFED
-S315080032A0022101EB400030803078287003206870D6
-S315080032B00220002206E02954641C401CC0B22A548D
-S315080032C0401CC0B221780029F5D170BD0146002006
-S315080032D0002906D0012905D0022905D0032905D0E1
-S315080032E0032070470320704701207047032070476A
-S315080032F030B4002814D0D0F8B84200230CB1C0F876
-S31508003300B832D0F8CC420CB1C0F8CC3209B1C0F80A
-S31508003310B412012180F89C12027030BC00F0C8B8C3
-S3150800332030BC0320704710B5D0F8C402FEF71AFA6D
-S31508003330BDE81040FFF7CABF10B5D0F8C402FEF7C3
-S31508003340EDF9BDE81040FFF7C1BF70B50446134656
-S31508003350002909D0D4F8B80242691AB194F89C0237
-S3150800336003284BD0032070BD04F11400D4F894123E
-S315080033700025022938D1D0E902218A420CD9521AED
-S31508003380826019462046FFF797FD002320461A4615
-S31508003390194600F0E9F827E0914214D140688842BE
-S315080033A011D3D4F8981288420DD20022204611462D
-S315080033B0FFF782FDC4F8985200231A46194620469C
-S315080033C000F0D2F810E0D4F8B802C16829B194F830
-S315080033D09C02032801D1204688478021204600F018
-S315080033E048F92046FFF77CFD94F8A002012809D188
-S315080033F0204600F094F984F8A05203E0204690474E
-S315080034000028B0D1002070BD10B504461346002927
-S3150800341009D0D4F8B80282691AB194F89C02032834
-S3150800342024D0032010BD04F5AA70D4F894120329F9
-S3150800343020D1D0E9021291420AD98A1A8260C0685C
-S31508003440824200D3024619462046FFF72DFD11E0B9
-S31508003450D4F8B802016929B194F89C02032801D16D
-S31508003460204688472046FFF753FD03E0204690474D
-S315080034700028D7D1002010BD10B5D0F8C402FEF739
-S315080034800BF9BDE81040FFF721BF0020704710B5C3
-S31508003490012180F89C12D0F8B822002A02D052687E
-S315080034A001799047002010BDD0F8C402FEF786B90E
-S315080034B010B5017800292BD11649C1F80004C0F8C7
-S315080034C0C4124FF0A0400860062048600222CA6075
-S315080034D0002008618A610122CA6108624862C862DE
-S315080034E008630846FEF736FC20B10BA040F225110A
-S315080034F0FCF749FF07488021FEF78BF8054840226C
-S315080035000021FEF78AF8034880220121FEF785F894
-S31508003510002010BD540100202E2E5C757362645F76
-S31508003520636F6E662E6300000A06D0F8C40201F0C7
-S315080035307F01C1EBC10100EB810002D590F83E0086
-S31508003540704790F8FE0170470020704700207047CA
-S3150800355010B514461A46D0F8C4022346FEF737F9C2
-S31508003560BDE81040FFF7B2BE10B5D0F8C402FEF7AA
-S315080035705CF9BDE81040FFF7A9BE70B50446012501
-S3150800358084F89C520020C4F894026060C4F8A4022F
-S31508003590D4F8BC02002805D0D4F8B8020021426845
-S315080035A0204690470022204640231146FFF7D0FFC9
-S315080035B0A4F864514026C4F86061402300222046DE
-S315080035C08021FFF7C5FFA5842662002070BD90F80C
-S315080035D09C12042903D190F89D1280F89C120020B1
-S315080035E0704710B590F89C12032904D1D0F8B81288
-S315080035F0C96901B18847002010BD017400207047D1
-S3150800360010B5D0F8C402FEF74FFCBDE81040FFF72E
-S315080036105DBE70B5044604F2AA20054600F055F8CA
-S315080036200120C4F89402B4F8B002C4F8980294F8D9
-S31508003630AA2212F01F000AD001280ED0022812D0A2
-S315080036402046BDE8704002F0800100F012B8294615
-S315080036502046BDE8704000F011B929462046BDE86D
-S31508003660704000F02FBA29462046BDE8704000F0A9
-S315080036703CB910B5D0F8C402FEF7F8F8BDE810401A
-S31508003680FFF724BE10B5D0F8C402FEF728FCBDE843
-S315080036901040FFF71BBE10B5D0F8C402FEF734FC85
-S315080036A0BDE81040FFF712BE00F52770017841709B
-S315080036B0042101700020704710B5D0F8C402FEF747
-S315080036C00DF9BDE81040FFF701BE70B5044608467F
-S315080036D0017821704178801C617005462846FFF7FD
-S315080036E08DFA60802846851C2846FFF787FAA08051
-S315080036F02846801CFFF782FAE08070BD38B504467C
-S3150800370000200090002908D0C4F8B8126846C96A93
-S315080037108847C4F8CC02002038BD032038BD0020F5
-S31508003720704770B504468888002821D1C888F8B93A
-S31508003730488880281CD200F07F0594F89C0203284C
-S315080037400DD084F89E5229462046FFF759FF204699
-S31508003750FFF7DEFB45B1022084F89C0270BD2046C7
-S31508003760BDE87040FFF7B0BB012084F89C0270BD2D
-S315080037702046BDE87040FFF7A7BB03460320D3F8F1
-S31508003780B822002A02D0126818461047704700006F
-S315080037902DE9F04104460E460025324FB1783970BE
-S315080037A0012906D931462046FFF78EFB0320BDE8DE
-S315080037B0F08194F89C0202280CD0032822D03146C6
-S315080037C02046FFF781FB39782046FFF751FB032592
-S315080037D02846ECE791B161602046FFF7CEFF054623
-S315080037E0280004D031462046FFF76EFBF0E7204656
-S315080037F0FFF78EFB032084F89C02E9E72046FFF7D3
-S3150800380087FBE5E74FF00208C9B16068884224D013
-S31508003810C1B22046FFF72CFB397861602046FFF7D6
-S31508003820ACFF0546280014D031462046FFF74CFB6E
-S3150800383021792046FFF71CFB84F89C82C8E784F8A8
-S315080038409C8261602046FFF713FB2046FFF760FB6A
-S31508003850BEE72046FFF75CFBBAE72046FFF758FBB2
-S31508003860B6E70000040000204988012903D1C0F802
-S31508003870A412FFF74DBB7047FFF704BF10B500242D
-S315080038800A7812F060020DD0202A05D0402A03D00B
-S31508003890FFF71AFB204610BDD0F8B8229268904769
-S315080038A00446F7E74A780A2A1CD2DFE802F012181B
-S315080038B01B151B08051B0F0BFFF7E9FBEAE7FFF7CC
-S315080038C030FFE7E7FFF764FF0446E3E7FFF7C2FBCD
-S315080038D0E0E7FFF7BEFCDDE7FFF7C6FFDAE7FFF72D
-S315080038E0D0FAD7E7FFF7F0FAD4E72DE9F041044616
-S315080038F00D4600262979287810F0600012D0202875
-S3150800390008D0402806D029462046FFF7DDFA30467B
-S31508003910BDE8F081D4F8B802294682682046904767
-S315080039200646F4E7687800285ED001282FD00328D9
-S3150800393004D029462046FFF7C7FAE8E794F89C0220
-S31508003940022806D0032814D029462046FFF7BCFAD9
-S31508003950DDE749B1802907D02046FFF78AFE802196
-S315080039602046FFF786FED2E729462046FFF7ACFA3F
-S31508003970CDE7688838B931B1802904D0E88810B90C
-S315080039802046FFF776FE2046FFF7C2FABFE794F80F
-S315080039909C02022806D0032814D029462046FFF7A1
-S315080039A093FAB4E749B1802907D02046FFF761FEAC
-S315080039B080212046FFF75DFEA9E729462046FFF746
-S315080039C083FAA4E768880028A1D1480602D02046D1
-S315080039D0FFF7A9FC2046FFF79BFAD4F8B802294658
-S315080039E082682046904792E794F89C0200270228AE
-S315080039F006D0032824D029462046FFF765FA86E72D
-S31508003A0031B1802904D029462046FFF75DFA7EE7C2
-S31508003A10080607D501F07F0000EB800004EB800163
-S31508003A20143107E001F07F0000EB800004EB800111
-S31508003A3001F5AA710F6002222046FFF75CFA66E7D5
-S31508003A4008060CD501F00F0000EB800004EB80009F
-S31508003A50808C68B929462046FFF736FA57E701F001
-S31508003A600F0000EB800004EB8000B0F8640148B159
-S31508003A7008060CD501F07F0000EB800004EB8005FA
-S31508003A8014350CE029462046FFF71EFA3FE701F0F9
-S31508003A907F0000EB800004EB800505F5AA7541B1AF
-S31508003AA0802906D02046FFF73FFD20B10120286077
-S31508003AB002E02F6000E02F60022229462046FFF729
-S31508003AC01AFA24E770B506460C460025207810F049
-S31508003AD0600209D0202A07D0402A05D02146304660
-S31508003AE0FFF7F2F9284670BD96F89C22012A08D0FD
-S31508003AF0022A06D0032A04D021463046FFF7E4F905
-S31508003B00F0E7207901280FD8D6F8B802214682684E
-S31508003B10304690470546E0880028E3D1002DE1D1DC
-S31508003B203046FFF7F5F9DDE721463046FFF7CCF9D1
-S31508003B30D8E7000070B50A7801234E7802F00F0422
-S31508003B401C4DA340012E19D0D0F81C4844EA034363
-S31508003B50C0F81C3800EB4210D0F8002B12040BD426
-S31508003B60D0F8002B0B89C978C3F30A031A4345EA30
-S31508003B7081410A43C0F8002B002070BDD0F81C48CC
-S31508003B809BB21C43C0F81C4800EB4210D0F8003921
-S31508003B901B04F1D4D0F800390C89C978C4F30A0497
-S31508003BA08904234341EA82510B432B43C0F8003969
-S31508003BB0E2E7000000800010D0F800196FF30A0150
-S31508003BC0C0F80019D0F8041841F48071C0F8041838
-S31508003BD0002070470FB410B504460898012818D07D
-S31508003BE0E06840F04000E060204600F02BF8A16B4A
-S31508003BF041F48031A1630699012907D1A16841F0F2
-S31508003C000601A160A16841F02001A16010BC5DF821
-S31508003C1014FBA06B20F48030A063E06808490840D4
-S31508003C20E060E06820F44010E0600F98012803D1B6
-S31508003C30E06840F48010E060204600F003F8DAE718
-S31508003C40BFFFBDFF00210C4A491C914201D9032040
-S31508003C5070470369002BF7DA0021036943F0010373
-S31508003C600361491C914201D9032070470369DB07A8
-S31508003C70F7D1002070470000400D030070B50A78A0
-S31508003C8001254B78012B00EB42122BD0D2F8003BD2
-S31508003C90002B0BDAD2F8003B43F00063C2F8003B76
-S31508003CA0D2F8003B43F08043C2F8003B00F61C0004
-S31508003CB0046A0B7803F00F0605FA06F324EA0344B0
-S31508003CC004620468097801F00F0105FA01F324EA91
-S31508003CD003410160D2F8000B18490840C2F8000BEE
-S31508003CE0002070BDD2F80039002B0BDAD2F8003963
-S31508003CF043F00063C2F80039D2F8003943F0804334
-S31508003D00C2F8003900F61C00046A0B7803F00F06A7
-S31508003D1005FA06F39EB2B44304620468097801F012
-S31508003D200F0105FA01F399B28C430460D2F8000931
-S31508003D3003490840C2F80009D2E700000078F3EF0B
-S31508003D40007833EC10B5D0F8041821F00201C0F859
-S31508003D5004180320FDF76CFA002010BD10B5D0F842
-S31508003D60041841F00201C0F804180320FDF760FAB0
-S31508003D70002010BD0FB4F0B504460026002000252B
-S31508003D8004EB8001C1F80451401C0F28F8D31098A1
-S31508003D9060B3A06B40F40011A163C4F8005ED4F8C8
-S31508003DA00018C4F800180B98012832D00B9803287D
-S31508003DB03BD00321204600F049FB1021204600F0A5
-S31508003DC0BDFA00B10126204600F0A8FA00B1012686
-S31508003DD0C4F81058C4F81458C4F81C5800204FF0FA
-S31508003DE000624FF67F374FF090433FE0D4F804085F
-S31508003DF040F00201C4F80418A06B20F40011A16376
-S31508003E00206840F040012160206840F08001216070
-S31508003E10C3E7089820B10121204600F017FBCCE73C
-S31508003E200021204600F012FBC7E7089820B10121BF
-S31508003E30204600F00BFBC0E70021204600F006FBF9
-S31508003E40BBE704EB4011D1F800C9BCF1000F06DA54
-S31508003E5010B1C1F8003904E0C4F8002901E0C1F83E
-S31508003E600059C1F81059C1F80879401C06998142D1
-S31508003E70E7D8002014E004EB4011D1F800CBBCF1E0
-S31508003E80000F06DA10B1C1F8003B04E0C4F8002BB5
-S31508003E9001E0C1F8005BC1F8105BC1F8087B401C63
-S31508003EA006998142E7D8D4F8100820F48071C4F83E
-S31508003EB01018A5616FF080406061099818B9A0696B
-S31508003EC040F01000A061A06909490843A0610C9858
-S31508003ED018B1A06940F00800A0611098012803D124
-S31508003EE0A06904490843A0613046F0BC5DF814FB9C
-S31508003EF000383C8004000040816821F0010181609F
-S31508003F000020704770B50C780B784E78414D012E1D
-S31508003F1000EB43131FD0D3F8100B6FF31200C3F84E
-S31508003F20100BD3F8100B2840C3F8100B486908B1DA
-S31508003F3088684861D3F8100B40F40020C3F8100BCA
-S31508003F40D3F8100B8C68C4F312042043C3F8100B83
-S31508003F50012A53D056E04E6996B3D3F810696FF329
-S31508003F601206C3F81069D3F810692E40C3F8106911
-S31508003F704E698D68AE4200D94D6103F511631D681F
-S31508003F8045F400251D601D684E69C6F312063543C3
-S31508003F901D60012A23D000EB4412D2F8003943F001
-S31508003FA00443C2F800394A693AB3D0F83428097884
-S31508003FB001F00F03012199400A43C0F8342827E08D
-S31508003FC0FFE703F511631E682E401E601D6845F461
-S31508003FD000251D601D686FF312051D60D9E7096984
-S31508003FE019B100EB4412C2F8141900EB4410D0F8CA
-S31508003FF0001941F00441C0F8001909E0C86808B181
-S31508004000C3F8140BD3F8000B40F00440C3F8000BB8
-S31508004010002070BDFFFF07E010B5036C124CA342E9
-S3150800402005D9D0F8003B002B01DA002010BD00F5B9
-S31508004030316000230360036843F4002303600368C8
-S3150800404043F018030360036843F0C0430360A0F518
-S315080040503160012906D100F530604261016841F0FE
-S3150800406080210160002010BD0A30544F0B784A7831
-S31508004070012A00EB43100BD0D0F8002B22F40012D3
-S31508004080C0F8002BC978032914D0022912D017E0EA
-S31508004090D0F8002922F40012C0F80029C9780329AB
-S315080040A001D002290CD1D0F8001941F08051C0F88E
-S315080040B0001905E0D0F8001B41F08051C0F8001B3C
-S315080040C0002070470A784B780978012B00EB4110DD
-S315080040D012D0D0F8001B002906DB2AB1D0F8001B45
-S315080040E021F08041C0F8001BD0F8001B41F40011F4
-S315080040F0C0F8001B00207047D0F80019002906DB1D
-S315080041002AB1D0F8001921F08041C0F80019D0F87A
-S31508004110001941F40011C0F80019EBE7F8B50C785E
-S315080041206FF060460B784F78784D012F00EB4313FC
-S3150800413026D0D3F8104B6FF31204C3F8104BD3F8FC
-S31508004140104B2C40C3F8104B4C69002C7ED08D6860
-S315080041502C44641EB4FBF5F4A4B2D3F8105B06EA4B
-S31508004160C4463543C3F8105BD3F8105B8E686643C4
-S31508004170C6F312042543C3F8105B012A67D0A9E0E9
-S315080041804F69FFB103F511631F686FF312071F60CC
-S315080041901F682F401F604F698D682F447F1EB7FB2D
-S315080041A0F5F506EAC5451E6835431D601D684E6966
-S315080041B0C6F3120635431D60A3F51163CD78012DAC
-S315080041C00ED017E003F511631E682E401E601D68A9
-S315080041D045F400251D601D686FF312051D6009E092
-S315080041E003F511631D6825F0C0451D601D6845F07F
-S315080041F000551D60012A17D000EB4413D3F8004977
-S3150800420044F00444C3F80049CC78012C36D04A69F6
-S315080042109AB3D0F83428097801F00F0301219940A0
-S315080042200A43C0F834286FE00A691AB100EB441350
-S31508004230C3F81429C978012917D1D0F80818C9056F
-S315080042400BD400EB4411D1F8002901E02FE03DE042
-S3150800425042F00052C1F8002907E000EB4411D1F8FA
-S31508004260002942F08052C1F8002900EB4410D0F82A
-S31508004270001941F00441C0F8001945E0D0F8084893
-S31508004280E40506D4D3F8004944F00054C3F80049BD
-S3150800429005E0D3F8004944F08054C3F80049009279
-S315080042A08A8A93B20A78C96800F073F92CE0D3F8C1
-S315080042B0104B8D68C5F312052C43C3F8104BD3F881
-S315080042C0104B44F40024C3F8104B56E7CA680AB1E9
-S315080042D0C3F8142BC978012910D1D0F80808C005ED
-S315080042E006D4D3F8000B40F00050C3F8000B05E0E5
-S315080042F0D3F8000B40F08050C3F8000BD3F8000B3E
-S3150800430040F00440C3F8000B0020F8BDFFFF07E0AB
-S31508004310816841F001018160002070470021102268
-S315080043200261054A491C914201D903207047036975
-S31508004330DB06F7D400207047400D03000022202337
-S3150800434043EA811101610549521C8A4201D90320B9
-S31508004350704703699B06F7D400207047400D030099
-S31508004360D0F8080800F00600002805D0022805D075
-S31508004370062803D00F207047002070470220704798
-S31508004380406900F001007047D0F81818D0F81C08EA
-S31508004390084080B27047D0F81818D0F81C080840B2
-S315080043A0000C704710B5D0F81038D0F8342801F052
-S315080043B00F04E24002F0010243EAC21200EB411088
-S315080043C0D0F80809104010BD00EB4111D1F8081BC0
-S315080043D0D0F814080840704741698069084070475A
-S315080043E00346084610B5D21C9208002103F58053EF
-S315080043F002E01C6810C0491C9142FAD310BD10B5E2
-S31508004400C26822F0C042C260012902D031B101203F
-S3150800441010BDC16841F00051C16003E0C16841F0B8
-S315080044208041C1603220FCF703FF002010BD00F573
-S315080044300060026822F4FE62026002684FF4FE63BE
-S3150800444003EA01110A43026000207047D0F80028E9
-S315080044500A43C0F80028002070470000022A0ED040
-S3150800446082B30921C26822F47052C260C2684FF44E
-S31508004470705303EA81210A43C26000207047224A2A
-S31508004480224B0A449A4201D20F21EBE7204A214BDC
-S315080044900A449A4201D20E21E4E71F4A1F4B0A44F6
-S315080044A09A4201D20D21DDE71D4A1E4B0A449A4263
-S315080044B001D20C21D6E71C4A1C4B0A449A4202D266
-S315080044C00B21CFE71DE01A4A1A4B0A449A4201D239
-S315080044D00A21C7E7184A194B0A449A4201D2092108
-S315080044E0C0E7174A174B0A449A4201D20821B9E78E
-S315080044F0154A1144154A914201D20721B2E706210D
-S31508004500B0E70921AEE70000405327FF00350C004D
-S31508004510401E1BFF40420F0000DC0BFF804F1200BD
-S31508004520808CF9FE20D6130060B6E5FE60E316001F
-S3150800453000D3CEFE40771B00C05BB3FEC0912100BE
-S3150800454000CA91FE20753800E05459FEE09C4100EF
-S3150800455010B5044600214FF67F3304EB4112C2F82A
-S315080045600839C2F8083B491C0F29F6D30020C4F8BD
-S315080045701008C4F81408C4F81C082046FFF7CEFE35
-S31508004580002805D12046BDE810401021FFF7D6BE09
-S3150800459010BD10B5029C002C0CD1DB1C9C08002316
-S315080045A000EB023000F5805002E004C902605B1C93
-S315080045B0A342FAD3002010BD7047704710B5094BC7
-S315080045C05A68002A0CD054695C6011749060D060F7
-S315080045D00023537410600844401E5060907C10BD40
-S315080045E0FF2010BDE8000020094800F1180200214C
-S315080045F08174426118301832491CC9B20029F7D0B3
-S3150800460081740021416103490148486070470000F0
-S31508004610940C0020E800002070B504460D46022CD4
-S3150800462004D30FA04FF4F171FBF7ADFE164B04EB64
-S31508004630440203EBC200417C81B181680978297084
-S31508004640417C491E41748168491C81604468A142C5
-S3150800465002D953F832108160012070BD002070BD68
-S315080046602E2E5C2E2E5C2E2E5C2E2E5C536F7572B3
-S3150800467063655C41524D434D375F53544D33324663
-S31508004680375C7573622E6300940C002010B50446DF
-S31508004690022C04D305A040F20221FBF774FE0D4953
-S315080046A004EB440001EBC000407C10BD2E2E5C2EAE
-S315080046B02E5C2E2E5C2E2E5C536F757263655C41E4
-S315080046C0524D434D375F53544D333246375C7573FD
-S315080046D0622E6300940C002070B504460D46022C29
-S315080046E004D34FF4E0710FA0FBF74DFE174B04EB14
-S315080046F0440203EBC200417C047CA14201D10020A4
-S3150800470070BDC1680D70417C491C4174C168491C63
-S31508004710C1604468A14202D953F83210C160012031
-S3150800472070BD00002E2E5C2E2E5C2E2E5C2E2E5C6E
-S31508004730536F757263655C41524D434D375F5354F1
-S315080047404D333246375C7573622E6300940C002035
-S3150800475010B50648D0F8C402FCF7C3FF0348FEF7B5
-S31508004760E2FBBDE810400020FFF726BF480D0020F9
-S3150800477070B5FFF739FF1D4C4021601CFFF71EFF7F
-S31508004780207004F141054021681CFFF717FF2870C7
-S315080047902178FF2901D0FF2803D1842114A0FBF733
-S315080047A0F2FD124800221C498430FEF7A1FD0F488D
-S315080047B01A498430FEF7A2FF0120FFF7FDFE0B48D9
-S315080047C08430FFF759F809488430D0F8C402FCF75A
-S315080047D076FFFBF7F7FD4FF4FA61884204D2BDE88D
-S315080047E070400846FBF70CBE70BD0000C40C0020E4
-S315080047F02E2E5C2E2E5C2E2E5C2E2E5C536F757222
-S3150800480063655C41524D434D375F53544D333246D1
-S31508004810375C7573622E6300840000204C0000200C
-S3150800482070470000014602480078FFF7F5BE000011
-S31508004830050D00202DE9F04180460F461948D0F8AD
-S31508004840C402FDF76CF8184C0026184D607838B18C
-S3150800485020782844401CFFF7E5FF01280DD01EE00C
-S315080048601248FFF7DFFF012819D12878401E3E2895
-S3150800487015D801206070267011E02078401CC2B25D
-S31508004880227028782946904209D1491C4046FBF7F0
-S3150800489058FF6670207838700120BDE8F081002046
-S315080048A0FBE70000480D0020E8000020140C00205B
-S315080048B02DE9F0410446FEF77FFA064611482146DF
-S315080048C0FEF7F2FD85B200240E4F4FF4B478433F4D
-S315080048D00BE0315D3878FFF7FFFE012803D00AA008
-S315080048E04146FBF750FD641CA4B2AC42F1D3FEF777
-S315080048F063FABDE8F0414023024602480121FEF76B
-S3150800490033BE0000480D00202E2E5C2E2E5C2E2E67
-S315080049105C2E2E5C536F757263655C41524D434D38
-S31508004920375F53544D333246375C7573622E6300D6
-S31508004930014602480078FFF7CFBE0000C40C0020ED
-S3150800494070B505460E463F2E03D9B9210EA0FBF7D2
-S315080049501AFD3046FFF7ECFF012803D0BD210AA057
-S31508004960FBF711FD00240CE0FBF7E1FE285DFFF7DD
-S31508004970DFFF012803D0C62103A0FBF704FD641C52
-S31508004980A4B2B442F0D370BD2E2E5C2E2E5C2E2E11
-S315080049905C2E2E5C536F757263655C41524D434DB8
-S315080049A0375F53544D333246375C7573622E630056
-S315080049B02DE9F843154E3078FFF768FE05462800BE
-S315080049C021D0402D00D940250024104F4FF4A3785C
-S315080049D0703F0EE030786946FFF71EFE012803D0C7
-S315080049E00BA04146FBF7CFFC9DF800003855641C28
-S315080049F0E4B2AC42EED3054A81212B46703A02F165
-S31508004A00F400FEF759FEBDE8F8830000C40C002048
-S31508004A102E2E5C2E2E5C2E2E5C2E2E5C536F7572FF
-S31508004A2063655C41524D434D375F53544D333246AF
-S31508004A30375C7573622E630010B5084CFF21E17070
-S31508004A40E21D4168A06C00F037F920710020607102
-S31508004A50A0710820A4F8440010BD000098070020A3
-S31508004A6070B500F0C9F90E4C01252570FF20E070DD
-S31508004A700020102121716071FBF7C0FDA071FBF7C2
-S31508004A80D3FDE071FBF7D0FD000A20726572A572AE
-S31508004A900820A4F84400BDE87040FDF7B5BE000044
-S31508004AA09807002010B5054C0020207000F0A4F9E6
-S31508004AB0FF20E0700120A4F8440010BD98070020EC
-S31508004AC00748FF21C17007498164002101714171BE
-S31508004AD081710721C0F807100821A0F84410704713
-S31508004AE0980700206E4E00080648FF21C170002175
-S31508004AF00171427842718171C17101720621A0F873
-S31508004B00441070479807002070B50446FBF776FDF9
-S31508004B106178801E884204DABDE87040222000F0E1
-S31508004B2071B9104DFF20E8700120A5F8440061789E
-S31508004B3049B1A86CA21CFDF76BFE68B16178A86C38
-S31508004B400844A86470BDFDF751FE0028FAD1BDE8F7
-S31508004B507040312000F056B9BDE87040312000F0B1
-S31508004B6051B900009807002010B5084C4168A06CA0
-S31508004B70FDF746FE28B1FF20E0700120A4F84400A6
-S31508004B8010BDBDE81040312000F03CB99807002060
-S31508004B9070B50546FBF732FD0B4C411E6A1CA06C2E
-S31508004BA0FDF736FE58B1FF20E070FBF727FDA16C34
-S31508004BB0401E0844A0640120A4F8440070BDBDE866
-S31508004BC07040312000F01EB998070020312000F00F
-S31508004BD019B9000010B5FBF7C3FD0348FF21C170E2
-S31508004BE00121A0F8441010BD9807002070B5084CA4
-S31508004BF0FF20E070002525716571FBF7FFFCA071A9
-S31508004C00E571257265720720A4F8440070BD00009E
-S31508004C10980700200449FF22CA704068886401206A
-S31508004C20A1F84400704700009807002070B50446B4
-S31508004C30FBF7E4FC6178401E884204DABDE8704060
-S31508004C40222000F0DFB8094D6168A9646278281D42
-S31508004C50FBF777FDFF20E8706178A86C0844A86424
-S31508004C606078401CA5F8440070BD00009807002035
-S31508004C70002000F0C7B8000070B50546FBF7BEFC7B
-S31508004C806A78401E904204DABDE87040222000F09F
-S31508004C90B9B8084C201DA16CFBF753FDFF20E07046
-S31508004CA06978A06C0844A0646878401CA4F844009D
-S31508004CB070BD0000980700202DE9F04104460E4615
-S31508004CC01746002505E014F8010B2844C5B2FBF782
-S31508004CD02EFD761E701CF6D13D600120BDE8F081E0
-S31508004CE0054800210170816480F84310A0F844103B
-S31508004CF081704170704700009807002003480078CB
-S31508004D00002801D00120704700207047980700202E
-S31508004D1010B50178334CFF290FD02278012A60D1CB
-S31508004D20F42921D013DCD02936D009DCC92930D0A2
-S31508004D30CC293DD0CF293ED137E0FFF791FE3DE0A3
-S31508004D40D1292FD0D2292AD0F32934D112E0F53926
-S31508004D500A2930D2DFE801F0050B2F2F2F112F1467
-S31508004D60171AFFF789FF29E0FFF760FF26E0FFF72C
-S31508004D7051FF23E0FFF760FE20E0FFF7A1FE1DE0EC
-S31508004D80FFF776FF1AE0FFF7AFFE17E0FFF78AFE98
-S31508004D9014E0FFF7FDFE11E0FFF7B6FE0EE0FFF7A1
-S31508004DA025FF0BE0FFF7E0FE08E0FFF713FF05E03D
-S31508004DB0FFF70CFF02E0202000F024F894F84300E7
-S31508004DC0012802D1102000F01DF8B4F9441000297A
-S31508004DD007DD012284F84320E01CBDE8104000F0FE
-S31508004DE01BB810BD980700200249002081F843002F
-S31508004DF07047000098070020014900204870704756
-S31508004E00980700200349FE22CA7008710220A1F8FB
-S31508004E10440070479807002089B2FBF765BC09076C
-S31508004E20090E002804DB00F1E02080F80014704722
-S31508004E3000F00F0000F1E02080F8141D7047FDF720
-S31508004E40B5F8FBF7E3FAFBF7F0FAFCE74FF040702A
-S31508004E50E1EE100A704700000000000000000102A1
-S31508004E6003040607080900000000010203044F7046
-S31508004E70656E424C54000502060206030703080342
-S31508004E80090309040A040B040C040C050D050E0598
-S31508004E900F050F061006100710080000008000080E
-S31508004EA000800000010000000000010800800000EA
-S31508004EB002000000008001080080000003000000D6
-S31508004EC000000208000002000400000000000408B8
-S31508004ED000000400050000000000080800000400A7
-S31508004EE00600000000000C0800000400070000008F
-S31508004EF0104F000800000020F80000000402000817
-S31508004F0008500008F8000020C81500002002000814
-S31508004F100024F4000000000001000000100000005A
-S31508004F200000000000000000000000000000000073
-S31508004F300A060002000000400100000009022000E5
-S31508004F40010100C0320904000002FF000000070545
-S31508004F5081024000FF070501024000FFC12D00083D
-S31508004F60872D0008092E0008000000000000000038
-S31508004F70712D00087B2D0008F52D000800000000A3
-S31508004F800000000000000000AD2D00080000000031
-S31508004F90A12D0008912F0008D92F0008E52F000839
-S31508004FA00930000841300008652F00089D2F0008C9
-S31508004FB0040309041201000200000040501DAC6001
-S31508004FC000020102030100001A03000000000000AD
-S31508004FD000000000000000000000000000000000C3
-S31508004FE000000000000000000000000000000000B3
-S31508004FF0040000000000000000000000000000009F
-S30D0800500000000000000000009A
+S315080001E001D100F051F8AFF2090EBAE80F0013F08A
+S315080001F0010F18BFFB1A43F001031847C84E000049
+S31508000200E84E00000A444FF0000C10F8013B13F0CA
+S31508000210070408BF10F8014B1D1108BF10F8015B51
+S31508000220641E05D010F8016B641E01F8016BF9D144
+S3150800023013F0080F1EBF10F8014BAD1C0C1B09D19B
+S315080002406D1E58BF01F801CBFAD505E014F8016B0D
+S3150800025001F8016B6D1EF9D59142D6D3704700009F
+S315080002600023002400250026103A28BF78C1FBD8B1
+S31508000270520728BF30C148BF0B6070471FB504F04E
+S31508000280CFFE1FBD10B510BD00F063F81146FFF78D
+S31508000290F5FF04F0BEFE00F081F803B4FFF7F2FFA5
+S315080002A003BC00F089F80000094880470948004760
+S315080002B0FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE708
+S315080002C0FEE7FEE704480549054A064B7047000065
+S315080002D0F52D0008C901000848120020481800201A
+S315080002E0481400204814002010B5203AC0F00B80AE
+S315080002F0B1E81850203AA0E81850B1E81850A0E81C
+S315080003001850BFF4F5AF5FEA027C24BFB1E8185075
+S31508000310A0E8185044BF18C918C0BDE810405FEAE5
+S31508000320827C24BF51F8043B40F8043B08BF704761
+S31508000330D20728BF31F8023B48BF11F8012B28BF66
+S3150800034020F8023B48BF00F8012B704770477047FA
+S315080003507047754600F02CF8AE46050069465346C8
+S3150800036020F00700854618B020B5FFF7ABFFBDE8BB
+S3150800037020404FF000064FF000074FF000084FF0FE
+S31508000380000B21F00701AC46ACE8C009ACE8C0098F
+S31508000390ACE8C009ACE8C0098D46704710B50446FC
+S315080003A0AFF300802046BDE81040FFF776BF000097
+S315080003B000487047E811002001491820ABBEFEE747
+S315080003C026000200704700F0D2F9FCE710B500F0ED
+S315080003D075F9012812D00A4C207801280ED102F0AE
+S315080003E017FDD4E90112114401F5FA71884205D3C3
+S315080003F000202070BDE8104000F0D2B910BD000002
+S315080004009C01002001484068704700009C010020BC
+S3150800041010B504490120087000F006F8BDE8104040
+S31508000420FFF7D4BF9C01002010B5044C20780128A2
+S3150800043002D102F0EDFCA06010BD00009C01002076
+S3150800044001494860704700009C01002010B500F083
+S3150800045092F900F087F902F0E3FC02F053FA00F093
+S3150800046019F9BDE81040FFF7D3BF10B500F07FF9C2
+S3150800047002F0F0FC00F02AF9BDE81040FFF7A6BF2D
+S315080004802DE9FF470746884691469A46684601F091
+S31508000490DDFF02984FF47A71B0FBF1F60024154897
+S315080004A04FF4806100EB440310F814205B78D518EC
+S315080004B06D1C7D43B6FBF5F205FB1262A2B9B6FBCD
+S315080004C0F5F295B2A8F800506D1E8D420CD210F8C0
+S315080004D0141089F8001000EB440040788AF80000F0
+S315080004E0012004B0BDE8F087641CE4B2122CD9D30D
+S315080004F00020F6E74A50000830B58DB000240C9469
+S315080005000B940A940AAB0BAA0CA94FF4FA70FFF7DE
+S31508000510B7FF18B9B5211BA0FFF755FF2448234993
+S3150800052001600476447684760125C5760477447797
+S315080005308460C4609DF82C10491E090401619DF869
+S315080005402810491E09054161BDF83010416000F0C8
+S31508000550EEFD0594069407954CF6E040009001944C
+S315080005604FF6E070029004200390049408950E203C
+S31508000570099069460E4800F0CFFC0D4800F090FE41
+S315080005800DB030BD2E2E5C2E2E5C2E2E5C2E2E5CD3
+S31508000590536F757263655C41524D434D375F5354D3
+S315080005A04D333246375C63616E2E6300006400404B
+S315080005B03009002070B588B00E4640F26765002401
+S315080005C003460948002101AA00F02EFD28B9019822
+S315080005D0A84202D1039800B90124012C01D105983B
+S315080005E0307008B0204670BD3009002010B588B0BC
+S315080005F040F2E1730293002304930593069101AB3D
+S3150800060002A902460B4800F00DFC002810D102F0A2
+S31508000610FFFB00F1320405E000F0A9F802F0F8FB50
+S31508000620A04205D80348019900F02AFE0028F3D114
+S3150800063008B010BD3009002004F036B90948007822
+S31508000640002807D0012807D0022807D0032807D09A
+S315080006508120704781207047082070473F207047E7
+S3150800066000207047A801002009480078002807D014
+S31508000670012807D0022807D0032807D08120704711
+S3150800068081207047082070473F2070470020704738
+S31508000690A801002010B504F0FFFBFFF72DFF064C5C
+S315080006A00120207002F078FA0020207004F00CF97E
+S315080006B00220207010BD0000A801002010B50024FB
+S315080006C004F0F8FB00B10124204610BD38B51448E3
+S315080006D06946FFF76FFF134C012805D120709DF876
+S315080006E000100F4804F0F2FB0D48694602F080FA44
+S315080006F0012806D1002020709DF80010084804F053
+S31508000700E5FB0748694604F041F9012806D10220AD
+S3150800071020709DF80010024804F0D8FB38BD000090
+S3150800072020080020A801002070B506460C460C4D8E
+S315080007302878012803D13046E1B2FFF757FF287819
+S3150800074018B93046E1B202F0A9FA2878022803D18E
+S315080007503046E1B204F0A0F9BDE8704004F024BCCC
+S31508000760A8010020AFF30080642002F099B8AFF327
+S31508000770008002F09BB8AFF3008072B6704762B68D
+S31508000780704770B505460C46164605E014F8010B89
+S3150800079005F8010BFFF7EBFF761EB6B2F6D270BD71
+S315080007A010B502F0B1F8002818D000F01DF800289E
+S315080007B014D0FFF741FF00F09FFD02F043FB02F063
+S315080007C09FF8074908400749086002F099F8446805
+S315080007D0FFF7D5FFA446BDE81040604710BD0000EE
+S315080007E080FFFF1F08ED00E010B54FF400500749E1
+S315080007F00969884303D0002018B1002010BD0120E4
+S31508000800FAE702F045F8012010BD00000008024092
+S315080008100022002905D001291CD002291DD04FF439
+S3150800082040720F490B6823F440730B600B6813433F
+S315080008300B600A6822F0F8020A600A68022303EBD2
+S31508000840C00002430A60086840F480300860BFF3BD
+S315080008504F8F70474FF48072E3E74FF40072E0E77A
+S31508000860103C024009490A6822F440720A600A6884
+S3150800087042F004020A600A684FF4803343EA002013
+S3150800088002430A60BFF34F8F70470000103C0240D6
+S31508000890074A136823F440731360136813601368D8
+S315080008A043F0010313600170BFF34F8F70470000D8
+S315080008B0103C024010B509490C6824F440740C60D9
+S315080008C00C6844F440740C600C6844F001040C6035
+S315080008D002604360BFF34F8F10BD0000103C02401A
+S315080008E0084A136823F440731360136843F480734B
+S315080008F01360136843F0010313600180BFF34F8F41
+S3150800090070470000103C0240084A136823F44073FD
+S315080009101360136843F400731360136843F001030C
+S3150800092013600160BFF34F8F70470000103C024010
+S31508000930134908688207134803D5826942F02002E2
+S3150800094082610A68D20603D5826942F01002826182
+S315080009500A68920603D5826942F0080282610A682B
+S31508000960520603D5826942F0040282610A681206B9
+S3150800097003D5826942F002028261F220086070475C
+S315080009800C3C0240C001002070B504461149002005
+S31508000990886100F087FD05460F4E09E0601C07D008
+S315080009A024B100F07FFD401BA04201D9032070BD91
+S315080009B03068C003F2D4306810F0F20F03D0FFF7A6
+S315080009C0B7FF012070BD3068C00701D00120306034
+S315080009D0002070BDC00100200C3C02402DE9F04704
+S315080009E004460D4616461F464FEA55294FEA492939
+S315080009F02068401C04D14946204600F01FF938B348
+S31508000A002068484505D04946204600F02BF904469B
+S31508000A1004B32068281A05192D1D4FF4007809F526
+S31508000A200079FFF7A4FE281B001F404506D3494658
+S31508000A30204600F017F9044674B1251D16F8010B77
+S31508000A4005F8010B7F1E002FEBD10120BDE8F087CA
+S31508000A500020FBE70020F9E70020F7E710B50B4870
+S31508000A600068401C03D0094800F06EF948B10848F0
+S31508000A700068401C03D0064800F066F918B101204A
+S31508000A8010BD002010BD002010BD00005C0B00202A
+S31508000A90580900202DE9F04100270021184A01EBEA
+S31508000AA0410302EB83031B7A834222D101EB410007
+S31508000AB052F8205002EB80004668A80750EA867074
+S31508000AC004D010A040F2C321FFF77DFC01270024C3
+S31508000AD00BE014F0FF0F01D1FFF749FE2868401C10
+S31508000AE001D0002709E02D1D641CB4EB960FF0D346
+S31508000AF003E0491CC9B20729D1D33846BDE8F081BD
+S31508000B00705000082E2E5C2E2E5C2E2E5C2E2E5C2F
+S31508000B10536F757263655C41524D434D375F53544D
+S31508000B204D333246375C666C6173682E630000008D
+S31508000B3070B505460C460D48411B601E814201D220
+S31508000B40002070BD284600F047F806462819401EC2
+S31508000B5000F042F80146FF2E06D0FF2904D03046A1
+S31508000B60BDE8704000F004B8002070BDFFFF0F0814
+S31508000B70F0B585B004460E46012500270097B44215
+S31508000B8000D900250CB1072E00D9002500F067F81A
+S31508000B9000B90025012D1BD10197022004900120E0
+S31508000BA0039000F069FC0FE02046FFF773FF48B991
+S31508000BB0FFF7DDFD029401A8694600F0C9FB08B1FC
+S31508000BC0002503E0641CE4B2B442EDD900F008FC49
+S31508000BD005B02846F0BD00002DE9F0410546FF277F
+S31508000BE000240E4EFFF7C3FD04EB440156F82120FE
+S31508000BF0AA420BD806EB810040681044A84205D9E2
+S31508000C0004EB440006EB8000077A03E0641CE4B2B8
+S31508000C10072CE7D33846BDE8F0810000705000087D
+S31508000C20004870470080000803494FF0FF3008600D
+S31508000C3001F50171086070475809002010B5CA050A
+S31508000C4001D0002010BD02688A4201D1012010BDE2
+S31508000C5002C04FF40072FFF794FD012010BD012079
+S31508000C607047000070B504460D460D48844202D10F
+S31508000C70A0F5017409E00B48854202D1084C0546E7
+S31508000C8003E0204600F060F830B129462046FFF719
+S31508000C90D5FF18B1204670BD002070BD002070BD7C
+S31508000CA05C0B0020008000080B480168426811446C
+S31508000CB082681144C26811440269114442691144A8
+S31508000CC082691144D0F8C8010844002801D00020E0
+S31508000CD070470120704700000080000870B5044680
+S31508000CE00D4616461448011B681E814201D2002093
+S31508000CF070BD2046FFF770FFFF2812D06019401E0E
+S31508000D00FFF76AFFFF280CD0600A40020B498842A9
+S31508000D1009D12B46324621460948BDE87040FFF7FF
+S31508000D205DBE002070BD2B46324621460548BDE80B
+S31508000D307040FFF753BE0000FFFF0F080080000851
+S31508000D405C0B0020580900202DE9F04106464FF0BB
+S31508000D500108FFF784FFA0B100F08EFB002430687D
+S31508000D6000EB840706EB84004568FFF700FD0023C7
+S31508000D702A460220394600F03DFB28B14FF000080C
+S31508000D800BE00020BDE8F0813868A84202D04FF099
+S31508000D90000802E0641C802CE1D300F021FB4046E9
+S31508000DA0F0E7000008B5002000900E480168491CCD
+S31508000DB015D0416882681144C26811440269114419
+S31508000DC04269114482691144C0690844C043401C01
+S31508000DD00090054804216A46FFF780FF08BD0120F8
+S31508000DE008BD00005C0B0020C881000810B50B4840
+S31508000DF00168001D0468001D0068084400280BD01F
+S31508000E000749082201F057F9054904222046BDE89A
+S31508000E101040103101F04FB910BD000020F4F01F4A
+S31508000E2082010020F0B590F820500468A468012DCE
+S31508000E3007D0022D05D0416A41F480214162012084
+S31508000E40F0BD04F0806504F00066354301D1E50085
+S31508000E505BD5C4F30164022C05D9416A41F400014B
+S31508000E6041620120F0BD0125A5401D604FF4C07503
+S31508000E708B689BB1CE6805EB041733434E6843EA8B
+S31508000E80C6030668F35107684FF4C27303EB0413ED
+S31508000E900E69FE50097D012909D00DE00E8805EB83
+S31508000EA00417CB6843EA46530668F351EBE7016833
+S31508000EB0CE5846F48076CE50D3791179567941EAE0
+S31508000EC0036193791B0443EA0623194303684FF425
+S31508000ED0C67606EB04169951D378117841EA036170
+S31508000EE0937852781B0443EA0222114302684FF4AE
+S31508000EF0C47303EB0413D150006805EB0411425880
+S31508000F0042F0010242500020F0BD416A41F400114E
+S31508000F1041620120F0BD000010B590F82020012A9A
+S31508000F2007D0022A05D0416A41F480214162012096
+S31508000F3010BD3C4800F50070026842F001020260EC
+S31508000F40026822F47C52026002684B6A42EA032273
+S31508000F5002600A7D02F01F0301229A40C369934387
+S31508000F60C361A0F50070CB69B3B9D0F80C329343CE
+S31508000F70C0F80C328C894B6864F31F434C6900EB4C
+S31508000F80C404C4F840320C890B6864F31F434C69E7
+S31508000F9000EBC404C4F84432CB69012B16D1D0F84F
+S31508000FA00C321343C0F80C320C884B6864F31F43A9
+S31508000FB04C6900EBC404C4F840320C89CB6864F36E
+S31508000FC01F434C6900EBC404C4F844328B697BB1F7
+S31508000FD0D0F804321343C0F804320B6973B1D0F861
+S31508000FE014321343C0F81432096A01290CD010E0F0
+S31508000FF0D0F804329343C0F80432EEE7D0F814323E
+S315080010009343C0F81432EFE7D0F81C121143C0F826
+S315080010101C12D0F8001221F00101C0F800120020BD
+S3150800102010BD00000064004030B590F82040012C47
+S3150800103007D0022C05D0416A41F480214162012083
+S3150800104030BD21B104682469A4075FD003E00468B1
+S31508001050E468A40754D005684FF4D87404EB011467
+S315080010602D5905F004059560F5B305682D59ED0869
+S31508001070556005682C5904F00204D46005684FF4DD
+S31508001080DA7404EB01142D5905F00F05156105688E
+S315080010902D59C5F30725956105682C59240C54610B
+S315080010A004684FF4DC7202EB0112A4581C70046841
+S315080010B0A458240A5C700468A458240C9C7004681C
+S315080010C0A258120EDA7004684FF4DE7202EB0112AF
+S315080010D0A4581C710468A458240A5C710468A458AE
+S315080010E0240C9C71046800E016E0A258120EDA710E
+S315080010F0B9B10068016941F020010161002030BDE5
+S31508001100416A41F400114162012030BD416A41F44F
+S3150800111000114162012030BD05682D596D0D15601D
+S31508001120A7E70068C16841F02001C160E6E770B52D
+S315080011300446002C03D094F8200010B104E00120E6
+S3150800114070BD204600F0ABF82068016821F0020166
+S31508001150016000F0A7F9054605260CE000F0A2F9A3
+S31508001160401B0A2807D9606A40F40030606284F898
+S315080011702060012070BD206840688007EED4206892
+S31508001180016841F00101016000F08CF905460CE0A8
+S3150800119000F088F9401B0A2807D9606A40F4003035
+S315080011A0606284F82060012070BD20684068C0072E
+S315080011B0EED0207E01283FD02068016821F080010A
+S315080011C00160607E01283DD02068016821F0400159
+S315080011D00160A07E01283BD02068016821F020012B
+S315080011E00160E07E012839D02068016841F01001CD
+S315080011F00160207F012837D02068016821F00801A6
+S315080012000160607F012835D02068016821F004015B
+S315080012100160D4E902010843D4E9041211430843E2
+S315080012206168491E08432168C86100206062012080
+S3150800123084F82000002070BD2068016841F0800114
+S315080012400160BEE72068016841F040010160C0E71F
+S315080012502068016841F020010160C2E72068016842
+S3150800126021F010010160C4E72068016841F0080117
+S315080012700160C6E72068016841F004010160C8E71B
+S315080012800346002093F82020012A01D0022A05D11E
+S315080012901A6889069268914300D001207047704702
+S315080012A070B5044694F82000012805D0606A40F419
+S315080012B000206062012070BD022084F820002068AA
+S315080012C0016821F00101016000F0ECF805460DE027
+S315080012D000F0E8F8401B0A2808D9606A40F4003094
+S315080012E06062052084F82000012070BD20684068EF
+S315080012F0C007EDD1606270BD10B50B4A4FF0FF30E4
+S31508001300106000211160121D10601160064A103A23
+S3150800131010601160121D10601160121D10601160BE
+S3150800132000F0F0F8002010BD2038024070B50446E1
+S3150800133000F0B8F80546601C02D00448007804445A
+S3150800134000F0B0F8401BA042FAD370BD0800002098
+S315080013502DE9F04704460E46DFF87C8098F814001D
+S31508001360012809D0012088F814004CF25039484663
+S31508001370FFF70AFB18B12AE00220BDE8F0874FF014
+S31508001380FF3131602168154F012901D0656819E0E0
+S31508001390207BFFF767FA4846FFF7F6FA396821F027
+S315080013A00401396013E0217B2846FFF731FA4846E5
+S315080013B0FFF7EAFA396821F07A01396008B1356031
+S315080013C005E06D1CD4E901211144A942EBD800219E
+S315080013D088F81410D1E70000C0010020103C024034
+S315080013E00348016841F00041016000207047000091
+S315080013F0103C02402DE9F0470646894614461D462C
+S315080014001B4F387D012808D0012038754CF250381A
+S315080014104046FFF7B9FA18B126E00220BDE8F08782
+S3150800142036B1012E09D0022E0CD0032E14D10EE0AF
+S315080014304846E1B2FFF72CFA0EE0A1B24846FFF79C
+S315080014404FFA09E021464846FFF75EFA04E02246CD
+S315080014502B464846FFF72EFA4046FFF795FA054908
+S315080014600A6822F001020A6000213975D6E70000F1
+S31508001470C0010020103C0240002007490A68002AE3
+S3150800148009DA054A054B0C3A1360054B13600968DF
+S31508001490002900DA01207047103C02402301674505
+S315080014A0AB89EFCD01F0B4BC10B5032000F008F904
+S315080014B0002000F005F800F067F8002010BD0000D5
+S315080014C070B504460D4D4FF47A712878B1FBF0F0EB
+S315080014D00B490968B1FBF0F000F0D2FD08B1012014
+S315080014E070BD102C07D200222146501E00F0C8F805
+S315080014F06C60002070BD012070BD0000080000204F
+S315080015000000002010B500F051FF1A4C4FF40001FE
+S31508001510A161194800F01CFE184800F019FE204683
+S3150800152000F016FE164800F013FE1648016821F072
+S3150800153080010160134C0C34206820F00070206094
+S31508001540206820F480202060082000F0D1FD0420C7
+S3150800155000F0CEFD022000F0CBFD012000F0C8FD12
+S31508001560206820F080502060201D016821F4804109
+S31508001570016010BD00040240000C02400008024051
+S3150800158000000240343802402DE9F04188B037485F
+S31508001590016841F480410160006800F480400190D0
+S315080015A04FF0805000F0C8FD012000F0A9FD022090
+S315080015B000F0A6FD042000F0A3FD082000F0A0FD21
+S315080015C04FF4802000F0B8FD4FF0007000F0B4FD35
+S315080015D08020029001200390002404940594069428
+S315080015E002A9DFF88C80404600F03EFE4FF400006A
+S315080015F0C8F81800801202900394069402A91D48A0
+S3150800160000F032FE4FF44077029702250395032631
+S315080016100496059406940720079002A9164800F038
+S3150800162023FE0297039504960594069409200790CD
+S3150800163002A9404600F018FEF002029003950496AF
+S31508001640059406940A20079002A90C4800F00CFE9F
+S3150800165006481038016841F080010160006800F012
+S315080016608000019008B0BDE8F081000044380240CF
+S315080016700004024000080240000C0240000002403C
+S31508001680F0B40D460D4B1B68C3F30223C3F10704E0
+S31508001690042C00D90424191D072901D2002300E0CF
+S315080016A0DB1E012606FA04F1491E294099409E4090
+S315080016B0761E16403143F0BC03F09BBC0CED00E0EF
+S315080016C000F00701054A10684FF6FF03184040EA84
+S315080016D00120034908431060704700000CED00E044
+S315080016E00000FA0501680122C0F8FC23002280F8F0
+S315080016F0F423886940F000608861486D024A104307
+S315080017004865002070470000030000107047006815
+S3150800171041620020704770B50368586A002907D0EF
+S315080017209C6A00EB14440020491E4FF482750AE0B7
+S3150800173040EA024098620DE005EB80069E5904EBEC
+S315080017401644401CC0B28842F6D305EB810144EA30
+S3150800175002405850002070BD10B50446012002F022
+S31508001760D7FFD4F80004BDE8104001F03ABFC1EB3A
+S31508001770C10200EB8202D0F80004926C01F091BE1F
+S31508001780C1EBC10200EB8202D0F80004D2F80822AD
+S3150800179001F0E6BE10B50446002C0CD0032084F8F0
+S315080017A0BD03204600F02EFC204600F0C9FB0020B1
+S315080017B084F8BD0310BD012010BD10B5044694F889
+S315080017C0BC03012809D0012084F8BC03206802F074
+S315080017D065FB002084F8BC0310BD022010BD10B5BF
+S315080017E0044694F8BC03012809D0012084F8BC03F8
+S315080017F0206802F05FFB002084F8BC0310BD0220BD
+S3150800180010BD10B50446002002F082FFD4F800048B
+S31508001810BDE8104001F0E7BE70B504464FF001027E
+S3150800182001F00F004FF000050B06C0EBC00104EBFA
+S31508001830810102D53C314A7002E001F5FE714D7016
+S31508001840087094F8BC03012808D084F8BC232068E3
+S3150800185002F0C0FA84F8BC53002070BD022070BDA7
+S3150800186070B5044601F00F006268904201D9012064
+S3150800187070BD0B064FF0010201F00F014FF0000595
+S31508001880C1EBC10104EB810102D53C314A7002E08B
+S3150800189001F5FE714D708D70087094F8BC0301282F
+S315080018A008D084F8BC23206802F08CFC84F8BC536A
+S315080018B0002070BD022070BD01F00F01C1EBC1010F
+S315080018C000EB8100D0F8140270472DE9F041044678
+S315080018D04FF0010601F00F004FF000050F06C0EBB0
+S315080018E0C00104EB810102D53C314E7002E001F5DE
+S315080018F0FE714D7008708A60CB704A7802B1C88054
+S31508001900022B00D10D7194F8BC03012809D084F884
+S31508001910BC63206802F0BAF9284684F8BC53BDE8CF
+S31508001920F0810220FBE770B50D4605F00F04C4EB05
+S31508001930C40100EB810101F5FE71CA604B61002309
+S315080019408B614B700C700369012B00D10A612A0761
+S3150800195005D0027C006802F08DFC002070BD027C78
+S31508001960006802F07BFBF8E770B504460D4605F003
+S315080019700F006168884201D9012070BD29064FF021
+S3150800198000064FF0010206D5C0EBC00104EB810149
+S315080019903C314A7006E0C5EBC50104EB810101F54F
+S315080019A0FE714E708A70087094F8BC03012807D03F
+S315080019B084F8BC23206802F031FC280702D007E02F
+S315080019C0022070BD217C04F57172206802F0D0FBFC
+S315080019D084F8BC63002070BD70B50D4605F00F0491
+S315080019E0C4EBC40100EB81013C31CA604B610023A2
+S315080019F08B6101234B700C700369012B00D10A61BE
+S31508001A002A0705D0027C006802F034FC002070BD6D
+S31508001A10027C006802F022FBF8E72DE9F84F04463D
+S31508001A202568284602F058FD00287ED1206802F075
+S31508001A307FFD002879D0206802F07AFD800704D55A
+S31508001A402068416901F002014161206802F070FDD9
+S31508001A50C10604F57170009035D52068816921F0BA
+S31508001A60100181612F6A07F00F00C0EBC00004EB7C
+S31508001A70800606F5FE76C7F34340022802D00628FC
+S31508001A8012D01BE047F6F070074217D0C7F30A12C8
+S31508001A90F1681746284602F04FFDF0683844F060B2
+S31508001AA0B0693844B06109E000990822284602F076
+S31508001AB043FDB069C7F30A110844B061206881691B
+S31508001AC041F010018161206802F032FD00034FF0F9
+S31508001AD001084FF008094FF0100A3ED50026206885
+S31508001AE002F005FD834635E05FEACB702FD020680B
+S31508001AF0F1B202F015FD0746F80707D005EB4610C8
+S31508001B00C0F8088B3146204600F026FF380707D56F
+S31508001B1005EB4610C0F8089B3146204600F0F8FE53
+S31508001B20F80605D505EB461000E087E1C0F808ABD6
+S31508001B30B80604D505EB46112020C1F8080BB804F1
+S31508001B4005D505EB46114FF40050C1F8080B761C75
+S31508001B504FEA5B0BBBF1000FC6D1206802F0E8FC28
+S31508001B60400359D5206802F0BBFC8346002650E0A6
+S31508001B705FEACB704AD02068F1B202F0BFFC074694
+S31508001B80F80723D006F00F0108FA01F0D5F8341843
+S31508001B908143C5F8341805EB4610C0F80889206952
+S31508001BA001280FD1C6EBC60004EB8000D0E911214D
+S31508001BB01144816436B9206D20B920680121009A44
+S31508001BC002F0D6FA2046F1B2FFF7D1FD380703D561
+S31508001BD005EB4610C0F80899F80603D505EB46103C
+S31508001BE0C0F808A9780604D505EB46114020C1F8C7
+S31508001BF00809B80704D505EB46110220C1F80809FB
+S31508001C00380603D53146204600F018FF761C4FEA01
+S31508001C105B0BBBF1000FABD1206802F089FC0028F2
+S31508001C2011DAD5F8040820F00100C5F8040894F87C
+S31508001C30F403012839D0204600F0A6F92068416946
+S31508001C4001F000414161206802F072FC00050BD5E5
+S31508001C50D5F80808C00702D0204600F0F1F9206838
+S31508001C60416901F400614161206802F061FC0001EC
+S31508001C700AD52068416901F00061416194F8F403CE
+S31508001C80D8B1204600F0DCF9206802F051FCC00407
+S31508001C9073D5D5F8040820F00100C5F804082068B3
+S31508001CA0102102F0F7FB002132E0002084F8F4034B
+S31508001CB000212046FFF72AFDC0E784F8F483206850
+S31508001CC0406DC0F38300C4F8F80301212046FFF7EE
+S31508001CD01DFDD9E705EB41104FF67F3200F5106080
+S31508001CE08260036823F400130360036843F000630B
+S31508001CF00360C0F80822D0F8002222F40012C0F8C7
+S31508001D000022D0F8002242F00062C0F80022491CE6
+S31508001D1060688842DED8D5F81C0840F00110C5F87E
+S31508001D201C08206B60B1D5F8840840F00B00C5F894
+S31508001D308408D5F8440840F00B00C5F844080CE0C0
+S31508001D40D5F8140842F22B010843C5F81408D5F84B
+S31508001D50100840F00B00C5F81008D5F8000820F464
+S31508001D60FE60C5F80008217C2068009A02F000FA97
+S31508001D702068416901F480514161206802F0D8FB6E
+S31508001D80800415D5206801F0C3FF206802F094FB93
+S31508001D90E06000F06FF9227B0146206802F00AFC39
+S31508001DA0204600F0CFF82068416901F400514161EE
+S31508001DB0206802F0BDFB000707D5204600F0EEF8C4
+S31508001DC02068416901F008014161206802F0B0FB12
+S31508001DD0C00208D50021204600F032F82068416983
+S31508001DE001F480114161206802F0A2FB800208D547
+S31508001DF00021204600F028F82068416901F4001106
+S31508001E004161206802F094FB400007D52046FFF7A1
+S31508001E10A3FC2068416901F080414161206802F015
+S31508001E2087FB40070AD520684568680702D520461B
+S31508001E30FFF7E7FC2068416829434160BDE8F88F51
+S31508001E40D0F8000401F02CBCD0F8000401F02ABC3C
+S31508001E502DE9F0418AB00446002C05D0266894F88E
+S31508001E60BD03002520B108E001200AB0BDE8F081D5
+S31508001E7084F8BC53204600F064F8032084F8BD03B8
+S31508001E80F06BC00500D42561206802F0E1F804F182
+S31508001E901001684628228846FEF726FA94E80F00BD
+S31508001EA001F044FF022718B184F8BD730120DCE76E
+S31508001EB02068002102F04FFB002101260DE0C1EB4E
+S31508001EC0C10004EB80003C3046700170C180C570CB
+S31508001ED08560C5604561491CC9B260688842EED80C
+S31508001EE000210DE0C1EBC10004EB800000F5FE7097
+S31508001EF045700170C5708560C5604561491CC9B2E9
+S31508001F0060688842EED8282241466846FEF7ECF912
+S31508001F1094E80F0001F0DAFF18B184F8BD730120C8
+S31508001F20A3E784F8385084F8BD63606A012802D1B3
+S31508001F302046FFF7D7FB206801F0BCFF002094E796
+S31508001F407047704770B504460125E068002810D030
+S31508001F50022803D0912108A0FEF735FAD4F8000428
+S31508001F60294601F0F6FBD4F80004BDE8704001F0FC
+S31508001F70B0BB0025F2E700002E2E5C757362645F25
+S31508001F80636F6E662E63000010B5044602F0F4FC1B
+S31508001F90D4F80004BDE8104001F0C5BBD0F8000431
+S31508001FA001F0CBBB10B5044694F8BC0301280BD04E
+S31508001FB0012084F8BC0384F83810206802F0E3FA9C
+S31508001FC0002084F8BC0310BD022010BDD0F8002400
+S31508001FD000F57171104601F0C8BB10B5044694F8B7
+S31508001FE0BC0301280CD0012084F8BC03206801F04A
+S31508001FF055FF206802F038FA002084F8BC0310BDAB
+S31508002000022010BD70B5044694F8BC0301280ED012
+S31508002010012084F8BC03206802F01AF8206802F050
+S3150800202043FB002528B184F8BC53012070BD02206B
+S3150800203070BD206801F03EFF84F8BC53002070BDD7
+S3150800204010B50446D4F8000401F0DAFB2068D0F88D
+S31508002050001E41F00101C0F8001E206A20B10448A4
+S31508002060016841F006010160BDE8104002F051BB6D
+S3150800207010ED00E0014800687047000000000020ED
+S3150800208010B5401EB0F1807F01D3012010BD4FF07E
+S31508002090E02460610F21601702F0ABFF0020A06109
+S315080020A007202061002010BD10B5FFF7FDF9BDE837
+S315080020B0104000F027BEF0B500230A253026372742
+S315080020C0002412E0B5EB107F04D906EB107C01F86A
+S315080020D013C003E007EB107C01F813C0000101EB05
+S315080020E0430C8CF801405B1CDBB29342EAD3F0BD8B
+S315080020F002490A6882430A60704700003038024085
+S3150800210008B504490A6802430A6009680140009153
+S3150800211008BD00003038024002490A6802430A60D6
+S31508002120704700001038024002490A6882430A6074
+S31508002130704700001038024008B504490A6802438F
+S315080021400A6009680140009108BD00004038024055
+S3150800215070B500243949884206D10120FFF7DCFF13
+S315080021600120FFF7E1FF67E03549884206D10220E2
+S31508002170FFF7D2FF0220FFF7D7FF5DE0314988421B
+S3150800218006D10420FFF7C8FF0420FFF7CDFF53E070
+S315080021902D49884206D10820FFF7BEFF0820FFF721
+S315080021A0C3FF49E02949884206D11020FFF7B4FF4A
+S315080021B01020FFF7B9FF3FE02549884206D12020C5
+S315080021C0FFF7AAFF2020FFF7AFFF35E02149884235
+S315080021D006D14020FFF7A0FF4020FFF7A5FF2BE020
+S315080021E01D49884206D18020FFF796FF8020FFF719
+S315080021F09BFF21E01949884207D185152846FFF734
+S315080022008BFF2846FFF790FF16E01549884207D14D
+S3150800221045152846FFF780FF2846FFF785FF0BE0A0
+S315080022201049884207D105152846FFF775FF284645
+S31508002230FFF77AFF00E00124204670BD0000024047
+S315080022400004024000080240000C02400010024050
+S315080022500014024000180240001C02400020024000
+S3150800226000240240002802402DE9F0410A6892FA4B
+S31508002270A2F2B2FA82F30F2603258FE001249C40CE
+S315080022802240002A7ED04C68012C01D0022C20D195
+S315080022908C68876892FAA2FCBCFA8CFC4FEA4C0C54
+S315080022A005FA0CFC27EA0C0792FAA2FCBCFA8CFC8D
+S315080022B04FEA4C0C04FA0CF427438760CF680C6885
+S315080022C0D0F804C02CEA040C7C434CEA040CC0F891
+S315080022D004C00C69C76892FAA2FCBCFA8CFC4FEAE7
+S315080022E04C0C05FA0CFC27EA0C0792FAA2FCBCFA7D
+S315080022F08CFC4FEA4C0C04FA0CF42743C7604C6874
+S31508002300022C34D192FAA2F4B4FA84F4082C16D228
+S315080023104C69076A92FAA2FCBCFA8CFC4FEA8C0C50
+S3150800232006FA0CFC27EA0C0792FAA2FCBCFA8CFC0B
+S315080023304FEA8C0C04FA0CF42743076217E04F693E
+S31508002340D0F824C0140A94FAA4F894FAA4F4B8FAB3
+S3150800235088F8B4FA84F44FEA880806FA08F8A4005C
+S315080023602CEA080CA7404CEA070CC0F824C04C68B5
+S31508002370076892FAA2FCBCFA8CFC4FEA4C0805FAEC
+S3150800238008FC00E009E092FAA2F227EA0C07B2FA82
+S3150800239082F252009440274307605B1C0A6832FAAF
+S315080023A003F47FF46BAF0020BDE8F08138B5244C08
+S315080023B0206840F00100206000F09EF90128FBD15A
+S315080023C01F49002008310860206800901D490098C0
+S315080023D00840009000982060206820F0F80040F03F
+S315080023E08000206000F0B8F90028FBD100F094F9CD
+S315080023F00028FBD100F098F90028FBD110491248B3
+S31508002400091D086010480E49103884310860091DF6
+S3150800241008600B480C30016821F4FE410160016830
+S3150800242041F47F01016006487430016821F001011A
+S315080024300160016841F080710160002038BD00002C
+S3150800244000380240FFFFF2EA1030002410B50446B7
+S3150800245000F06CFB206000F03FFB606000F04AFB78
+S31508002460A060606800F054FBE06010BD70B5002401
+S31508002470494EC0284FF4004509D0B0F5407F27D013
+S31508002480B0F5405F45D0B0F5404F63D081E000F02D
+S315080024908BF8A0F5400040380BD040280DD0802896
+S315080024A011D000F043FB00F017FB00F023FB0446B5
+S315080024B06FE000F03BFB04466BE000F01DF90028D6
+S315080024C067D0344665E000F01FF908B32C4660E093
+S315080024D000F06AF8314940180DD0B0F5807F0ED06B
+S315080024E0B0F5007F10D000F021FB00F0F5FA00F0FF
+S315080024F001FB04464DE000F019FB044649E000F0F4
+S31508002500FBF828B1344644E000F0FEF800B12C464A
+S315080025103FE000F049F8224940180DD0B0F5805F39
+S315080025200ED0B0F5005F10D000F000FB00F0D4FA32
+S3150800253000F0E0FA04462CE000F0F8FA044628E039
+S3150800254000F0DAF828B3344623E000F0DDF800B3EB
+S315080025502C461EE000F028F81249401809D0B0F5BC
+S31508002560804F0AD0A8420DD100F0CEF888B12C468B
+S315080025700FE000F0DBFA04460BE000F0BDF840B1CE
+S31508002580344606E000F0D2FA00F0A6FA00F0B2FAF5
+S315080025900446204670BD00000024F40000FFFFFC3E
+S315080025A000F0FFCF00C0FF3F02490968014041EA39
+S315080025B0004070479038024070B50024484D032803
+S315080025C04FF4004607D00C2825D0B0F5406F42D00E
+S315080025D0302861D071E000F087F86FF44031401878
+S315080025E00BD001280DD0022810D000F09FFA00F079
+S315080025F073FA00F08DFA04465FE000F097FA044695
+S315080026005BE000F079F800B32C4656E000F07CF861
+S31508002610D8B1344651E000F067F8A0F54020001F15
+S315080026200BD004280DD0082810D000F07FFA00F04F
+S3150800263053FA00F05FFA04463FE000F077FA0446E2
+S315080026403BE000F059F800B12C4636E000F05CF8A3
+S3150800265008B3344631E000F047F8224940180DD057
+S31508002660B0F5806F0ED0B0F5006F10D000F05EFAAE
+S3150800267000F032FA00F04CFA04461EE000F056FA72
+S3150800268004461AE000F038F828B12C4615E000F0A8
+S315080026903BF800B1344610E000F026F8A0F54010EB
+S315080026A010380CD010280ED0202812D000F03EFA90
+S315080026B000F012FA00F01EFA0446204670BD00F03B
+S315080026C035FA0446F9E700F017F80028F5D02C4645
+S315080026D0F3E700F019F80028EFD03446EDE70000DC
+S315080026E00024F40000FCFFF302490968014041EAAE
+S315080026F0004070479038024002480068C0F3400026
+S31508002700704700000038024002480068C0F34000E5
+S31508002710704700007038024002480068C0F3C06085
+S31508002720704700000038024002480068C0F3407055
+S3150800273070470000003802400248006800F03F0079
+S3150800274070470000043802400248006800F4800020
+S31508002750704700000438024002480068C0F3406031
+S3150800276070470000003802400149086070470000C1
+S315080027700000002070B504460D4601260020216899
+S31508002780C1F30001002960D1EA686968AB691143A1
+S315080027902A691A4311432268344B1A4011432160AF
+S315080027A0A968626822F440520A4362606969A268AD
+S315080027B022F440720A43A2602D498C4203D10320B9
+S315080027C0FFF7FAFE33E02B498C4203D10C20FFF7C2
+S315080027D0F3FE2CE028498C4203D13020FFF7ECFEAB
+S315080027E025E026498C4203D1C020FFF73FFE1EE0B4
+S315080027F023498C4204D14FF44070FFF737FE16E0A8
+S3150800280020498C4204D14FF44060FFF7D5FE0EE014
+S315080028101D498C4204D14FF44050FFF727FE06E0CD
+S315080028201A498C4203D14FF44040FFF71FFE60B1AE
+S31508002830296851B10026AA69B2F5004F07D000EB06
+S315080028405100B0FBF1F080B2E060304670BD400048
+S3150800285000EB5100B0FBF1F080B24FF6F071014089
+S31508002860C0F342000143E160EFE70000F369FFEFC0
+S31508002870001001400044004000480040004C004061
+S31508002880005000400014014000780040007C0040E1
+S3150800289002494FF4000088617047000000040240B6
+S315080028A001494880704700001400002010B500F068
+S315080028B0AFFA0B4C616888420CD32078094950B1AD
+S315080028C0002020704FF40000886100F0A1FA6188AA
+S315080028D00844606010BD0120207080208861F4E7FC
+S315080028E0140000200004024010B5FEF75BFA18B188
+S315080028F0BDE81040FEF7B2B8002010BDFEF718B9C3
+S31508002900FEF78EB9FEF790B9FEF7CEB9FEF7E6B92F
+S3150800291070B504462068056C00EB4110D0F8081B1A
+S315080029200C4EB54205D9090403D54FF40041C0F849
+S31508002930081B2046FFF74AFBB54208D9206901283B
+S3150800294005D12068012104F5717201F011FC0020FF
+S3150800295070BD00000A30544F2DE9F04104460D467B
+S315080029602668316C06EB4510D0F8083B4FF4004753
+S31508002970D4F8108004F571724FF0200CB8F1010FED
+S3150800298008D0DFF8B080414545D119043AD5C0F8DA
+S31508002990087B4CE0284E5FEA037806D5B14246D953
+S315080029A0190444D5C0F8087B41E05FEA836802D57C
+S315080029B0C0F808CB3BE013F0280F38D1B14204D950
+S315080029C0190402D5C0F8087B31E0C5EBC501D0F87B
+S315080029D0100B04EB810101F501710B68C0F31200BD
+S315080029E0181A086148681844486035B9D4F81002BE
+S315080029F018B92068012101F0BBFB2046E9B2FEF7B1
+S31508002A00BFFE14E0990601D5C0F808CB2046E9B206
+S31508002A10FEF7B6FE0BE035B9D4F8100218B9002156
+S31508002A20304601F0A5FB2046E9B2FEF7A9FE0020D4
+S31508002A30BDE8F0810A31544F0A30544F2DE9F84F5A
+S31508002A4080460E46D8F80070C6EBC60008EB800430
+S31508002A503C34D4E90510884202D90120BDE8F88F34
+S31508002A60081AA168814200D20846C01C4FEA900A9B
+S31508002A7007EB461916E0151AA268AA4200D21546AF
+S31508002A80E81C4FEA900A98F810000090ABB2E1688B
+S31508002A903846F2B201F029FEE0682844E060A069F1
+S31508002AA02844A061D9F8180980B2504505D3D4E95D
+S31508002AB00520904201D2002ADDD1D4E905018842D9
+S31508002AC008D8012006F00F018840D7F8341881434A
+S31508002AD0C7F834180020C1E70449096801F0F00175
+S31508002AE0034A0909515CC84070470000083802408B
+S31508002AF02A5000080449096801F4E051034A02EB28
+S31508002B0091210978C8407047083802403A500008B1
+S31508002B100449096801F46041034A02EB5131097816
+S31508002B20C8407047083802403A500008074800680D
+S31508002B3000F00C010648002906D0042903D008290C
+S31508002B4002D100F009B8034870470000083802406F
+S31508002B500024F40000127A0010B5FFF7F5FD0C4CBE
+S31508002B6018B1B0F5800F00D16410FFF7E5FDB4FB8E
+S31508002B70F0F108480268C2F388125143006800F46D
+S31508002B804030012202EB10404000B1FBF0F010BDCE
+S31508002B900024F4000438024010B588B00C4C2068B4
+S31508002BA020F0010020604FF461400190002102915D
+S31508002BB0039104910C2005900691079101A92046DE
+S31508002BC0FFF7D8FD206840F00100206008B010BD6E
+S31508002BD0004800400549CA69C2F34012002A03D0DA
+S31508002BE0496A01700120704700207047004800407C
+S31508002BF02DE9F04180460F461B4C00251B4E607898
+S31508002C00002810D020783044401CFFF7E3FF012845
+S31508002C1019D000F0FDF86168C831884200D965709E
+S31508002C200020BDE8F0811148FFF7D4FF0128F7D14D
+S31508002C303078401E8028F3D800F0EAF860602570E6
+S31508002C4001206070ECE72078401CC2B22270307810
+S31508002C5031469042E4D1491C4046FDF792FD657025
+S31508002C60207838700120DCE7B801002064110020C4
+S31508002C7070B5094DA86200F0CBF800F10A0405E02A
+S31508002C80FDF775FD00F0C4F8A04204D8E869C0F362
+S31508002C90C0100028F4D070BD0048004070B5054645
+S31508002CA00E46812E03D9832108A0FDF78CFB3046FA
+S31508002CB0FFF7DEFF002406E0FDF759FD285DFFF764
+S31508002CC0D7FF641CA4B2B442F6D370BD2E2E5C2E78
+S31508002CD02E5C2E2E5C2E2E5C536F757263655C41DE
+S31508002CE0524D434D375F53544D333246375C7273FA
+S31508002CF03233322E630000000178407841EA002022
+S31508002D007047704710B53048016821F00F0141F04F
+S31508002D1007010160006800F00F00072803D0692149
+S31508002D202AA0FDF750FB2C48016841F44041016098
+S31508002D30016841F4803101602848016841F4802126
+S31508002D400160016841F4803101600168C1F34041C6
+S31508002D500029FAD02149224A091D0B68214C234033
+S31508002D601A430A60204A0B68204C23401A430A601B
+S31508002D70016841F0807101600168C1F34061002972
+S31508002D80FAD016480830016821F0F00101600168A0
+S31508002D9021F4E05141F4A0510160016821F4604139
+S31508002DA041F400410160016821F0030141F002018C
+S31508002DB00160016801F00C010829FAD1BDE810404C
+S31508002DC00B48FFF7D1BC0000003C02402E2E5C6D7C
+S31508002DD061696E2E630000000070004000380240F2
+S31508002DE0086C40000080BCFF086C40090080BFF0FA
+S31508002DF000E6DF0C0548016841F4700101600349EB
+S31508002E004FF00060803908607047000088ED00E0E8
+S31508002E1000B500F01FF80148006800BDAC010020AD
+S31508002E2000B500F00FF84FF0E02004494161002199
+S31508002E308161052202610248016000BDBF4B0300A3
+S31508002E40AC0100204FF0E020002101614161816161
+S31508002E50704700004FF0E0200069C00303D5024820
+S31508002E600168491C01607047AC01002010B501F0EB
+S31508002E704BFE002010BD084610B501F0C5FD002028
+S31508002E8010BD70B5054600242846812100F000FBD8
+S31508002E900121284600F0FCFA204670BD0A2101806F
+S31508002EA00048704720000020202101800048704714
+S31508002EB02C00002000487047DC01002070B505464C
+S31508002EC00024284640230222812100F0EDFB4023FE
+S31508002ED028460222012100F0E7FB044A402301218B
+S31508002EE0284600F0EDFB204670BD0000DC010020FE
+S31508002EF010B590F89C02032801D101F005FE0020C8
+S31508002F0010BD000070B517221E4C0B7813F0600335
+S31508002F100DD0402B2ED14A78012A2BD18988072932
+S31508002F2028D104F117019E2200F071F822E04B78AF
+S31508002F30062B04D00A2B11D00B2B1BD114E04B887F
+S31508002F402125B5EB132F05D10E4C0934CA88172A4B
+S31508002F5000D91722214600F05AF80BE00949012248
+S31508002F60193900F054F805E04A8812F0FF0F03D02B
+S31508002F7000F036F8002070BD0249D0B21939086051
+S31508002F80F8E700003500002010B5D0F8B822002A6E
+S31508002F9001D052689047002010BD90F89C22012A63
+S31508002FA005D0022A03D0032A01D000F019B84988AF
+S31508002FB0012904D10021C0F8A41200F035B87047E1
+S31508002FC010B513460A46002100F07AFB002010BD12
+S31508002FD010B513460A46002100F01AFC002010BD61
+S31508002FE010B504468021204600F0EFFB2046BDE8D8
+S31508002FF01040002100F0E9BB10B50521C0F8941275
+S3150800300000231A46194600F05BFB002010BD10B5D8
+S315080030100223C0F894328261C26113460A4600212F
+S3150800302000F0F6FB002010BD10B50421C0F894127C
+S3150800303000231A46194600F0EBFB002010BD10B518
+S315080030400446012084F89C02D4F8B802002803D06C
+S315080030504268204621799047D4F8CC0210B1002066
+S31508003060C4F8CC02204600F0C2FB002804D1204652
+S31508003070BDE8104000F0ACBA10BD000010B500283D
+S3150800308006D007A00A46054900F0ADF9034810BD69
+S3150800309003A00A46014900F0A6F9F7E72006002032
+S315080030A044656661756C7400122008800048704794
+S315080030B04801002010B5002806D007A00A46054991
+S315080030C000F091F9034810BD03A00A46014900F033
+S315080030D08AF9F7E72006002057696E5553422042C1
+S315080030E0756C6B20496E74657266616365000000D5
+S315080030F004200880004870474401002010B504A049
+S315080031000A46024900F06FF9004810BD2006002063
+S315080031104F70656E424C542055736572000000006E
+S3150800312010B5002806D007A00A46054900F05BF945
+S31508003130034810BD03A00A46014900F054F9F7E711
+S315080031402006002057696E5553422042756C6B2045
+S31508003150446576696365000010B51A200880FDF796
+S3150800316045FE014810BD000080010020212008808E
+S31508003170004870475C0100200A46D188012902D020
+S315080031801146FFF72DBF90F89C12012906D0022997
+S3150800319004D0032909D01146FFF722BF0021816018
+S315080031A0012200F10801FFF732BF0122011DFFF7D6
+S315080031B02EBF2DE9F84304460F460020009000264E
+S315080031C000257988080A062870D006DC01282FD041
+S315080031D0022835D0032804D148E0072867D00F28ED
+S315080031E017D039462046FFF7FBFE0125002D0ED1E4
+S315080031F0FA88002A71D0BDF8000000286ED08242F5
+S3150800320000D90246009231462046FFF700FFBDE886
+S31508003210F883D4F8B402C26922B1207C6946904783
+S315080032200646E3E739462046FFF7DAFE0125DDE7DD
+S31508003230D4F8B412207C0A68694690470646D5E752
+S31508003240207C4FF0020840B1D4F8B802C16A68463B
+S315080032508847064686F80180C8E7D4F8B802816A26
+S3150800326068468847064686F80180BFE7C8B206283A
+S3150800327062D2DFE800F0031223344352D4F8B402D2
+S31508003280426822B1207C694690470646AEE7394631
+S315080032902046FFF7A5FE0125A8E7D4F8B402826800
+S315080032A032B1207C6946904706469FE74AE058E0D7
+S315080032B039462046FFF794FE012597E7D4F8B4026D
+S315080032C0C26822B1207C6946904706468EE7394691
+S315080032D02046FFF785FE012588E758E052E0D4F836
+S315080032E0B402026922B1207C6946904706467DE70A
+S315080032F039462046FFF774FE012577E7D4F8B4026D
+S31508003300426922B1207C6946904706466EE73946EF
+S315080033102046FFF765FE012568E7D4F8B4028269FE
+S3150800332022B1207C6946904706465FE73946204623
+S31508003330FFF756FE012559E739462046FFF750FEA6
+S31508003340012553E7207C28B139462046FFF748FE79
+S3150800335001254BE7D4F8B802416B6846884706460C
+S3150800336044E7207C28B139462046FFF739FE012577
+S315080033703CE7D4F8B802016B684688470646072139
+S31508003380717033E739462046FFF72AFE3FE72046A5
+S31508003390FFF74AFE3BE7002102E0491CC9B2401C80
+S315080033A00278002AF9D1084670470A4690F89C1216
+S315080033B0012906D0022904D0032902D01146FFF7B5
+S315080033C00FBED188022902D01146FFF709BE012196
+S315080033D0C160D0F8A41209B10321C160022200F12C
+S315080033E00C01FFF714BE70B50D461646002818D016
+S315080033F004462046FFF7CFFF022101EB400030804C
+S3150800340030782870032068700220002206E02954CC
+S31508003410641C401CC0B22A54401CC0B22178002942
+S31508003420F5D170BD01460020002906D0012905D036
+S31508003430022905D0032905D00320704703207047C9
+S31508003440012070470320704730B4002814D0D0F804
+S31508003450B84200230CB1C0F8B832D0F8CC420CB14F
+S31508003460C0F8CC3209B1C0F8B412012180F89C1218
+S31508003470027030BC00F0C8B830BC0320704710B5E5
+S31508003480D0F8C402FEF7ECF9BDE81040FFF7CABF52
+S3150800349010B5D0F8C402FEF7BFF9BDE81040FFF733
+S315080034A0C1BF70B504461346002909D0D4F8B8023E
+S315080034B042691AB194F89C0203284BD0032070BDC8
+S315080034C004F11400D4F894120025022938D1D0E961
+S315080034D002218A420CD9521A826019462046FFF701
+S315080034E077FD002320461A46194600F0E9F827E03A
+S315080034F0914214D14068884211D3D4F89812884270
+S315080035000DD2002220461146FFF762FDC4F89852F4
+S3150800351000231A461946204600F0D2F810E0D4F8DF
+S31508003520B802C16829B194F89C02032801D1204643
+S3150800353088478021204600F048F92046FFF75CFDC1
+S3150800354094F8A002012809D1204600F094F984F8DD
+S31508003550A05203E0204690470028B0D1002070BD55
+S3150800356010B504461346002909D0D4F8B802826972
+S315080035701AB194F89C02032824D0032010BD04F540
+S31508003580AA70D4F89412032920D1D0E902129142E4
+S315080035900AD98A1A8260C068824200D3024619464E
+S315080035A02046FFF70DFD11E0D4F8B802016929B1EC
+S315080035B094F89C02032801D1204688472046FFF745
+S315080035C033FD03E0204690470028D7D1002010BDE0
+S315080035D010B5D0F8C402FEF7DDF8BDE81040FFF7D5
+S315080035E021BF0020704710B5012180F89C12D0F841
+S315080035F0B822002A02D0526801799047002010BDEF
+S31508003600D0F8C402FEF758B910B5017800292BD1B5
+S315080036101649C1F80004C0F8C4124FF0A04008606B
+S31508003620062048600222CA60002008618A610122D9
+S31508003630CA6108624862C86208630846FEF708FC61
+S3150800364020B10BA040F22511FCF7BDFE07488021EA
+S31508003650FEF75DF8054840220021FEF75CF80348AE
+S3150800366080220121FEF757F8002010BD1C02002019
+S315080036702E2E5C757362645F636F6E662E63000040
+S315080036800A06D0F8C40201F07F01C1EBC10100EBC4
+S31508003690810002D590F83E00704790F8FE01704709
+S315080036A0002070470020704710B514461A46D0F817
+S315080036B0C4022346FEF709F9BDE81040FFF7B2BE7B
+S315080036C010B5D0F8C402FEF72EF9BDE81040FFF792
+S315080036D0A9BE70B50446012584F89C520020C4F89A
+S315080036E094026060C4F8A402D4F8BC02002805D08D
+S315080036F0D4F8B802002142682046904700222046A6
+S3150800370040231146FFF7D0FFA4F864514026C4F8B9
+S3150800371060614023002220468021FFF7C5FFA5846B
+S315080037202662002070BD90F89C12042903D190F8F7
+S315080037309D1280F89C120020704710B590F89C12D4
+S31508003740032904D1D0F8B812C96901B18847002005
+S3150800375010BD01740020704710B5D0F8C402FEF7FA
+S3150800376021FCBDE81040FFF75DBE70B5044604F2C3
+S31508003770AA20054600F055F80120C4F89402B4F8CA
+S31508003780B002C4F8980294F8AA2212F01F000AD0D0
+S3150800379001280ED0022812D02046BDE8704002F05B
+S315080037A0800100F012B829462046BDE8704000F0B6
+S315080037B011B929462046BDE8704000F02FBA2946BF
+S315080037C02046BDE8704000F03CB910B5D0F8C402F8
+S315080037D0FEF7CAF8BDE81040FFF724BE10B5D0F8CA
+S315080037E0C402FEF7FAFBBDE81040FFF71BBE10B592
+S315080037F0D0F8C402FEF706FCBDE81040FFF712BE7B
+S3150800380000F5277001784170042101700020704787
+S3150800381010B5D0F8C402FEF7DFF8BDE81040FFF790
+S3150800382001BE70B504460846017821704178801CAF
+S31508003830617005462846FFF75FFA60802846851CB2
+S315080038402846FFF759FAA0802846801CFFF754FA45
+S31508003850E08070BD38B5044600200090002908D0E5
+S31508003860C4F8B8126846C96A8847C4F8CC0200206A
+S3150800387038BD032038BD0020704770B504468888D7
+S31508003880002821D1C888F8B9488880281CD200F0B9
+S315080038907F0594F89C0203280DD084F89E52294689
+S315080038A02046FFF759FF2046FFF7BEFB45B1022029
+S315080038B084F89C0270BD2046BDE87040FFF790BBB7
+S315080038C0012084F89C0270BD2046BDE87040FFF7D1
+S315080038D087BB03460320D3F8B822002A02D0126811
+S315080038E018461047704700002DE9F04104460E4679
+S315080038F00025324FB1783970012906D9314620465C
+S31508003900FFF76EFB0320BDE8F08194F89C020228BD
+S315080039100CD0032822D031462046FFF761FB3978C0
+S315080039202046FFF731FB03252846ECE791B1616095
+S315080039302046FFF7CEFF0546280004D0314620462C
+S31508003940FFF74EFBF0E72046FFF76EFB032084F8EF
+S315080039509C02E9E72046FFF767FBE5E74FF0020818
+S31508003960C9B16068884224D0C1B22046FFF70CFB73
+S31508003970397861602046FFF7ACFF0546280014D069
+S3150800398031462046FFF72CFB21792046FFF7FCFA43
+S3150800399084F89C82C8E784F89C8261602046FFF719
+S315080039A0F3FA2046FFF740FBBEE72046FFF73CFB4D
+S315080039B0BAE72046FFF738FBB6E700000400002008
+S315080039C04988012903D1C0F8A412FFF72DBB704717
+S315080039D0FFF704BF10B500240A7812F060020DD074
+S315080039E0202A05D0402A03D0FFF7FAFA204610BD50
+S315080039F0D0F8B822926890470446F7E74A780A2A28
+S31508003A001CD2DFE802F012181B151B08051B0F0B4A
+S31508003A10FFF7CFFBEAE7FFF730FFE7E7FFF764FFBB
+S31508003A200446E3E7FFF7A8FBE0E7FFF7BEFCDDE7A0
+S31508003A30FFF7C6FFDAE7FFF7B0FAD7E7FFF7D0FADE
+S31508003A40D4E72DE9F04104460D4600262979287861
+S31508003A5010F0600012D0202808D0402806D0294649
+S31508003A602046FFF7BDFA3046BDE8F081D4F8B80223
+S31508003A7029468268204690470646F4E76878002873
+S31508003A805ED001282FD0032804D029462046FFF708
+S31508003A90A7FAE8E794F89C02022806D0032814D06F
+S31508003AA029462046FFF79CFADDE749B1802907D069
+S31508003AB02046FFF78AFE80212046FFF786FED2E7DA
+S31508003AC029462046FFF78CFACDE7688838B931B120
+S31508003AD0802904D0E88810B92046FFF776FE2046EC
+S31508003AE0FFF7A2FABFE794F89C02022806D003283B
+S31508003AF014D029462046FFF773FAB4E749B180295E
+S31508003B0007D02046FFF761FE80212046FFF75DFEBD
+S31508003B10A9E729462046FFF763FAA4E7688800283C
+S31508003B20A1D1480602D02046FFF7A9FC2046FFF798
+S31508003B307BFAD4F8B802294682682046904792E76D
+S31508003B4094F89C020027022806D0032824D0294688
+S31508003B502046FFF745FA86E731B1802904D0294681
+S31508003B602046FFF73DFA7EE7080607D501F07F00F5
+S31508003B7000EB800004EB8001143107E001F07F00C0
+S31508003B8000EB800004EB800101F5AA710F600222A8
+S31508003B902046FFF73CFA66E708060CD501F00F0049
+S31508003BA000EB800004EB8000808C68B9294620462B
+S31508003BB0FFF716FA57E701F00F0000EB800004EB59
+S31508003BC08000B0F8640148B108060CD501F07F0002
+S31508003BD000EB800004EB800514350CE029462046EE
+S31508003BE0FFF7FEF93FE701F07F0000EB800004EBEA
+S31508003BF0800505F5AA7541B1802906D02046FFF74C
+S31508003C003FFD20B10120286002E02F6000E02F6010
+S31508003C10022229462046FFF7FAF924E770B5064638
+S31508003C200C460025207810F0600209D0202A07D01B
+S31508003C30402A05D021463046FFF7D2F9284670BDFE
+S31508003C4096F89C22012A08D0022A06D0032A04D014
+S31508003C5021463046FFF7C4F9F0E7207901280FD846
+S31508003C60D6F8B80221468268304690470546E0886D
+S31508003C700028E3D1002DE1D13046FFF7D5F9DDE77D
+S31508003C8021463046FFF7ACF9D8E7000070B50A7848
+S31508003C9001234E7802F00F041C4DA340012E19D0C3
+S31508003CA0D0F81C4844EA0343C0F81C3800EB42101D
+S31508003CB0D0F8002B12040BD4D0F8002B0B89C97846
+S31508003CC0C3F30A031A4345EA81410A43C0F8002BA5
+S31508003CD0002070BDD0F81C489BB21C43C0F81C4895
+S31508003CE000EB4210D0F800391B04F1D4D0F80039A3
+S31508003CF00C89C978C4F30A048904234341EA82512A
+S31508003D000B432B43C0F80039E2E70000008000109F
+S31508003D10D0F800196FF30A01C0F80019D0F8041892
+S31508003D2041F48071C0F80418002070470FB410B52C
+S31508003D3004460898012818D0E06840F04000E06082
+S31508003D40204600F02BF8A16B41F48031A163069957
+S31508003D50012907D1A16841F00601A160A16841F0D7
+S31508003D602001A16010BC5DF814FBA06B20F4803024
+S31508003D70A063E06808490840E060E06820F4401065
+S31508003D80E0600F98012803D1E06840F48010E060F5
+S31508003D90204600F003F8DAE7BFFFBDFF00210C4A12
+S31508003DA0491C914201D9032070470369002BF7DAB1
+S31508003DB00021036943F001030361491C914201D9BB
+S31508003DC0032070470369DB07F7D10020704700001E
+S31508003DD0400D030070B50A7801254B78012B00EBDE
+S31508003DE042122BD0D2F8003B002B0BDAD2F8003B5C
+S31508003DF043F00063C2F8003BD2F8003B43F080432F
+S31508003E00C2F8003B00F61C00046A0B7803F00F06A4
+S31508003E1005FA06F324EA034404620468097801F003
+S31508003E200F0105FA01F324EA03410160D2F8000BF9
+S31508003E3018490840C2F8000B002070BDD2F80039B6
+S31508003E40002B0BDAD2F8003943F00063C2F80039C8
+S31508003E50D2F8003943F08043C2F8003900F61C0056
+S31508003E60046A0B7803F00F0605FA06F39EB2B4430C
+S31508003E7004620468097801F00F0105FA01F399B2A2
+S31508003E808C430460D2F8000903490840C2F80009C7
+S31508003E90D2E700000078F3EF007833EC10B5D0F8DD
+S31508003EA0041821F00201C0F804180320FDF73EFAB1
+S31508003EB0002010BD10B5D0F8041841F00201C0F872
+S31508003EC004180320FDF732FA002010BD0FB4F0B530
+S31508003ED0044600260020002504EB8001C1F80451A1
+S31508003EE0401C0F28F8D3109860B3A06B40F400115B
+S31508003EF0A163C4F8005ED4F80018C4F800180B983B
+S31508003F00012832D00B9803283BD00321204600F025
+S31508003F1049FB1021204600F0BDFA00B101262046D3
+S31508003F2000F0A8FA00B10126C4F81058C4F81458CD
+S31508003F30C4F81C5800204FF000624FF67F374FF048
+S31508003F4090433FE0D4F8040840F00201C4F804188E
+S31508003F50A06B20F40011A163206840F040012160A5
+S31508003F60206840F080012160C3E7089820B101214C
+S31508003F70204600F017FBCCE70021204600F012FB94
+S31508003F80C7E7089820B10121204600F00BFBC0E7DF
+S31508003F900021204600F006FBBBE704EB4011D1F8F0
+S31508003FA000C9BCF1000F06DA10B1C1F8003904E007
+S31508003FB0C4F8002901E0C1F80059C1F81059C1F840
+S31508003FC00879401C06998142E7D8002014E004EBE2
+S31508003FD04011D1F800CBBCF1000F06DA10B1C1F8D8
+S31508003FE0003B04E0C4F8002B01E0C1F8005BC1F80F
+S31508003FF0105BC1F8087B401C06998142E7D8D4F8C3
+S31508004000100820F48071C4F81018A5616FF080407C
+S315080040106061099818B9A06940F01000A061A0690C
+S3150800402009490843A0610C9818B1A06940F0080036
+S31508004030A0611098012803D1A06904490843A0612A
+S315080040403046F0BC5DF814FB00383C8004000040A4
+S31508004050816821F0010181600020704770B50C78F5
+S315080040600B784E78414D012E00EB43131FD0D3F841
+S31508004070100B6FF31200C3F8100BD3F8100B28407F
+S31508004080C3F8100B486908B188684861D3F8100B63
+S3150800409040F40020C3F8100BD3F8100B8C68C4F357
+S315080040A012042043C3F8100B012A53D056E04E6978
+S315080040B096B3D3F810696FF31206C3F81069D3F8EC
+S315080040C010692E40C3F810694E698D68AE4200D952
+S315080040D04D6103F511631D6845F400251D601D68D3
+S315080040E04E69C6F3120635431D60012A23D000EB3C
+S315080040F04412D2F8003943F00443C2F800394A6939
+S315080041003AB3D0F83428097801F00F030121994011
+S315080041100A43C0F8342827E0FFE703F511631E6851
+S315080041202E401E601D6845F400251D601D686FF34E
+S3150800413012051D60D9E7096919B100EB4412C2F8E6
+S31508004140141900EB4410D0F8001941F00441C0F8E6
+S31508004150001909E0C86808B1C3F8140BD3F8000BB6
+S3150800416040F00440C3F8000B002070BDFFFF07E0D5
+S3150800417010B5036C124CA34205D9D0F8003B002BAE
+S3150800418001DA002010BD00F53160002303600368E2
+S3150800419043F400230360036843F0180303600368CD
+S315080041A043F0C0430360A0F53160012906D100F54C
+S315080041B030604261016841F080210160002010BD35
+S315080041C00A30544F0B784A78012A00EB43100BD07B
+S315080041D0D0F8002B22F40012C0F8002BC978032966
+S315080041E014D0022912D017E0D0F8002922F40012C0
+S315080041F0C0F80029C978032901D002290CD1D0F8C2
+S31508004200001941F08051C0F8001905E0D0F8001BEC
+S3150800421041F08051C0F8001B002070470A784B789F
+S315080042200978012B00EB411012D0D0F8001B0029A9
+S3150800423006DB2AB1D0F8001B21F08041C0F8001B2C
+S31508004240D0F8001B41F40011C0F8001B002070478D
+S31508004250D0F80019002906DB2AB1D0F8001921F098
+S315080042608041C0F80019D0F8001941F40011C0F8CF
+S315080042700019EBE7F8B50C786FF060460B784F78C5
+S31508004280784D012F00EB431326D0D3F8104B6FF36C
+S315080042901204C3F8104BD3F8104B2C40C3F8104B3C
+S315080042A04C69002C7ED08D682C44641EB4FBF5F452
+S315080042B0A4B2D3F8105B06EAC4463543C3F8105BCC
+S315080042C0D3F8105B8E686643C6F312042543C3F819
+S315080042D0105B012A67D0A9E04F69FFB103F51163A6
+S315080042E01F686FF312071F601F682F401F604F6912
+S315080042F08D682F447F1EB7FBF5F506EAC5451E688F
+S3150800430035431D601D684E69C6F3120635431D60A8
+S31508004310A3F51163CD78012D0ED017E003F51163CF
+S315080043201E682E401E601D6845F400251D601D6828
+S315080043306FF312051D6009E003F511631D6825F08A
+S31508004340C0451D601D6845F000551D60012A17D03F
+S3150800435000EB4413D3F8004944F00444C3F8004979
+S31508004360CC78012C36D04A699AB3D0F83428097823
+S3150800437001F00F03012199400A43C0F834286FE081
+S315080043800A691AB100EB4413C3F81429C97801293C
+S3150800439017D1D0F80818C9050BD400EB4411D1F889
+S315080043A0002901E02FE03DE042F00052C1F8002963
+S315080043B007E000EB4411D1F8002942F08052C1F819
+S315080043C0002900EB4410D0F8001941F00441C0F868
+S315080043D0001945E0D0F80848E40506D4D3F80049A2
+S315080043E044F00054C3F8004905E0D3F8004944F006
+S315080043F08054C3F8004900928A8A93B20A78C96839
+S3150800440000F073F92CE0D3F8104B8D68C5F312054C
+S315080044102C43C3F8104BD3F8104B44F40024C3F8CC
+S31508004420104B56E7CA680AB1C3F8142BC978012994
+S3150800443010D1D0F80808C00506D4D3F8000B40F010
+S315080044400050C3F8000B05E0D3F8000B40F080508D
+S31508004450C3F8000BD3F8000B40F00440C3F8000B78
+S315080044600020F8BDFFFF07E0816841F00101816087
+S3150800447000207047002110220261054A491C91421A
+S3150800448001D9032070470369DB06F7D4002070477B
+S31508004490400D03000022202343EA811101610549EA
+S315080044A0521C8A4201D90320704703699B06F7D438
+S315080044B000207047400D0300D0F8080800F00600F9
+S315080044C0002805D0022805D0062803D00F207047FB
+S315080044D00020704702207047406900F001007047CD
+S315080044E0D0F81818D0F81C08084080B27047D0F8E1
+S315080044F01818D0F81C080840000C704710B5D0F8FA
+S315080045001038D0F8342801F00F04E24002F0010216
+S3150800451043EAC21200EB4110D0F80809104010BD5A
+S3150800452000EB4111D1F8081BD0F814080840704771
+S3150800453041698069084070470346084610B5D21C91
+S315080045409208002103F5805302E01C6810C0491C3C
+S315080045509142FAD310BD10B5C26822F0C042C260BB
+S31508004560012902D031B1012010BDC16841F00051C6
+S31508004570C16003E0C16841F08041C1603220FCF7A8
+S31508004580D5FE002010BD00F50060026822F4FE6228
+S31508004590026002684FF4FE6303EA01110A430260EF
+S315080045A000207047D0F800280A43C0F800280020E9
+S315080045B070470000022A0ED082B30921C26822F48D
+S315080045C07052C260C2684FF4705303EA81210A43ED
+S315080045D0C26000207047224A224B0A449A4201D2FE
+S315080045E00F21EBE7204A214B0A449A4201D20E21B9
+S315080045F0E4E71F4A1F4B0A449A4201D20D21DDE720
+S315080046001D4A1E4B0A449A4201D20C21D6E71C4A7F
+S315080046101C4B0A449A4202D20B21CFE71DE01A4AE4
+S315080046201A4B0A449A4201D20A21C7E7184A194B7B
+S315080046300A449A4201D20921C0E7174A174B0A448D
+S315080046409A4201D20821B9E7154A1144154A9142FE
+S3150800465001D20721B2E70621B0E70921AEE700003B
+S31508004660405327FF00350C00401E1BFF40420F0039
+S3150800467000DC0BFF804F1200808CF9FE20D6130059
+S3150800468060B6E5FE60E3160000D3CEFE40771B0059
+S31508004690C05BB3FEC091210000CA91FE20753800A8
+S315080046A0E05459FEE09C410010B5044600214FF63F
+S315080046B07F3304EB4112C2F80839C2F8083B491C9B
+S315080046C00F29F6D30020C4F81008C4F81408C4F853
+S315080046D01C082046FFF7CEFE002805D12046BDE877
+S315080046E010401021FFF7D6BE10BD10B5029C002C55
+S315080046F00CD1DB1C9C08002300EB023000F580502F
+S3150800470002E004C902605B1CA342FAD3002010BD74
+S315080047107047704710B5094B5A68002A0CD054697F
+S315080047205C6011749060D060002353741060084474
+S31508004730401E5060907C10BDFF2010BDB0010020C7
+S31508004740094800F1180200218174426118301832B4
+S31508004750491CC9B20029F7D0817400214161034977
+S315080047600148486070470000E00D0020B0010020B5
+S3150800477070B504460D46022C04D30FA04FF4F17110
+S31508004780FBF721FE164B04EB440203EBC200417C07
+S3150800479081B1816809782970417C491E4174816814
+S315080047A0491C81604468A14202D953F832108160DD
+S315080047B0012070BD002070BD2E2E5C2E2E5C2E2E84
+S315080047C05C2E2E5C536F757263655C41524D434D8A
+S315080047D0375F53544D333246375C7573622E630028
+S315080047E0E00D002010B50446022C04D305A040F2C3
+S315080047F00221FBF7E8FD0D4904EB440001EBC0007C
+S31508004800407C10BD2E2E5C2E2E5C2E2E5C2E2E5C31
+S31508004810536F757263655C41524D434D375F535410
+S315080048204D333246375C7573622E6300E00D002007
+S3150800483070B504460D46022C04D34FF4E0710FA060
+S31508004840FBF7C1FD174B04EB440203EBC200417CA6
+S31508004850047CA14201D1002070BDC1680D70417C65
+S31508004860491C4174C168491CC1604468A14202D907
+S3150800487053F83210C160012070BD00002E2E5C2E48
+S315080048802E5C2E2E5C2E2E5C536F757263655C4112
+S31508004890524D434D375F53544D333246375C75732B
+S315080048A0622E6300E00D002010B50648D0F8C40259
+S315080048B0FCF795FF0348FEF7C2FBBDE81040002051
+S315080048C0FFF726BF940E002070B5FFF739FF1D4C81
+S315080048D04021601CFFF71EFF207004F141054021AE
+S315080048E0681CFFF717FF28702178FF2901D0FF28D9
+S315080048F003D1842114A0FBF766FD124800221C4947
+S315080049008430FEF7A1FD0F481A498430FEF7A2FF4E
+S315080049100120FFF7FDFE0B488430FFF759F80948D8
+S315080049208430D0F8C402FCF748FFFBF76BFD4FF460
+S31508004930FA61884204D2BDE870400846FBF780BD9C
+S3150800494070BD0000100E00202E2E5C2E2E5C2E2E22
+S315080049505C2E2E5C536F757263655C41524D434DF8
+S31508004960375F53544D333246375C7573622E630096
+S3150800497024010020EC000020704700000146024890
+S315080049800078FFF7F5BE0000510E00202DE9F04132
+S3150800499080460F461948D0F8C402FDF73EF8184C71
+S315080049A00026184D607838B120782844401CFFF757
+S315080049B0E5FF01280DD01EE01248FFF7DFFF0128AA
+S315080049C019D12878401E3E2815D801206070267017
+S315080049D011E02078401CC2B22270287829469042FD
+S315080049E009D1491C4046FBF7CCFE66702078387022
+S315080049F00120BDE8F0810020FBE70000940E0020AE
+S31508004A00B0010020600D00202DE9F0410446FEF7B4
+S31508004A1051FA064611482146FEF7F2FD85B20024F2
+S31508004A200E4F4FF4B478433F0BE0315D3878FFF70B
+S31508004A30FFFE012803D00AA04146FBF7C4FC641C0C
+S31508004A40A4B2AC42F1D3FEF735FABDE8F0414023F3
+S31508004A50024602480121FEF733BE0000940E0020EC
+S31508004A602E2E5C2E2E5C2E2E5C2E2E5C536F7572AF
+S31508004A7063655C41524D434D375F53544D3332465F
+S31508004A80375C7573622E6300014602480078FFF7AB
+S31508004A90CFBE0000100E002070B505460E463F2E0C
+S31508004AA003D9B9210EA0FBF78EFC3046FFF7ECFFC1
+S31508004AB0012803D0BD210AA0FBF785FC00240CE0E1
+S31508004AC0FBF755FE285DFFF7DFFF012803D0C62157
+S31508004AD003A0FBF778FC641CA4B2B442F0D370BD03
+S31508004AE02E2E5C2E2E5C2E2E5C2E2E5C536F75722F
+S31508004AF063655C41524D434D375F53544D333246DF
+S31508004B00375C7573622E63002DE9F843154E3078CD
+S31508004B10FFF768FE0546280021D0402D00D940251C
+S31508004B200024104F4FF4A378703F0EE030786946A2
+S31508004B30FFF71EFE012803D00BA04146FBF743FCF6
+S31508004B409DF800003855641CE4B2AC42EED3054A21
+S31508004B5081212B46703A02F1F400FEF759FEBDE8B2
+S31508004B60F8830000100E00202E2E5C2E2E5C2E2EB2
+S31508004B705C2E2E5C536F757263655C41524D434DD6
+S31508004B80375F53544D333246375C7573622E630074
+S31508004B9038B500250095FF210A4C2170001D00F04C
+S31508004BA06FF90146D4F888006A4600F055F9607036
+S31508004BB0211D009800F012FAA570E5700820A4F8E7
+S31508004BC0860038BDA408002070B500F0F5F90E4C33
+S31508004BD0012584F88150FF20207000201021617083
+S31508004BE0A070FBF72BFDE070FBF73EFD2071FBF78D
+S31508004BF03BFD000A6071A571E5710820A4F88600DE
+S31508004C00BDE87040FDF77EBEA408002010B5064C2E
+S31508004C10002084F8810000F0CFF9FF2020700120E1
+S31508004C20A4F8860010BD0000A408002010B5094CA1
+S31508004C30FF2020700848C4F8880000206070A07023
+S31508004C40E0700720211D00F0C9F90820A4F88600A5
+S31508004C5010BD0000A4080020425000080748FF21A4
+S31508004C6001700021417090F882208270C170017134
+S31508004C7041710621A0F8861070470000A40800209C
+S31508004C8070B50446FBF7DAFC6178801E884204DAC0
+S31508004C90BDE87040222000F097B9114DFF2028701A
+S31508004CA00120A5F88600617859B1D5F88800A21CBC
+S31508004CB0FDF72CFE70B155F8880F61780844286016
+S31508004CC070BDFDF711FE0028FAD1BDE8704031200D
+S31508004CD000F07AB9BDE87040312000F075B90000DF
+S31508004CE0A408002070B50B4DD5F88840001D00F0CB
+S31508004CF0C7F801462046FDF701FE28B1FF202870B7
+S31508004D000120A5F8860070BDBDE87040312000F08E
+S31508004D105BB90000A408002070B50546FBF78EFCB9
+S31508004D200C4C411E6A1CD4F88800FDF7EFFD60B1F3
+S31508004D304834FF2004F8480CFBF780FC216C401E21
+S31508004D40084420640120E08770BDBDE8704031202A
+S31508004D5000F03AB9A4080020312000F035B9000067
+S31508004D6010B5FBF71DFD0348FF2101700121A0F8CE
+S31508004D70861010BDA408002070B5084CFF202070CE
+S31508004D8000256570A570FBF759FCE0702571657103
+S31508004D90A5710720A4F8860070BD0000A4080020AD
+S31508004DA010B5064CFF212170001D00F069F8C4F803
+S31508004DB088000120A4F8860010BD0000A408002081
+S31508004DC070B50446FBF73AFC6178401E884204DA5F
+S31508004DD0BDE87040222000F0F7B8201D00F050F81A
+S31508004DE00A4DC5F8880062786B1C01461846FBF721
+S31508004DF0C8FCFF20483505F8480C6178286C08443B
+S31508004E0028646078401CE88770BD0000A40800206C
+S31508004E10002000F0D9B8000070B50546FBF70EFC77
+S31508004E206A78401E904204DABDE87040222000F0FD
+S31508004E30CBB8084C601C4834216CFBF7A2FCFF2059
+S31508004E4004F8480C6978206C084420646878401C8B
+S31508004E50E08770BDA40800202DE9F04104460E46FF
+S31508004E601746002505E014F8010B2844C5B2FBF7E0
+S31508004E707EFC761E701CF6D13D600120BDE8F081EF
+S31508004E800178427841EA0221827841EA0241C078F3
+S31508004E9041EA006070470000054800210170C0F82B
+S31508004EA00710C170A0F805108170417070470000A6
+S31508004EB025090020044890F88100002801D0012027
+S31508004EC07047002070470000A408002010B501783C
+S31508004ED0344CFF2910D094F88120012A60D1F42996
+S31508004EE021D013DCD02936D009DCC92930D0CC2909
+S31508004EF03DD0CF293ED137E0FFF766FE3DE0D12908
+S31508004F002FD0D2292AD0F32934D112E0F5390A292B
+S31508004F1030D2DFE801F0050B2F2F2F112F14171AA7
+S31508004F20FFF77AFF29E0FFF74BFF26E0FFF738FF88
+S31508004F3023E0FFF72DFE20E0FFF778FE1DE0FFF7E0
+S31508004F4067FF1AE0FFF78AFE17E0FFF75FFE14E037
+S31508004F50FFF7E2FE11E0FFF793FE0EE0FFF70CFF06
+S31508004F600BE0FFF7BFFE08E0FFF7FAFE05E0FFF7E4
+S31508004F70F3FE02E0202000F027F894F884000128C8
+S31508004F8002D1102000F020F8B4F98610002907DDB8
+S31508004F90012084F88400BDE81040024800F026B8D5
+S31508004FA010BD0000A40800200249002081F88400F2
+S31508004FB070470000A40800200249002081F88200FA
+S31508004FC070470000A40800200349FE220A704870B2
+S31508004FD00220A1F886007047A40800200870020A7B
+S31508004FE04A70020C8A70000EC870704789B2FBF7C7
+S31508004FF09BBB0907090E002804DB00F1E02080F8B6
+S315080050000014704700F00F0000F1E02080F8141D2E
+S315080050107047FDF749F8FBF719FAFBF726FAFCE79C
+S315080050204FF04070E1EE100A7047000000000000E3
+S315080050300000010203040607080900000000010237
+S3150800504003044F70656E424C5400050206020603BF
+S3150800505007030803090309040A040B040C040C05D6
+S315080050600D050E050F050F0610061007100800009F
+S315080050700080000800800000010000000000010810
+S315080050800080000002000000008001080080000087
+S3150800509003000000000002080000020004000000EF
+S315080050A000000408000004000500000000000808CD
+S315080050B0000004000600000000000C0800000400C0
+S315080050C007000000E450000800000020C0010000AE
+S315080050D004020008FC510008C001002088160000E0
+S315080050E060020008115324F432010213102C0A0638
+S315080050F0101B2A40051409022013010125C0320994
+S31508005100043302FF1607058102402DFF0705010734
+S31508005110520A1403069E12141203A757494E5553F2
+S315080051204212801A0466122812441265127612690F
+S315080051301A63081249126E1A7408127212663A61D4
+S315080051401212471A55163244124E127B1238123072
+S3150800515012373A390212431233122D12451A340401
+S315080051601A300A1A340612451A410A12381A310434
+S315080051703A38141A38141238123512321A420612EC
+S31508005180343A460A527D13BD2E1B08830413052F95
+S3150800519082081A6D101A77041AF104C15AA9101A4E
+S315080051A09D081BA9302019041AFD041321311B0878
+S315080051B059041A7D0C1AB5041A6D0C300904030932
+S315080051C004120101021640501DAC60190C2303019C
+S315080051D014050F2115011C10052011DF60DDD88983
+S315080051E045C74C9CD2659D9E648A9F1403069E19EA
+S311080051F0222103261A03021704000000FF
S705080001C928
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h
index 13647fbd2..79c4ef8cf 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c
index 344676bb5..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,10 +69,11 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
-#define USB_SIZ_BOS_DESC 0x0C
+#define USB_SIZ_BOS_DESC 0x21
/* USER CODE BEGIN PRIVATE_DEFINES */
@@ -123,9 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
/**
* @}
@@ -145,7 +147,7 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
, USBD_FS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};
@@ -158,13 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
-#if (USBD_LPM_ENABLED == 1)
- 0x01, /*bcdUSB */ /* changed to USB version 2.01
- in order to support LPM L1 suspend
- resume test of USBCV3.0*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
#else
0x00, /*bcdUSB */
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -174,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -184,27 +185,36 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
/* USB_DeviceDescriptor */
/** BOS descriptor. */
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
#if defined ( __ICCARM__ ) /* IAR Compiler */
#pragma data_alignment=4
#endif /* defined ( __ICCARM__ ) */
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
- 0x5,
- USB_DESC_TYPE_BOS,
- 0xC,
- 0x0,
- 0x1, /* 1 device capability*/
- /* device capability*/
- 0x7,
- USB_DEVICE_CAPABITY_TYPE,
- 0x2,
- 0x2, /* LPM capability bit set*/
- 0x0,
- 0x0,
- 0x0
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
};
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -367,7 +377,7 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
-#if (USBD_LPM_ENABLED == 1)
+#if (USBD_WINUSB_ENABLED == 1)
/**
* @brief Return the BOS descriptor
* @param speed : Current device speed
@@ -380,7 +390,7 @@ uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
*length = sizeof(USBD_FS_BOSDesc);
return (uint8_t*)USBD_FS_BOSDesc;
}
-#endif /* (USBD_LPM_ENABLED == 1) */
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @brief Create the serial number string descriptor
diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/.settings/language.settings.xml b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/.settings/language.settings.xml
index 645d4ac05..bc71c3182 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/.settings/language.settings.xml
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/.settings/language.settings.xml
@@ -5,8 +5,7 @@
-
-
+
@@ -17,11 +16,10 @@
-
-
+
-
+
\ No newline at end of file
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Boot Debug.launch b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Boot Debug.launch
index fd03dabd8..f396892fd 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Boot Debug.launch
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Boot Debug.launch
@@ -1,73 +1,73 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Debug/openblt_stm32h743.srec b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Debug/openblt_stm32h743.srec
index 842a6ed56..3608bdfb7 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Debug/openblt_stm32h743.srec
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/Debug/openblt_stm32h743.srec
@@ -1,1629 +1,1667 @@
S01900006F70656E626C745F73746D3332683734332E73726563F9
-S315080000000000082485090008990800089B080008CC
-S315080000109D0800089F080008A108000800000000C5
-S31508000020000000000000000000000000A30800080F
-S31508000030A508000800000000A7080008A90800088D
-S31508000040D5090008D5090008D5090008D50900080A
-S31508000050D5090008D5090008D5090008D5090008FA
-S31508000060D5090008D5090008D5090008D5090008EA
-S31508000070D5090008D5090008D5090008D5090008DA
-S31508000080D5090008D5090008D5090008D5090008CA
-S31508000090D5090008D5090008D5090008D5090008BA
-S315080000A0D5090008D5090008D5090008D5090008AA
-S315080000B0D5090008D5090008D5090008D50900089A
-S315080000C0D5090008D5090008D5090008D50900088A
-S315080000D0D5090008D5090008D5090008D50900087A
-S315080000E0D5090008D509000800000000D509000850
-S315080000F0D5090008D5090008D5090008D50900085A
-S31508000100D5090008D5090008D5090008D509000849
-S31508000110D5090008D5090008D5090008D509000839
-S31508000120D5090008D5090008D5090008D509000829
-S31508000130D5090008D5090008D5090008D509000819
+S31508000000000008248D090008A1080008A3080008B4
+S31508000010A5080008A7080008A908000800000000AD
+S31508000020000000000000000000000000AB08000807
+S31508000030AD08000800000000AF080008B108000875
+S31508000040DD090008DD090008DD090008DD090008EA
+S31508000050DD090008DD090008DD090008DD090008DA
+S31508000060DD090008DD090008DD090008DD090008CA
+S31508000070DD090008DD090008DD090008DD090008BA
+S31508000080DD090008DD090008DD090008DD090008AA
+S31508000090DD090008DD090008DD090008DD0900089A
+S315080000A0DD090008DD090008DD090008DD0900088A
+S315080000B0DD090008DD090008DD090008DD0900087A
+S315080000C0DD090008DD090008DD090008DD0900086A
+S315080000D0DD090008DD090008DD090008DD0900085A
+S315080000E0DD090008DD09000800000000DD09000838
+S315080000F0DD090008DD090008DD090008DD0900083A
+S31508000100DD090008DD090008DD090008DD09000829
+S31508000110DD090008DD090008DD090008DD09000819
+S31508000120DD090008DD090008DD090008DD09000809
+S31508000130DD090008DD090008DD090008DD090008F9
S3150800014000000000000000000000000000000000A1
-S31508000150D5090008D5090008D5090008D5090008F9
-S31508000160D5090008D5090008D5090008D5090008E9
-S31508000170D5090008D5090008D509000800000000BF
-S31508000180D5090008D5090008D5090008D5090008C9
-S31508000190D5090008D5090008D5090008D5090008B9
-S315080001A0D5090008D5090008D5090008D5090008A9
-S315080001B0D5090008D5090008D5090008D509000899
-S315080001C0D5090008D5090008D5090008D509000889
-S315080001D0D5090008D5090008D5090008D509000879
-S315080001E0D5090008D5090008D5090008D509000869
-S315080001F0D5090008D5090008D5090008D509000859
-S31508000200D5090008D5090008D5090008D509000848
-S31508000210D5090008D5090008D5090008D509000838
-S31508000220D5090008D5090008D5090008000000000E
-S31508000230D5090008D509000800000000D5090008FE
-S31508000240D5090008D5090008D5090008D509000808
-S31508000250D5090008D5090008D5090008D5090008F8
-S31508000260D5090008D5090008D5090008D5090008E8
-S31508000270D5090008D5090008D509000800000000BE
-S31508000280D5090008D5090008D509000800000000AE
-S30D0800029000000000D509000872
+S31508000150DD090008DD090008DD090008DD090008D9
+S31508000160DD090008DD090008DD090008DD090008C9
+S31508000170DD090008DD090008DD09000800000000A7
+S31508000180DD090008DD090008DD090008DD090008A9
+S31508000190DD090008DD090008DD090008DD09000899
+S315080001A0DD090008DD090008DD090008DD09000889
+S315080001B0DD090008DD090008DD090008DD09000879
+S315080001C0DD090008DD090008DD090008DD09000869
+S315080001D0DD090008DD090008DD090008DD09000859
+S315080001E0DD090008DD090008DD090008DD09000849
+S315080001F0DD090008DD090008DD090008DD09000839
+S31508000200DD090008DD090008DD090008DD09000828
+S31508000210DD090008DD090008DD090008DD09000818
+S31508000220DD090008DD090008DD09000800000000F6
+S31508000230DD090008DD09000800000000DD090008E6
+S31508000240DD090008DD090008DD090008DD090008E8
+S31508000250DD090008DD090008DD090008DD090008D8
+S31508000260DD090008DD090008DD090008DD090008C8
+S31508000270DD090008DD090008DD09000800000000A6
+S31508000280DD090008DD090008DD0900080000000096
+S30D0800029000000000DD0900086A
S3150800029810B5054C237833B9044B13B10448AFF3AA
-S315080002A800800123237010BDC80000240000000048
-S315080002B8F061000808B5034B1BB103490348AFF3BF
-S315080002C8008008BD00000000CC000024F06100088A
-S315080002D808B505F051FA08BD08B505F05BFA08BD7A
-S315080002E808B5054B1B6913F4005F01D0002008BD4B
-S315080002F800F03EF80120FAE70008025808B564201D
+S315080002A800800123237010BD90010024000000007F
+S315080002B80063000808B5034B1BB103490348AFF3AD
+S315080002C8008008BD000000009401002400630008AF
+S315080002D808B505F075FA08BD08B505F07FFA08BD32
+S315080002E808B5054B1B6913F4005F03D100F040F805
+S315080002F8012008BD0020FCE70008025808B564205C
S3150800030800F008F808BD08B500F00AF808BD7047F7
-S3150800031870477047014B1880704700BFE4000024F7
-S3150800032808B504F0E9FF0E4B1B6898420FD30D4B2E
+S3150800031870477047014B1880704700BFAC0100242E
+S3150800032808B505F001F80E4B1B6898420FD30D4B1C
S315080003381B786BB90B4B01221A700B4B80229A61FA
-S3150800034804F0DAFF094B1B881844054B186008BDEA
+S3150800034804F0F2FF094B1B880344054A136008BDED
S31508000358044B00221A70044B4FF400029A61EFE727
-S31508000368E8000024E600002400040258E4000024FB
+S31508000368B0010024AE01002400040258AC010024A0
S31508000378024B4FF400029A61704700BF0004025806
-S3150800038870B58CB000240794089409940A940B94C1
-S315080003982B4BD3F8E02042F00402C3F8E020D3F848
-S315080003A8E02002F004020592059AD3F8E02042F00C
-S315080003B88002C3F8E020D3F8E02002F08002049215
-S315080003C8049AD3F8E02042F00802C3F8E020D3F8EC
-S315080003D8E02002F008020392039AD3F8E02042F0DC
-S315080003E80102C3F8E020D3F8E02002F001020292E5
-S315080003F8029AD3F8E02042F00202C3F8E020D3F8C4
-S31508000408E03003F002030193019B0E4E4FF40003FC
-S31508000418B3610CAD4FF4005345F8183D29460A4810
-S3150800042802F026FC8023069301230793089409946F
-S315080004380A942946304602F01BFC0CB070BD00BF72
-S3150800044800440258000402580008025810B590B033
-S31508000458202200210DEB020005F0BDFE00240494BD
-S31508000468059406942B4BD3F8E82042F48022C3F867
-S31508000478E820D3F8E82002F480220192019AD3F8FA
-S31508000488E02042F00802C3F8E020D3F8E03003F091
-S3150800049808030093009B4FF44073029302230393C7
-S315080004A80723079302A91C4802F0E2FB08944FF4B5
-S315080004B8E13309930A940B940C940C230D930E9428
-S315080004C80F94164C08A9204602F07AFFA36823F071
-S315080004D86043A360A36823F06063A360236823F0DE
-S315080004E800532360636823F490436360A36823F08A
-S315080004F82A03A360236843F001032360074BDB69DB
-S3150800050813F4001FFAD0054BDB6913F4800FF5D0F6
-S3150800051810B010BD00440258000C025800480040AC
-S3150800052810B5564A136823F00F0343F00403136003
-S31508000538524B1B6803F00F03042BF9D1504AD368B2
-S3150800054823F0070343F00203D360936943F4404357
-S3150800055893614C4B1A6842F480221A601A6842F46E
-S3150800056880321A60474B1B6813F4003FFAD0454B94
-S315080005789A6A22F0030242F002029A62DA6A42F49E
-S315080005888032DA62DA6A42F40032DA62DA6A22F029
-S315080005980C0242F00402DA62DA6A22F00202DA622D
-S315080005A89A6A22F47C7242F040029A621A6B3649B9
-S315080005B8114040F2DF120A431A631A6B22F47E428C
-S315080005C842F400721A631A6B22F4FE0242F4981275
-S315080005D81A631A6B22F0FE4242F080721A631A688E
-S315080005E842F080721A60274B1B6813F0007FFAD016
-S315080005F8244CA36923F00F0343F00803A361236976
-S3150800060823F0070343F003032361A36923F4706304
-S31508000618A361A36923F00F0343F00803A361E36901
-S3150800062823F0700343F04003E361E36923F4E063CE
-S3150800063843F48063E361A36923F0700343F040033E
-S31508000648A361236A23F0700343F0400323620F482B
-S3150800065803F0F4FC002000F0FDF90D4A136823F0B6
-S3150800066807031360236D23F040532365636D23F452
-S31508000678401343F48013636510BD00BF0020005281
-S31508000688004802580044025800FEFFFF00389C1C28
-S315080006985444025808B500F005FAFFF741FFFFF77A
-S315080006A86FFEFFF7D3FEFFF713FEFFF715FEFCE70D
-S315080006B882B0074BD3F8F42042F00202C3F8F420BC
-S315080006C8D3F8F43003F002030193019B02B0704794
-S315080006D80044025800B589B0002303930493059390
-S315080006E8069307930268154B9A4202D009B05DF83B
-S315080006F804FB134BD3F8EC2042F48072C3F8EC20C1
-S31508000708D3F8EC2002F480720192019AD3F8E0201B
-S3150800071842F00202C3F8E020D3F8E03003F00203FF
-S315080007280293029B4FF4407303930223049309230D
-S31508000738079303A9034801F0B7F8D7E700A00040D4
-S31508000748004402580004025810B588B000230393E1
-S3150800075804930593069307930268154B9A4201D0AA
-S3150800076808B010BD134CD4F8E03043F00103C4F8C0
-S31508000778E030D4F8E03003F001030193019B4FF40D
-S31508000788C0530393022304930A23079303A90A4829
-S3150800079801F08AF8D4F8D83043F00063C4F8D830A2
-S315080007A8D4F8D83003F000630293029BD8E700BF59
-S315080007B800000840004402580000025808B50268BC
-S315080007C8084B9A4200D008BD074AD2F8D83023F019
-S315080007D80063C2F8D8304FF4C051044801F054F900
-S315080007E8F1E700BF0000084000440258000002581C
-S315080007F810B502F0A3FA214C4FF40003A361204870
-S3150800080802F04AF91F4802F047F9204602F044F96F
-S315080008181D4802F041F91D4BD3F8D82022F0006292
-S31508000828C3F8D820D3F8EC2022F48072C3F8EC2059
-S31508000838D3F8E82022F48022C3F8E820D3F8E02089
-S3150800084822F00802C3F8E020D3F8E02022F00402D8
-S31508000858C3F8E020D3F8E02022F00202C3F8E0202B
-S31508000868D3F8E02022F00102C3F8E020D3F8F420F8
-S3150800087822F00202C3F8F42010BD00BF0004025893
-S31508000888000C025800080258000002580044025892
-S315080008987047FEE7FEE7FEE7FEE7704770477047D2
-S315080008A808B500F02DF908BD294AD2F8883043F46E
-S315080008B87003C2F88830274B1B6803F00F03062B12
-S315080008C806D8244A136823F00F0343F00703136076
-S315080008D8214B1A6842F001021A6000221A61196847
-S315080008E81E4A0A401A601B4B1B6803F00F03072BA6
-S315080008F806D9184A136823F00F0343F00703136051
-S31508000908154B00229A61DA611A62154999621549E6
-S31508000918D962154919635A639963DA6319645A647B
-S31508000928196821F4802119601A66104B1A68104B49
-S315080009381340B3F1005F02D20E4B01221A600E4B28
-S3150800094843F2D2021A60024B4FF000629A6070476F
-S3150800095800ED00E000200052004402587FEDF6EA58
-S31508000968000202020000FF01800201010010005C7B
-S315080009780000FFFF0881005100400052DFF834D01C
-S31508000988FFF792FF002103E00B4B5B5843500431F5
-S315080009980A480B4B42189A42F6D30A4A02E0002341
-S315080009A842F8043B084B9A42F9D305F0E5FBFFF7F2
-S315080009B871FE704700000824BC6400080000002483
-S315080009C8C8000024C800002498150024FEE7000083
-S315080009D810B5194B194ADA670024DC67184AC3F8B0
-S315080009E88020C3F8804040F27122C3F88420C3F8F7
-S315080009F88440144AC3F88820C3F888401822C3F8E4
-S31508000A088C20C3F88C40104AC3F89020C3F890404D
-S31508000A184FF49B72C3F89420C3F894400B4AC3F862
-S31508000A289820C3F898400A4AC3F89C20C3F89C4003
-S31508000A38FFF7DEFE204610BD00440258315001007B
-S31508000A4823C0000AFF072803FFC3FFE83330D7315E
-S31508000A58AADE2000104B1B780BB90120704710B589
-S31508000A6804464FF47A70B0FBF3F30C4A1068B0FBEF
-S31508000A78F3F000F0A9F868B90F2C01D901200AE0AB
-S31508000A88002221464FF0FF3000F06CF8044B1C603A
-S31508000A98002000E0012010BD080000240000002402
-S31508000AA80C00002410B5032000F04AF801F0DCFE1B
-S31508000AB80F498B69C3F303230E4AD35C03F01F035C
-S31508000AC8D8408B6903F00F03D35C03F01F0320FAA1
-S31508000AD803F3094A1360094B18600020FFF7BAFFA9
-S31508000AE810B10124204610BD0446FFF7E1FDF9E7D9
-S31508000AF80044025854620008040000240000002438
-S31508000B08034B1B78034A11680B441360704700BFF0
-S31508000B18080000243813002438B5044604F0F4FB0A
-S31508000B280546B4F1FF3F02D0044B1B781C4404F079
-S31508000B38EBFB401BA042FAD338BD00BF08000024CF
-S31508000B480649CB6823F4E0631B041B0C000200F477
-S31508000B58E0600343024A1A43CA60704700ED00E0A2
-S31508000B680000FA0530B4154BDB68C3F30223C3F15A
-S31508000B780704042C28BF04241D1D062D14D9033B7D
-S31508000B884FF0FF3505FA04F421EA0401994005FAFD
-S31508000B9803F322EA03031943002807DB0901C9B24C
-S31508000BA8074B195430BC70470023E9E700F00F00DB
-S31508000BB80901C9B2034B1954F4E700BF00ED00E078
-S31508000BC800E400E014ED00E00138B0F1807F0AD2B5
-S31508000BD8064B5860064AF02182F8231000209860D0
-S31508000BE807221A6070470120704700BF10E000E02E
-S31508000BF800ED00E030B4446B0268D2F884106F4BFD
-S31508000C08194041EA8401C2F884100268D2F88410AF
-S31508000C1821F47F01856B41EA0541C2F88410826B8D
-S31508000C2822440468D4F88810194041EA8201C4F8B5
-S31508000C3888100468D4F8881021F4FE01C56B41EAC7
-S31508000C480541C4F88810C16B02EB41020468D4F860
-S31508000C58A010194041EA8201C4F8A0100468D4F823
-S31508000C68A01021F4FE01056C41EA0541C4F8A0105C
-S31508000C78046C416C01FB04240268D2F8B0101940D0
-S31508000C8841EA8401C2F8B0100268D2F8B01021F41B
-S31508000C98FE01856C41EA0541C2F8B010826CC16C48
-S31508000CA801FB02440268D2F8AC10194041EA8401F3
-S31508000CB8C2F8AC10026D416D01FB02420468D4F813
-S31508000CC8F010194041EA8201C4F8F0100468D4F813
-S31508000CD8F01021F47C11856D41EA0541C4F8F0103D
-S31508000CE8816D02EB41020468D4F8C0100B4043EA50
-S31508000CF88202C4F8C0200268D2F8C03023F47C13F4
-S31508000D08C16D43EA0143C2F8C0300268D2F8C03060
-S31508000D1823F07C53016E43EA0163C2F8C030436B83
-S31508000D28274A1A449200C266836B02EB8303036759
-S31508000D38C16B03EBC1034367046C416C01FB04F107
-S31508000D4803EB81038367846CC16C01FB04F103EB35
-S31508000D588103C367046D416D01FB04F103EB81034D
-S31508000D68C0F88030816D03EBC103C0F88430C46DC8
-S31508000D78856E05FB04F403EB8403C0F88830016E1E
-S31508000D8801FB05F103EB8103C0F890300D498B424E
-S31508000D980DD9D0F89C3043F02003C0F89C300323C3
-S31508000DA880F89830012007E0002342F8043BD0F881
-S31508000DB890309342F8D8002030BC70470300FFFFF4
-S31508000DC8002B0010FCD30040F0B44C68E4B90E6957
-S31508000DD88C6826430C6846EA84460D6ACC6944EA58
-S31508000DE805648D692C434D692C43CD682C43D0F88E
-S31508000DF88470806E03FB00F307EB830547F82360CE
-S31508000E086C600835002015E00E698C6826430C6866
-S31508000E18264346F08046E0E71418E678A3781B04CC
-S31508000E2843EA0663647843EA0423145C234345F8D3
-S31508000E38043B0430CB89034CE35C8342ECD8F0BC12
-S31508000E48704700BF6462000830B595B004464C2266
-S31508000E58A04901A805F0B4F9002C00F038812368E8
-S31508000E689D4A934220D094F898300BB32268936928
-S31508000E7823F01003936104F047FA054623689A6934
-S31508000E8812F0080F1AD004F03FFA401B0A28F5D9C1
-S31508000E98D4F89C3043F00103C4F89C30032384F843
-S31508000EA89830012015B030BD03F580736360DAE722
-S31508000EB884F899302046FFF70DFCD7E79A6942F07F
-S31508000EC801029A6104F020FA054623689A6912F025
-S31508000ED8010F0FD104F018FA401B0A28F5D9D4F8DF
-S31508000EE89C3043F00103C4F89C30032384F89830F7
-S31508000EF80120D7E79A6942F002029A61237C012BFE
-S31508000F0840D02268936943F040039361637C012BC0
-S31508000F183ED02268936923F480439361A37C012B0E
-S31508000F283CD02268936943F4805393612268936995
-S31508000F3823F44073A1680B4393612268936923F0ED
-S31508000F48A40393612268136923F010031361E36805
-S31508000F58012B29D0002B2CD0022B00F09B8022686D
-S31508000F68936943F0800393612268136943F0100379
-S31508000F781361E368032B1CD12268936943F02003A5
-S31508000F88936116E02268936923F040039361BDE7ED
-S31508000F982268936943F480439361BFE7226893699B
-S31508000FA823F480539361C1E72268936943F00403E5
-S31508000FB89361A3695A1EE369013B1B0243EA42632C
-S31508000FC8226A013A13436269013A216843EA0243ED
-S31508000FD8CB61A368B3F5407F62D0236E33B122682C
-S31508000FE8D2F8C030616E0B43C2F8C030E36D226E8A
-S31508000FF8D3420DD02168D1F8C83023F00703A26E72
-S3150800100814A800EB820252F84C2C1343C1F8C830D6
-S31508001018236C6BB12168D1F8BC3023F00703626CE6
-S3150800102814A800EB820252F84C2C1343C1F8BC30C2
-S31508001038A36C73B12168D1F8BC3023F07003E26C55
-S3150800104814A800EB820252F84C2C43EA0213C1F8A2
-S31508001058BC30236D73B12168D1F8BC3023F4E06342
-S31508001068626D14A800EB820252F84C2C43EA02235C
-S31508001078C1F8BC302268184B9A4222D00023C4F81B
-S315080010889430C4F89C30012384F898302046FFF73A
-S31508001098B1FD07E72268936943F02003936188E75F
-S315080010A8A36A013BE26A013A43EA0223226B013A40
-S315080010B843EA0213626A013A216843EA0243CB60AB
-S315080010C88BE76268936823F003039360D6E70120E9
-S315080010D8E8E600BF0862000800A0004090F89830CB
-S315080010E8013BDBB2012B07D9D0F89C3043F0020349
-S315080010F8C0F89C3001207047CB680A68D2B9072B1C
-S315080011080ED08A68DB0643EA82730A6943EA024311
-S315080011184A691343C26E496842F82130002070476D
-S315080011280A69CB691B0243EA02438A69134343F0F7
-S315080011386053EFE710B40A6942EA4372072B0ED0E8
-S315080011488C684B6943EA8473006F496800EBC104ED
-S3150800115840F83120636000205DF8044B70478B69BE
-S31508001168F2E710B490F89840E4B2012C09D0D0F808
-S315080011789C3043F00403C0F89C3001205DF8044B0A
-S315080011887047920042EA011141EA4303026801994D
-S315080011980B43C2F880300020F0E790F89830DBB2AD
-S315080011A8012B07D0D0F89C3043F00403C0F89C30D4
-S315080011B801207047022380F898300268936923F063
-S315080011C8010393610023C0F89C301846704770B530
-S315080011D890F89840013CE4B2012C07D9D0F89C3025
-S315080011E843F00203C0F89C30012070BD93FAA3F5BA
-S315080011F8B5FA85F50668D6F8C040C4F30544A5428D
-S315080012080BD2D6F8CC401C420FD0D0F89C3043F00D
-S315080012184003C0F89C300120E7E7D0F89C3043F03B
-S315080012282003C0F89C300120DFE793FAA3F3B3FA4A
-S3150800123883F3FFF7C9FD0020D7E790F89830DBB2AB
-S31508001248022B07D0D0F89C3043F00803C0F89C302E
-S31508001258012070470368C3F8D010002070470000C3
-S31508001268F0B490F89840E4B2022C08D0D0F89C3034
-S3150800127843F00803C0F89C300120F0BC70474029A9
-S3150800128839D0412964D0046D8C4240F28E80C46FEF
-S31508001298456D01FB05F504EB85044FF0000C256840
-S315080012A805F080455560002D40F087802568C5F310
-S315080012B88A451560256805F000559560256805F086
-S315080012C800451561A588D561656805F47025D5605A
-S315080012D8656805F480155561656805F40015956116
-S315080012E8E57905F07F0515626568ED0F556204F125
-S315080012F80805002469E00468D4F8A05015F4FE0F20
-S3150800130816D0D4F8A45015F07F0F19D0D4F8A450E5
-S3150800131815F0807F01D0D4F8A050D4F8A440C4F3BF
-S31508001328052C446F456C0CFB05F504EB8504B6E7FC
-S31508001338D0F89C3043F02003C0F89C3001209CE785
-S31508001348D0F89C3043F48073C0F89C30012094E7A9
-S315080013580468D4F8B05015F4FE0F16D0D4F8B45073
-S3150800136815F07F0F19D0D4F8B45015F0807F01D046
-S31508001378D4F8B050D4F8B440C4F3052C846FC56CBF
-S315080013880CFB05F504EB850489E7D0F89C3043F097
-S315080013982003C0F89C3001206FE7D0F89C3043F44E
-S315080013A88073C0F89C30012067E7D0F89C3043F07A
-S315080013B82003C0F89C3001205FE7256825F06045C2
-S315080013C8156077E72E5D1E550134D689124FBE5D26
-S315080013D8A642F7D840290BD041290ED01F2911D883
-S315080013E80268012303FA01F1C2F89810002044E7BD
-S315080013F80368C3F8A8C000203FE70368C3F8B8C065
-S3150800140800203AE701F01F010268012303FA01F1F7
-S31508001418C2F89C10002030E7646200080368D3F815
-S31508001428CC300B4201D00120704700207047402974
-S3150800143805D00368D3F8B40000F07F007047036846
-S31508001448D3F8A40000F07F0070470000144BDB684F
-S3150800145813F0010F09D0124B124A5A6002F188326A
-S315080014685A60DB6813F0010F16D10D4BD3F80C310F
-S3150800147813F0010F12D00A4B0A4AC3F8042102F1E5
-S315080014888832C3F80421D3F80C3113F0010F01D1BF
-S3150800149800207047012070470120704700207047D8
-S315080014A800200052230167450D4BDA6842F0010215
-S315080014B8DA60DB6813F0010F0FD0094BD3F80C215B
-S315080014C842F00102C3F80C21D3F80C3113F0010FCE
-S315080014D801D000207047012070470120704700BFDF
-S315080014E8002000522DE9F04105460F46384B1E6983
-S315080014F803F00AFF8046022F07D026F0684626F42E
-S315080015088016760C7604042420E0314BD3F8106153
-S3150800151826F0684626F48016760C760446F00046C9
-S315080015282C4C13E003F0F0FEA0EB0800A84248D8BC
-S3150800153865B9032025E0264B1B6934EA03030CBF6B
-S315080015480123002383B1B5F1FF3FEBD134F004033F
-S31508001558F1D01F4BD3F8103124EA030333F00043C4
-S315080015680CBF01230023EDE736F000410FD01A4AD5
-S31508001578936933439361002E05DA154BC3F81411A2
-S315080015880120BDE8F081124B5E610120F9E7012FC1
-S315080015980CD00F4BD3F8103113F4803F15D00C4BF1
-S315080015A84FF48032C3F814210020EAE7084B1B6978
-S315080015B813F4803F07D0064B4FF480325A61002057
-S315080015C8DFE70320DDE70020DBE70020D9E700BFD7
-S315080015D800200052040000803C1300242F4B1B7D7A
-S315080015E8012B56D070B50C4615462C4B01221A7598
-S315080015F801F17843B3F5801F3DD3A1F10161B1F537
-S31508001608801F49D20226254B00229A6131464CF2A0
-S315080016185030FFF767FF034640BB012E2DD0204AFE
-S31508001628D2F80C3143F00203C2F80C31BFF36F8FBE
-S31508001638BFF34F8F082355F8042B44F8042B013BB6
-S3150800164813F0FF03F7D1BFF36F8FBFF34F8F314600
-S315080016584CF25030FFF746FF0346012E13D01049C7
-S31508001668D1F80C2122F00202C1F80C210B4A0021FC
-S315080016781175184670BD0126C5E7094AD36843F0AF
-S315080016880203D360D2E70649CA6822F00202CA6092
-S31508001698ECE70223184670470123EAE73C130024BF
-S315080016A80020005201F00303032B24D011F0010F88
-S315080016B80BD01D4BDA6822F03002DA60DA6802438A
-S315080016C8DA60DA6842F08802DA6011F0020F11D09F
-S315080016D8154BD3F80C2122F03002C3F80C21D3F8A5
-S315080016E80C211043C3F80C01D3F80C2142F08802E8
-S315080016F8C3F80C2170470C4BDA6822F03002DA601E
-S31508001708D3F80C2122F03002C3F80C21DA68024318
-S31508001718DA60D3F80C211043C3F80C019A6942F031
-S3150800172810029A61704700BF0020005230B411F0C9
-S31508001738010F0BD0104CE36823F4E663E360E36813
-S3150800174842EA00252B4343F08403E36011F0020FB5
-S315080017580FD00949D1F80C3123F4E663C1F80C31E6
-S31508001768D1F80C3142EA00221A4342F08402C1F841
-S315080017780C2130BC704700BF00200052F8B5474B13
-S315080017881B7D012B00F088800F460446434B012237
-S315080017981A7500229A61436813F0010F0DD10026C5
-S315080017A8636813F0020F12D1CEB92368012B1BD038
-S315080017B84FF0FF333B60A5684CE001214CF25030EE
-S315080017C8FFF790FE06460028EAD00126E8E7022138
-S315080017D84CF25030FFF786FE0028E5D001262F4B3D
-S315080017E800221A753046F8BD61682069FFF75AFF66
-S315080017F8636813F0010F12D1636813F0020FEED075
-S3150800180802214CF25030FFF76DFE00B10126244A3A
-S31508001818D2F80C3123F00803C2F80C31DFE70121AE
-S315080018284CF25030FFF75EFE00B101261C4AD36819
-S3150800183823F00803D360DFE701214CF25030FFF7A5
-S3150800184851FE0646164AD168164B0B40D3600FE080
-S3150800185806BB0135E368A2681344AB42BFD92269BF
-S3150800186861682846FFF762FF636813F0010FE3D142
-S31508001878636813F0020FEBD002214CF25030FFF7E1
-S3150800188831FE0646064AD2F80C11064B0B40C2F83A
-S315080018980C31DDE73D60A2E70226A3E73C130024E6
-S315080018A800200052FBF8FFFFF0B583B000233AE0AA
-S315080018B8092400E00024B4403C4302356E4E46F83D
-S315080018C825406E4C2568D44304EA05064F6817F484
-S315080018D8803F01D042EA0506684D2E606E6804EA24
-S315080018E806054F6817F4003F01D042EA0605634E1D
-S315080018F875604FF0B0452D6804EA05064F6817F479
-S31508001908801F01D042EA05064FF0B0452E606D6883
-S315080019182C404E6816F4001F01D042EA05044FF021
-S31508001928B042546001330A6832FA03F400F0A28020
-S3150800193801249C402240F5D04D686E1E112D18BF13
-S31508001948012E01D9122D12D186685F000325BD40E4
-S3150800195826EA0506CD68BD4035438560466826EA09
-S3150800196804064D68C5F300149C4034434460C668B1
-S315080019785F000325BD40EC4326408D68BD403543CE
-S31508001988C5604D68122D18BF022D13D1DE0808361A
-S3150800199850F826E003F007054FEA850C0F2505FAE7
-S315080019A80CF52EEA050E0D6905FA0CF545EA0E053D
-S315080019B840F82650056825404C6804F00304BC40E6
-S315080019C82C4304604C6814F0805FABD02C4CD4F8D8
-S315080019D8F45045F00205C4F8F450D4F8F44004F07D
-S315080019E802040194019C9D08AE1C234C54F82670E9
-S315080019F803F00304A6000F24B44027EA0407214C81
-S31508001A08A0423FF457AF04F58064A04222D004F5FB
-S31508001A188064A04220D004F58064A0421ED004F554
-S31508001A288064A0421CD004F58064A0421AD004F54C
-S31508001A388064A04218D004F58064A04216D004F544
-S31508001A488064A04214D004F58064A0423FF430AF05
-S31508001A580A2430E701242EE702242CE703242AE780
-S31508001A68042428E7052426E7062424E7072422E78A
-S31508001A78082420E703B0F0BD000400588000005889
-S31508001A880044025800000258002331FA03F200F015
-S31508001A989880F0B52CE0092700E0002707FA04F437
-S31508001AA8B44273D005685C00032606FA04F4254395
-S31508001AB8056023FA06F5083550F8256003F0070788
-S31508001AC84FEA870C0F2707FA0CF726EA070640F8A5
-S31508001AD82560C568E4432540C560456825EA0202CD
-S31508001AE84260826814408460013331FA03F267D091
-S31508001AF801229A4012EA0105F6D04FEA930E0EF132
-S31508001B080206304C54F8266003F00304A4004FF08C
-S31508001B180F0C0CFA04FC0CEA06062B4FB842BCD08C
-S31508001B2807F58067B84221D007F58067B8421FD005
-S31508001B3807F58067B8421DD007F58067B8421BD0FD
-S31508001B4807F58067B84219D007F58067B84217D0F5
-S31508001B5807F58067B84215D007F58067B84213D0ED
-S31508001B6807F58067B84296D00A2797E7012795E7C9
-S31508001B78022793E7032791E704278FE705278DE7C9
-S31508001B8806278BE7072789E7082787E70F4C26687C
-S31508001B98ED432E40266066682E4066604FF0B044D6
-S31508001BA826682E402660666835406560054E0EF143
-S31508001BB8020456F8245025EA0C0546F8245071E71D
-S31508001BC8F0BD70470004005800000258800000580D
-S31508001BD82DE9F04782B00768CA00521A93000344F1
-S31508001BE85A6D1B6D9A4257D8B8469B1AC1EBC10461
-S31508001BF8A2000244526C9A4200D31A460C4606467C
-S31508001C0802F1030A4FEA9A0A16E009F1030A4FEAAB
-S31508001C189A0AE3001B1B9D003544A96C337C009384
-S31508001C281FFA89F3E2B2384601F0B8FFAB6C4B44A9
-S31508001C38AB646B6D4B446B6508EB441303F5106393
-S31508001C489B699BB2534513D3E3001B1B9A00324486
-S31508001C58516D136D99420BD253B15B1AC4EBC4018B
-S31508001C688A003244D2F844909945CED39946CCE7AF
-S31508001C78E3001B1B98000644326D736D9A420FD811
-S31508001C8804F00F040121A140D7F8344824EA0104D6
-S31508001C98C7F83448002000E0012002B0BDE8F08704
-S31508001CA80020FAE7F0B58BB0002800F091800446CA
-S31508001CB8056890F8BD3323B3032384F8BD33EB6B6B
-S31508001CC813F4807F01D100232361206801F004FD05
-S31508001CD8254655F8107B6E460FCD0FC60FCD0FC695
-S31508001CE895E8030086E80300231D0ECB384601F065
-S31508001CF831FC58B1022384F8BD33012528460BB0B8
-S31508001D08F0BD80F8BC33FEF71FFDD5E70021206833
-S31508001D1801F0E8FC002315E0D900C81A820022441D
-S31508001D28012082F83D0082F83C30A2F842300020B3
-S31508001D3882F83F0050649064CA1A910021440865E5
-S31508001D480133DBB26568AB42E6D3002315E0D80059
-S31508001D58C11A8A002244002182F8FD1182F8FC3152
-S31508001D6882F8FF11C2F80412C2F80812C21A9000C3
-S31508001D782044C0F810120133DBB29D42E7D8254645
-S31508001D8855F8107B6E460FCD0FC60FCD0FC695E8D2
-S31508001D98030086E80300231D0ECB384601F0E8FC4D
-S31508001DA8054660B9002384F83830012384F8BD3322
-S31508001DB8636A012B08D0206802F0BFF89EE7022361
-S31508001DC884F8BD33012599E7204600F02FFDF2E790
-S31508001DD8012593E7026890F8BC33012B19D010B592
-S31508001DE8012380F8BC33836A012B0AD004460068AD
-S31508001DF802F097F8206801F069FC002084F8BC0313
-S31508001E0810BD8369012BF1D0936B43F48033936338
-S31508001E18ECE70220704738B590F8BC33012B18D088
-S31508001E280446012380F8BC33006801F055FC206895
-S31508001E3802F043F8054628B1002384F8BC33012587
-S31508001E48284638BD206802F078F8002384F8BC33A1
-S31508001E58F6E70225F4E768B110B50446032380F8C7
-S31508001E68BD33FFF7D8FF2046FEF7A8FC002084F804
-S31508001E78BD0310BD0120704770B504460D460068BD
-S31508001E88066C00EB411303F530639A68216901294A
-S31508001E9811D037498E4254D03DB9C5EBC5029300D7
-S31508001EA82344D3F81032002B5CD0E9B2204604F05C
-S31508001EB831F8002070BD12F0080F09D02D498E425E
-S31508001EC8F7D912F4004FF4D04FF400429A60F0E7BD
-S31508001ED812F0200F28D112F0280FEAD125498E4290
-S31508001EE802D912F4004F22D1E900491B8A0022447C
-S31508001EF8D2F804121B69C3F31203C91AC2F81412DA
-S31508001F08D2F80412D2F808320B44C2F8083235B9A6
-S31508001F18C5EBC50293002344D3F810325BB1E9B286
-S31508001F28204603F0F7FFC4E720229A60C1E74FF47A
-S31508001F3800429A60BDE704F57172012102F04EF875
-S31508001F48EDE712F4004F09D112F0200F01D0202234
-S31508001F589A60E9B2204603F0DDFFAAE74FF400428B
-S31508001F689A60A6E704F57172002102F037F89CE733
-S31508001F780A31544F0A30544F38B5044603681D6C65
-S31508001F8803EB4111D1F8082B0E4B9D4207D901F5F1
-S31508001F98306112F4004F02D04FF400438B6020469C
-S31508001FA803F0B0FF074B9D4202D92369012B01D0E4
-S31508001FB8002038BD04F571720121206802F00EF878
-S31508001FC8F6E700BF0A30544F2DE9F84F044605686E
-S31508001FD8284601F0EFFF08B1BDE8F88F2F460646F8
-S31508001FE8206801F0B6FF0028F6D0206801F0B1FF96
-S31508001FF810F0020F04D02268536903F002035361F4
-S31508002008206801F0A6FF10F0100F15D02268936912
-S3150800201823F010039361D5F8208008F00F09C8F358
-S315080020284343022B00F08580062B00F0A580226822
-S31508002038936943F010039361206801F08AFF10F44E
-S31508002048002F40F0AD80206801F083FF10F4802F40
-S3150800205840F0F180206801F07CFF0028C0F25F811B
-S31508002068206801F076FF10F4006F0AD0D5F8083812
-S3150800207813F0010F40F06D812268536903F4006379
-S315080020885361206801F065FF10F0006F15D02268CB
-S31508002098536903F00063536194F8F433002B40F056
-S315080020A85C81012184F8F41323685B6DC3F3830309
-S315080020B8C4F8F833204600F0CDFB206801F049FF44
-S315080020C810F4805F40F04D81206801F042FF10F45B
-S315080020D8005F40F0AB81206801F03BFF10F0080F65
-S315080020E840F0BC81206801F034FF10F4801F40F0EE
-S315080020F8BE81206801F02DFF10F4001F40F0C18151
-S31508002108206801F026FF10F0804F40F0C48120684F
-S3150800211801F01FFF10F0040F3FF45EAF23685D68F7
-S3150800212815F0040F40F0C081226853682B435360AA
-S3150800213852E747F6F07318EA030F3FF478AF4FEA09
-S31508002148C90BABEB09034FEA830AA2444FEA1818EE
-S31508002158C8F30A02DAF80812284601F03FFEC8F35F
-S315080021680A08DAF808324344CAF80832DAF81432A0
-S315080021784344CAF814325AE7082204F57171284606
-S3150800218801F02CFEC8F30A184FEAC903A3EB0901A4
-S315080021988A002244D2F814324344C2F8143246E775
-S315080021A8206801F0DAFE8046B14617E007EB4913C6
-S315080021B80122C3F8082B49462046FFF75DFE1DE0B5
-S315080021C807EB49130822C3F8082B49462046FFF7A8
-S315080021D8D3FE16E009F101094FEA5808B8F1000FCD
-S315080021E83FF431AF18F0010FF4D05FFA89F120688F
-S315080021F801F0C3FE824610F0010FD7D11AF0080F76
-S31508002208DED11AF0100F04D007EB49131022C3F8D1
-S31508002218082B1AF0200F04D007EB49132022C3F81D
-S31508002228082B1AF4005FD5D007EB49134FF4005270
-S31508002238C3F8082BCEE7206801F097FE8046B1461A
-S315080022482AE05946204603F071FE1AF0080F04D012
-S3150800225807EB49130822C3F808291AF0100F04D007
-S3150800226807EB49131022C3F808291AF0400F04D0BF
-S3150800227807EB49134022C3F808291AF0020F04D0BD
-S3150800228807EB49130222C3F808291AF0800F41D12F
-S3150800229809F101094FEA5808B8F1000F3FF4DAAE18
-S315080022A818F0010FF4D05FFA89FB5946206801F047
-S315080022B86DFE824610F0010FC7D009F00F03012101
-S315080022C801FA03F2D7F8343823EA0203C7F8343890
-S315080022D807EB4913C3F8081923698B42B1D14FEAAA
-S315080022E8C902A2EB090293002344596C9A6C0A4462
-S315080022F89A64B9F1000FA4D1C9EBC9029300234423
-S315080023081B6D002B9DD104F571720121206801F01F
-S3150800231865FE96E749462046FFF75AFCB8E7D5F81A
-S31508002328043823F00103C5F8043894F8F433012B6C
-S3150800233808D0204603F040FE2268536903F000439C
-S3150800234853618DE6002184F8F413204600F082FADA
-S31508002358F2E7204603F016FE8EE6204603F012FE44
-S31508002368ABE605F50068D8F8043023F00103C8F889
-S3150800237804301021206801F0CDF920E007EB461358
-S315080023884FF67F31C3F80819D3F8002922F400124A
-S31508002398C3F80029D3F8002942F00062C3F80029D7
-S315080023A8C3F8081BD3F8002B22F40012C3F8002B35
-S315080023B8D3F8002B42F00062C3F8002B0136636895
-S315080023C8B342DBD8D8F81C3043F00113C8F81C30E0
-S315080023D8236BEBB1D8F8843043F00B03C8F8843084
-S315080023E8D8F8443043F00B03C8F84430D5F8003819
-S315080023F823F4FE63C5F8003804F57172217C206859
-S3150800240801F0ECFD2268536903F4805353615BE6D7
-S31508002418D8F8142042F22B031343C8F81430D8F816
-S31508002428103043F00B03C8F81030DFE7206801F0D6
-S31508002438C5FD206801F060FAE060256800F00AFB2F
-S31508002448227B0146284601F0CBF8204603F080FD9A
-S315080024582268536903F4005353613CE6204603F0A7
-S3150800246870FD2268536903F0080353613AE60021B0
-S31508002478204603F0B0FD2268536903F480135361BC
-S3150800248837E60021204603F0A0FD2268536903F4C5
-S315080024980013536134E6204603F0A3FD2268536906
-S315080024A803F08043536132E6204603F0A4FD3BE679
-S315080024B8026890F8BC33012B16D010B5012380F8B2
-S315080024C8BC33836A012B07D00446006801F029FD4E
-S315080024D8002084F8BC0310BD8369012BF4D0936BE4
-S315080024E843F480339363EFE70220704790F8BC33D0
-S315080024F8012B0BD010B50446012380F8BC330068BD
-S3150800250801F01BFD002084F8BC0310BD02207047AB
-S3150800251890F8BC33012B0DD010B50446012380F87A
-S31508002528BC3380F83810006801F0EBFC002084F80A
-S31508002538BC0310BD02207047F8B511F0800F28D1EA
-S3150800254801F00F06F500AF1BBC00274604F5FC741E
-S31508002558044404343E460644002586F8FD5101F035
-S315080025680F012170A260E370627802B1E180022B44
-S315080025781ED090F8BC33012B1DD00546012380F8E0
-S31508002588BC332146006801F0C7F9002085F8BC036A
-S31508002598F8BD01F00F06F500AF1BBC002746383416
-S315080025A8044404343E460644012586F83D50D6E7D9
-S315080025B800232371DDE70220EAE738B511F0800F1A
-S315080025C821D101F00F05EA00541BA3001C4603F5A8
-S315080025D8FC730344043325460544002285F8FD2187
-S315080025E801F00F01197090F8BC23012A1AD0044685
-S315080025F8012280F8BC231946006801F0D5F90020A5
-S3150800260884F8BC0338BD01F00F04E200151BAB00C3
-S315080026181D463833034404332C460444012284F8FF
-S315080026283D20DDE70220EDE770B501F00F05EE0065
-S31508002638711B8C0004F5FC740444211D761BB40038
-S315080026480444C4F80822C4F810320023C4F8143223
-S3150800265884F8FD3184F8FC510369012B06D065B16D
-S31508002668DAB2006801F0AEFA002070BDC5EBC506FF
-S31508002678B4000444C4F80C22F1E7DAB2006801F0A1
-S3150800268801FAF1E701F00F01C1EBC1018B0018440B
-S31508002698D0F81402704770B501F00F05EE00711BEB
-S315080026A88C0038340444211D761BB4000444A26403
-S315080026B8236500236365012384F83D3084F83C507C
-S315080026C80369012B06D05DB1DAB2006801F07AFA1F
-S315080026D8002070BDC5EBC506B4000444E264F2E701
-S315080026E8DAB2006801F0CEF9F2E738B501F00F055D
-S315080026F843689D4236D811F0800F20D1CA00541A73
-S31508002708A3001C4603F5FC7303440433224602441B
-S31508002718002182F8FD1101229A701D7090F8BC23D9
-S31508002728012A21D00446012280F8BC2319460068EC
-S3150800273801F068FB7DB1002084F8BC0313E0EA00C9
-S31508002748511B8B00194638330344043301440122CC
-S3150800275881F83D20DFE704F57172217C206801F0D5
-S315080027683DFCE8E7012038BD0220FCE710B501F07A
-S315080027780F0443689C422CD811F0800F1DD1E30042
-S315080027881A1B91000A4601F5FC71014404310244FA
-S31508002798002382F8FD3100238B700C7090F8BC3347
-S315080027A8012B18D00446012380F8BC33006801F0D1
-S315080027B856FB002084F8BC030CE0E3001A1B9100C2
-S315080027C80A463831014404310244012382F83D306F
-S315080027D8E1E7012010BD0220FCE730B40468606A0E
-S315080027E829B10D46A36A00EB134000230CE040EA22
-S315080027F80240A06212E003F1400104EB8101496836
-S3150800280800EB11400133DBB2691E8B42F3D340EA71
-S31508002818024005F13F0104EB81014860002030BC05
-S31508002828704703685962002070470000024603682B
-S315080028380121C0F8FC13002082F8F4039A6942F0D3
-S3150800284800629A61596D024A0A435A65704700BF81
-S315080028580300001070470000024AD36843F08073EB
-S31508002868D360704700480258724B1B6903F0380357
-S31508002878102B00F0DB80182B10D00BB16E48704770
-S315080028886C4B1B6813F0200F00F0D280694B186850
-S31508002898C0F3C100694B23FA00F07047654A916A8C
-S315080028A801F00301906AC0F30510D36A03F0010327
-S315080028B8526BC2F3CC0203FB02F307EE903AF8EE2A
-S315080028C8677A002800F0B580012966D0F9B102298F
-S315080028D800F08F8007EE100AF8EE476A9FED586AEF
-S315080028E886EE267A534B1B6BC3F3080306EE903A1B
-S315080028F8F8EE666A9FED536A67EE867A76EEA77AE9
-S31508002908F7EE006A77EEA67A27EE277A61E0494B52
-S315080029181B6813F0200F23D046490A68C2F3C10280
-S31508002928464BD34007EE103AF8EE476A07EE100A08
-S31508002938B8EE476A86EE867A0B6BC3F3080306EE8B
-S31508002948903AF8EE666A9FED3F6A67EE867A76EE03
-S31508002958A77AF7EE006A77EEA67A27EE277A38E09E
-S3150800296807EE100AF8EE476A9FED376A86EE267A6A
-S31508002978304B1B6BC3F3080306EE903AF8EE666A0B
-S315080029889FED306A67EE867A76EEA77AF7EE006AE2
-S3150800299877EEA67A27EE277A1BE007EE100AF8EEF6
-S315080029A8476A9FED276A86EE267A224B1B6BC3F386
-S315080029B8080306EE903AF8EE666A9FED226A67EE15
-S315080029C8867A76EEA77AF7EE006A77EEA67A27EE83
-S315080029D8277A184B1B6BC3F34623013307EE903A45
-S315080029E8F8EE677AC7EE276AFCEEE67A17EE900ADB
-S315080029F8704707EE100AF8EE476A9FED146A86EEE6
-S31508002A08267A0C4B1B6BC3F3080306EE903AF8EECE
-S31508002A18666A9FED0C6A67EE867A76EEA77AF7EE0F
-S31508002A28006A77EEA67A27EE277AD2E7084870472B
-S31508002A38024870470044025800093D000090D00338
-S31508002A480024744A000000390024744C0024F44A0F
-S31508002A5800127A0008B5FFF707FF0B4A9369C3F314
-S31508002A6803230A49CB5C03F01F0320FA03F3926990
-S31508002A7802F00F02885C00F01F0023FA00F0044AEF
-S31508002A881060044A136008BD0044025854620008DE
-S31508002A9804000024000000246A4B984222D06A4B9E
-S31508002AA898422FD0694B98423CD0694B984249D0F6
-S31508002AB8684B984256D0684B984263D0674B984201
-S31508002AC870D0674B98427DD0664B984200F08A8052
-S31508002AD8654B984200F09680644B984200F0A280B5
-S31508002AE80120704703F58843D3F8882042F001028D
-S31508002AF8C3F88820D3F8882022F00102C3F8882072
-S31508002B080020704703F58043D3F8882042F0020274
-S31508002B18C3F88820D3F8882022F00202C3F8882050
-S31508002B280020704703F57053D3F8882042F0040252
-S31508002B38C3F88820D3F8882022F00402C3F888202E
-S31508002B480020704703F56053D3F8882042F008023E
-S31508002B58C3F88820D3F8882022F00802C3F888200A
-S31508002B680020704703F55053D3F8882042F0100226
-S31508002B78C3F88820D3F8882022F01002C3F88820E2
-S31508002B880020704703F54053D3F8882042F0200206
-S31508002B98C3F88820D3F8882022F02002C3F88820B2
-S31508002BA80020704703F53053D3F8882042F04002D6
-S31508002BB8C3F88820D3F8882022F04002C3F8882072
-S31508002BC80020704703F52053D3F8882042F0800286
-S31508002BD8C3F88820D3F8882022F08002C3F8882012
-S31508002BE80020704703F51053D3F8882042F4807202
-S31508002BF8C3F88820D3F8882022F48072C3F888207E
-S31508002C080020704703F50053D3F8882042F4007271
-S31508002C18C3F88820D3F8882022F40072C3F88820DD
-S31508002C280020704703F5E053D3F8882042F4806201
-S31508002C38C3F88820D3F8882022F48062C3F888204D
-S31508002C48002070470000025800040258000802587D
-S31508002C58000C0258001002580014025800180258AE
-S31508002C68001C02580020025800240258002802585E
-S31508002C78F0B40A6892FAA2F2B2FA82F216E00F697A
-S31508002C88C66803FB03F505EB4504E443264005FB44
-S31508002C9807F73E43C6604E68022E29D04B68066879
-S31508002CA8344005FB03F32343036001320B6833FA08
-S31508002CB802F440D0012494402340F6D04C68013CE5
-S31508002CC8012CDCD88E68846803FB03F505EB4507F9
-S31508002CD824EA070405FB06F52C4384600E68CD68CC
-S31508002CE8446824EA060405FB06F52C434460C6E74F
-S31508002CF8FF2B0ED8066A05FB03F707FB03F3C3EB9E
-S31508002D08031726EA07074E6903FB06F33B430362E4
-S31508002D18C4E7466A1B0A03FB03F707FB03F707FB27
-S31508002D2803F3C3EB031726EA07074E6903FB06F303
-S31508002D383B434362B2E70020F0BC70472D4B1B6843
-S31508002D4803F00F03062B06D82A4A136823F00F0345
-S31508002D5843F007031360284A136843F00103136016
-S31508002D68254B1B6813F0040FFAD0234B00221A616F
-S31508002D781968224A0A401A601F4B1B6813F0007F1D
-S31508002D88FAD11D4B1B6813F0006FFAD11A4B1B6852
-S31508002D9813F0005FFAD1184B00229A61DA611A62B9
-S31508002DA8174999621749D962174919635A63996382
-S31508002DB8DA6319645A64196821F4802119601A6655
-S31508002DC8996E40F2FF720A439A66D3F8D02042F405
-S31508002DD88032C3F8D020074B1B6803F00F03072B74
-S31508002DE806D9044A136823F00F0343F00703136050
-S31508002DF8704700BF002000520044025845EDF6EA25
-S31508002E08000202020000FF018002010107EE900A93
-S31508002E18F8EE676A07EE901AF8EE677A86EEA77AEA
-S31508002E2807EE902AF8EE677A06EE903AF8EE666AA2
-S31508002E389FED096A66EE866A77EEA67A27EE277AFE
-S31508002E48DDED007AF8EE677AC7EE276AFCEEE67AD1
-S31508002E5817EE900A704700BF000000392DE9F041C7
-S31508002E6882B03F4B9B6A03F00303012B60D0002B0B
-S31508002E7852D0022B63D00027002303604360836087
-S31508002E88374B9E6AC6F305161A6BC2F30802551C19
-S31508002E98DB6A13F0010F5FD0314B5B6BC3F3CC08C9
-S31508002EA8002E36D004462E4BDB6A13F4803F0CD02E
-S31508002EB82B4B1B6BC3F346230133009343462A4621
-S31508002EC831463846FFF7A2FF2060254BDB6A13F424
-S31508002ED8003F0CD0224B1B6BC3F306430133009308
-S31508002EE843462A4631463846FFF790FF60601C4B32
-S31508002EF8DB6A13F4802F0CD0194B1B6BC3F30663DC
-S31508002F080133009343462A4631463846FFF77EFF83
-S31508002F18A06002B0BDE8F081114B1B6813F0040FDE
-S31508002F2814D00F4B1B68C3F3C1030E4FDF40A3E74A
-S31508002F380B4B1B6813F4807F0AD100279CE7084BC4
-S31508002F481B6813F4003F05D1002795E7002793E788
-S31508002F58054F91E7054F8FE74FF00008A0E700BF38
-S31508002F68004402580090D00300093D0000127A0078
-S31508002F782DE9F04182B03F4B9B6A03F00303012B0E
-S31508002F8860D0002B52D0022B63D0002700230360A1
-S31508002F9843608360374B9E6AC6F305369A6BC2F35D
-S31508002FA80802551CDB6A13F0100F5FD0314BDB6B38
-S31508002FB8C3F3CC08002E36D004462E4BDB6A13F42E
-S31508002FC8002F0CD02B4B9B6BC3F34623013300937E
-S31508002FD843462A4631463846FFF718FF2060254BF0
-S31508002FE8DB6A13F4801F0CD0224B9B6BC3F3064392
-S31508002FF80133009343462A4631463846FFF706FF0B
-S3150800300860601C4BDB6A13F4001F0CD0194B9B6BD2
-S31508003018C3F306630133009343462A4631463846C6
-S31508003028FFF7F4FEA06002B0BDE8F081114B1B68FB
-S3150800303813F0040F14D00F4B1B68C3F3C1030E4FCC
-S31508003048DF40A3E70B4B1B6813F4807F0AD10027E0
-S315080030589CE7084B1B6813F4003F05D1002795E742
-S31508003068002793E7054F91E7054F8FE74FF00008CC
-S31508003078A0E700BF004402580090D00300093D00AD
-S3150800308800127A002DE9F04182B0434B9B6A03F09F
-S315080030980303012B69D0002B5BD0022B6CD00025CB
-S315080030A800230360436083603B4B9C6AC4F3055462
-S315080030B81A6CC2F30802561CDB6A13F4807F68D0C0
-S315080030C8354B5F6CC7F3CC072B1C18BF0123002CA4
-S315080030D808BF0023002B39D080462F4BDB6A13F430
-S315080030E8800F0DD02C4B1B6CC3F34623013300937A
-S315080030F83B46324621462846FFF788FEC8F80000B0
-S31508003108254BDB6A13F4000F0DD0234B1B6CC3F356
-S315080031180643013300933B46324621462846FFF7C5
-S3150800312875FEC8F804001C4BDB6A13F0807F0DD0C7
-S31508003138194B1B6CC3F30663013300933B463246AF
-S3150800314821462846FFF762FEC8F8080002B0BDE81F
-S31508003158F081114B1B6813F0040F14D00E4B1B6833
-S31508003168C3F3C1030D4DDD409AE70B4B1B6813F4F7
-S31508003178807F0AD1002593E7074B1B6813F4003FA5
-S3150800318805D100258CE700258AE7054D88E7054D12
-S3150800319886E7002798E700BF004402580090D00346
-S315080031A800093D0000127A00154B1B6903F0380325
-S315080031B8182B0ED8DFE803F00F0D0D0D0D0D0D0DAC
-S315080031C8210D0D0D0D0D0D0D160D0D0D0D0D0D0DFC
-S315080031D81800002070470A4B1B68C3F3C103094847
-S315080031E8D84070470848704700B585B001A8FFF76A
-S315080031F835FE019805B05DF804FB0448704700BF22
-S31508003208004402580090D00300127A0000093D00D5
-S31508003218044B9B6903F00F03034AD35C03F01F03AF
-S31508003228D84070470044025874620008044BDB69AA
-S31508003238C3F30213034AD35C03F01F03D84070474D
-S315080032480044025874620008044BDB69C3F302237E
-S31508003258034AD35C03F01F03D8407047004402585A
-S315080032687462000800B585B0C2B24C4BD358020E3A
-S31508003278C0F304218A401340CB4040EA0340484B38
-S31508003288984228D02ED8A3F58133A3F5807398429F
-S315080032985DD019D8A3F58033984248D003F5407312
-S315080032A898422ED1FFF780FF3E4B9B69C3F3032351
-S315080032B83D4AD35C03F01F03D840FFF7A9FFFFF781
-S315080032C8C3FF05B05DF804FB384B98423FD003F5B9
-S315080032D87D43984215D1334B1B6813F0005F42D1E2
-S315080032E80020EEE7324B984242D00CD9314B98422F
-S315080032F845D003F54073984241D0A3F580339842E8
-S3150800330836D00020DDE7A3F58033984203D003F5CD
-S3150800331840739842F5D1234B1B6813F0040F35D038
-S31508003328204B1B68C3F3C1032348D840C9E7FFF7F6
-S315080033383BFF1C4B9B69C3F303231B4AD35C03F06F
-S315080033481F03D840FFF764FFFFF770FFB9E7154B6F
-S315080033581B6813F0006F01D10020B2E701A8FFF738
-S3150800336807FE0298ADE701A8FFF78CFE0298A8E7C2
-S315080033780C4B1B6813F4807F0AD10020A1E7094B80
-S315080033881B6F13F0020F05D100209AE7002098E773
-S315080033980A4896E74FF4004093E700BF4C440258A2
-S315080033A80803020700440258746200080803010764
-S315080033B808000407080005070090D00300093D0027
-S315080033C838B5036813F0010F40F08C800D460446A3
-S315080033D80368454A1A408B6809690B4369690B43B0
-S315080033E8E9690B4313430360EB68426822F44052C9
-S315080033F813434360AB69826822F4407213438360BF
-S315080034083A4B984216D03A4B98421CD0394B9842B8
-S315080034181DD0394B98421ED0384B98421FD0384B8E
-S31508003428984220D0374B984221D0374B984222D021
-S3150800343801204EE03548FFF715FF002848D06A688E
-S31508003448EAB9012045E03248FFF70CFFF5E73048AE
-S31508003458FFF708FFF1E72E48FFF704FFEDE72C48CA
-S31508003468FFF700FFE9E72948FFF7FCFEE5E72848E4
-S31508003478FFF7F8FEE1E72648FFF7F4FEDDE72B68D5
-S31508003488E9690B2B2CD8B1F5004F0DD0DBB22149D1
-S3150800349851F82330B0FBF3F303EB5203B3FBF2F313
-S315080034A89BB2E360002014E0DBB21A4951F82330D6
-S315080034B8B0FBF3F0530803EB4000B0FBF2F34FF60A
-S315080034C8F0721A40C3F342031343E360002000E096
-S315080034D80120E26A22F00F022B881343E36238BD03
-S315080034E80020F6E70120FAE7F369FFEF001001402C
-S315080034F80044004000480040004C0040005000408E
-S315080035080014014000780040007C004008030007CA
-S315080035180800000784620008002301330C4A934216
-S3150800352811D80269002AF8DA036943F0010303612E
-S3150800353800230133064A934207D8026912F0010F9D
-S31508003548F7D100207047032070470320704700BF53
-S31508003558400D030084B010B5044603A880E80E00A1
-S31508003568089B012B1DD1A36B23F48033A363E26860
-S315080035781A4B1340E360E36823F44013E3600F9B98
-S31508003588012B09D02046FFF7C7FF069B012B1BD046
-S31508003598BDE8104004B07047E36843F48013E3605D
-S315080035A8F0E7E36843F04003E3602046FFF7B4FF1B
-S315080035B80C9B23B9A36B43F48033A363E5E7A36B9A
-S315080035C823F48033A363E0E7A36843F00603A36004
-S315080035D8A36843F02003A360DAE700BFBFFFBDFF77
-S315080035E8022A0AD00921C26822F47052C260C36846
-S315080035F843EA8123C36000207047274B0B44274AB8
-S31508003608934239D9264B0B44264A934236D9264B38
-S315080036180B44264A934233D9254B0B4402F5C33249
-S31508003628A03293422ED9234B0B44234A93422BD9D3
-S31508003638224B0B4402F5922202F57872934225D959
-S315080036481F4B0B4402F5C32202F5207293421FD979
-S315080036581C4B0B4402F5B71202F55872934219D956
-S31508003668194B0B4402F5122202F5F862934201D966
-S315080036780621B8E70721B6E70F21B4E70E21B2E716
-S315080036880D21B0E70C21AEE70B21ACE70A21AAE722
-S315080036980921A8E70821A6E7405327FFFF340C00AD
-S315080036A8401E1BFF3F420F0000DC0BFF7F4F120036
-S315080036B8808CF9FE60B6E5FE5FE3160000D3CEFE01
-S315080036C8C05BB3FE00CA91FEE05459FE836843F016
-S315080036D80103836000207047836823F00103836031
-S315080036E80020704708B5C36823F0C043C3600129A2
-S315080036F809D069B9C36843F08043C3603220FDF72F
-S315080037080BFA002008BDC36843F00053C360F5E709
-S315080037180120F7E7890141F02001016100230133FF
-S31508003728054A934205D8026912F0200FF7D10020FE
-S3150800373870470320704700BF400D0300102303613C
-S3150800374800230133054A934205D8026912F0100F7F
-S31508003758F7D1002070470320704700BF400D0300CB
-S31508003768D0F800381943C0F8001800207047000040
-S3150800377884B02DE9F041044607A880E80E002546DE
-S31508003788002306E003F1400204EB8202002151609F
-S3150800379801330E2BF6D9119B23BBD4F8043843F012
-S315080037A80203C4F80438A36B23F40013A36323683D
-S315080037B843F040032360236843F080032360002313
-S315080037C8C4F8003E04F50066D4F80038C4F8003892
-S315080037D80C9B012B10D1099B4BB900212046FFF7FA
-S315080037E8BFFF0DE0A36B43F40013A363E7E70121CA
-S315080037F82046FFF7B5FF03E003212046FFF7B0FF91
-S3150800380810212046FFF786FF804608B14FF00108C9
-S315080038182046FFF793FF08B14FF0010800233361EC
-S315080038287361F3610AE0C3B94FF00060C2F8000992
-S3150800383800220A614FF67F328A6001330799994256
-S3150800384810D905EB431202F51061D2F800090028D1
-S31508003858E9DB0020C2F80009EAE74FF09040C2F811
-S315080038680009E5E700230AE0BBB14FF09047C2F824
-S31508003878007B002202614FF67F328260013399424B
-S3150800388810D905EB431202F53060D2F8007B002FF9
-S31508003898EADB0027C2F8007BEBE74FF00067C2F8BF
-S315080038A8007BE6E7336923F4807333610023A36159
-S315080038B86FF0804363610A9B1BB9A36943F0100341
-S315080038C8A361A2690A4B1343A3610D9B1BB1A369A4
-S315080038D843F00803A361119B012B04D04046BDE8B9
-S315080038E8F04104B07047A269024B1343A361F5E798
-S315080038F800383C8004000040D0F8083813F0060366
-S3150800390805D0062B18BF022B03D1022070470020CA
-S3150800391870470F207047000070B40B784A78012A60
-S3150800392820D0D0F81C2803F00F060124B44042EA38
-S315080039380442C0F81C2800EB4310D0F8003B13F4E7
-S31508003948004F0CD1D0F8002B8B68C3F30A03C9784B
-S3150800395843EA81431343134A1A43C0F8002B00204D
-S3150800396870BC7047D0F81C4803F00F06B24092B2F4
-S315080039782243C0F81C2800EB4310D0F8002912F49B
-S31508003988004FECD1D0F800498A68C2F30A02C97810
-S3150800399842EA814242EA83532343024A1A43C0F859
-S315080039A80029DCE70080001030B40B784A78012A31
-S315080039B824D000EB4313D3F8002B002A50DBD0F8A9
-S315080039C83C580A7802F00F02012404FA02F225EAA2
-S315080039D80242C0F83C28D0F81C28097801F00F01E3
-S315080039E88C4022EA0444C0F81C48D3F8001B234A32
-S315080039F80A40C3F8002B002030BC704700EB43137D
-S31508003A08D3F80029002A1EDBD0F83C580A7802F0B9
-S31508003A180F02012404FA02F292B225EA0202C0F859
-S31508003A283C28D0F81C28097801F00F018C40A4B26C
-S31508003A3822EA0404C0F81C48D3F80019104A0A40B8
-S31508003A48C3F80029D7E7D3F8002942F00062C3F87B
-S31508003A580029D3F8002942F08042C3F80029D3E7A1
-S31508003A68D3F8002B42F00062C3F8002BD3F8002BDA
-S31508003A7842F08042C3F8002BA1E700BF0078F3EFB5
-S31508003A88007833EC70B40B784C78012C24D000EB12
-S31508003A98431000F530631D693E4C2C401C611D69B6
-S31508003AA83D4C2C401C614C690CB18C684C611C69F6
-S31508003AB844F400241C611C698D68C5F312052C435F
-S31508003AC81C61012A61D0D0F8003B43F00443C0F8D2
-S31508003AD8003B002070BC70474C695CBB00EB431484
-S31508003AE8D4F810692C4D3540C4F81059D4F8105933
-S31508003AF845F40025C4F81059D4F81069254D354001
-S31508003B08C4F81059012A31D000EB4313D3F8002919
-S31508003B1842F00442C3F800294B69002BD9D0D0F8E3
-S31508003B283428097801F00F040121A1400A43C0F896
-S31508003B383428CEE700EB431404F510642669154DBE
-S31508003B48354025612669144D354025614E698D68CD
-S31508003B58AE4200D94D61256945F4002525612569D8
-S31508003B684E69C6F3120635432561CBE70A691AB1C9
-S31508003B7800EB4311C1F8142900EB4310D0F80029CB
-S31508003B8842F00442C0F80029A3E7CA68002A9AD076
-S31508003B985A6198E70000F8FFFFFF07E070B49DF840
-S31508003BA80C4064B903339D0807E000EB023303F5BC
-S31508003BB8805351F8046B1E600134AC42F5D30020DB
-S31508003BC870BC7047F0B583B00B784C78012C29D0B7
-S31508003BD800EB431303F5306426697D4D35402561AE
-S31508003BE826697C4D354025614D69002D40F0C18018
-S31508003BF825698E68C6F3120635432561256945F495
-S31508003C0800252561012A00F0C980CA78012A00F032
-S31508003C18CB80D3F8002B42F00442C3F8002B0020CF
-S31508003C2803B0F0BD4C6974BB00EB4314D4F81069B3
-S31508003C38684D3540C4F81059D4F8105945F400258C
-S31508003C48C4F81059D4F81069614D3540C4F81059AC
-S31508003C58012A4AD000EB4313D3F8004944F0044438
-S31508003C68C3F80049CC78012C68D04B69002BD6D00C
-S31508003C78D0F83428097801F00F040121A1400A4335
-S31508003C88C0F83428CBE700EB4314D4F81069504D34
-S31508003C983540C4F81059D4F810694E4D3540C4F863
-S31508003CA81059D4F810694D698F683D44013DB5FB34
-S31508003CB8F7F5494F07EAC5453543C4F81059D4F806
-S31508003CC810594E69C6F312063543C4F8105904F557
-S31508003CD81064CD78012DBBD1256925F0C04525612D
-S31508003CE8256945F000552561B2E70A691AB100EB5E
-S31508003CF84314C4F81429CA78012A08D000EB4313D8
-S31508003D08D3F8002942F00442C3F8002987E7D0F817
-S31508003D18082812F4807F08D100EB4311D1F800294E
-S31508003D2842F00052C1F80029E8E700EB4311D1F840
-S31508003D38002942F08052C1F80029DFE7D0F8084880
-S31508003D4814F4807F0ED1D3F8004944F00054C3F820
-S31508003D58004914460B46C9681A789B8A0094FFF7E7
-S31508003D681DFF5CE7D3F8004944F08054C3F80049BE
-S31508003D78EFE78E683544013DB5FBF6F52669164F1B
-S31508003D8807EAC5473E43266127698E68ADB206FB32
-S31508003D9805F5C5F312053D43256133E7CA68002AC8
-S31508003DA83FF433AF626130E7D0F8082812F4807F11
-S31508003DB806D1D3F8002B42F00052C3F8002B28E7A7
-S31508003DC8D3F8002B42F08052C3F8002B21E700BF36
-S31508003DD80000F8FFFFFF07E00000F81F033292080B
-S31508003DE8002393420CD210B400F58054246841F895
-S31508003DF8044B01339342F7D308465DF8044B7047E2
-S31508003E08084670470B784A78012A14D000EB431005
-S31508003E18D0F8002B002A06DB2BB1D0F8003B23F09C
-S31508003E288043C0F8003BD0F8003B43F40013C0F8C1
-S31508003E38003B0020704700EB4310D0F80029002A01
-S31508003E4806DB2BB1D0F8003923F08043C0F80039D7
-S31508003E58D0F8003943F40013C0F80039E9E70B78BD
-S31508003E684A78012A0ED000EB4310D0F8003B23F419
-S31508003E780013C0F8003BCB78023BDBB2012B15D9FF
-S31508003E880020704700EB4310D0F8003923F40013DC
-S31508003E98C0F80039CB78023BDBB2012BF0D8D0F852
-S31508003EA8003943F08053C0F80039E9E7D0F8003BF9
-S31508003EB843F08053C0F8003BE2E738B505460446A8
-S31508003EC8002208E004EB42134FF67F31C3F80819BD
-S31508003ED8C3F8081B01320E2AF4D90022C5F810289F
-S31508003EE8C5F81428C5F81C282846FFF727FC0346F2
-S31508003EF808B1184638BD10212846FFF70BFC0346BB
-S31508003F08F7E7D0F8003823F4FE63C0F80038D0F88D
-S31508003F180038090101F4FE610B43C0F80038002097
-S31508003F28704708B5D0F8043823F00203C0F80438F7
-S31508003F380320FCF7F1FD002008BD08B5D0F80438C1
-S31508003F4843F00203C0F804380320FCF7E5FD002017
-S31508003F5808BD4269806910407047D0F8183800F5DE
-S31508003F680060C0691840000C7047D0F8183800F58A
-S31508003F780060C069184080B2704700EB4111D1F85B
-S31508003F88082B00F5006040691040704710B4D0F857
-S31508003F981048D0F8343801F00F02D340DB01DBB201
-S31508003FA8234300EB411000F51060806818405DF85F
-S31508003FB8044B7047406900F001007047D0F80029A3
-S31508003FC8054B1340C0F80039D0F8043843F4807319
-S31508003FD8C0F804380020704700F8FFFF10B4046CD6
-S31508003FE8154B9C4203D9D0F8003B002B16DB00245E
-S31508003FF8C0F8104BD0F8104B44F40024C0F8104B06
-S31508004008D0F8104B44F01804C0F8104BD0F8104BF1
-S3150800401844F0C044C0F8104B012903D000205DF8CD
-S31508004028044B7047C0F8142BD0F8003B43F08023A4
-S31508004038C0F8003BF2E700BF0A30544F014B18603E
-S31508004048704700BF00000024C0B108B50346D0F881
-S31508004058B80210B10020C3F8B802D3F8CC0210B1E0
-S315080040680020C3F8CC0209B1C3F8B41218460123D4
-S3150800407880F89C32027001F0C9FF08BD032070471A
-S3150800408810B50446012380F89C32D0F8B83213B12B
-S315080040985B6801799847D4F8CC3213B10023C4F881
-S315080040A8CC32204602F024F8034608B1184610BD5B
-S315080040B8204602F00DF80346F8E710B582B000234B
-S315080040C8ADF8063059B10446C4F8B812CB6A0DF1F2
-S315080040D806009847C4F8CC02002002B010BD032099
-S315080040E8FBE708B501F0FCFF08BD08B5D0F8B832FB
-S315080040F813B11B68984708BD0320FCE708B5D0F834
-S31508004108B8320BB15B689847002008BD38B5044635
-S3150800411800F2AA25284600F02DF90123C4F894329E
-S31508004128B4F8B032C4F8983294F8AA1201F01F030A
-S31508004138012B0DD03BB1022B0FD001F08001204690
-S3150800414801F0F1FF03E02946204600F0CEFA38BD13
-S315080041582946204600F004FBF9E72946204600F0E0
-S3150800416833FBF4E710B5044629BB1346D0F8942266
-S31508004178032A01D0002029E0D0F85C11D0F8602184
-S3150800418891420DD8D0F8B8321B6923B190F89C2211
-S31508004198032A00D19847204600F067FC002015E05E
-S315080041A8891AC0F85C118A4228BF0A46194600F0DF
-S315080041B854FC00200AE00A46D0F8B8329B6933B1A5
-S315080041C890F89C12032904D11146984710BD03207C
-S315080041D8FCE70320FAE710B50446002946D113463A
-S315080041E8D0F89422022A05D094F8A032012B39D0A7
-S315080041F8002046E0C269016A8A4213D88A421DD05D
-S31508004208D4F8B832DB682BB194F89C22032A01D17A
-S31508004218204698478021204601F085FF204600F071
-S315080042282FFCE1E7521AC261194600F00EFC00237A
-S315080042381A461946204601F096FFD5E7836999423A
-S31508004248DED8D0F898229342DAD20022114600F036
-S31508004258FCFB0021C4F898120B460A46204601F0D2
-S3150800426882FFC1E7002084F8A0020AE00A46D0F8CF
-S31508004278B8325B6933B190F89C12032904D1114608
-S31508004288984710BD0320FCE70320FAE770B50446F3
-S31508004298012380F89C320023C0F894324360C0F8A2
-S315080042A8A432D0F8BC3223B1D0F8B8325B68002102
-S315080042B89847402300221146204601F021FF01268F
-S315080042C8A4F864614025C4F860512B460022802171
-S315080042D8204601F015FFA6842562002070BD0174EA
-S315080042E80020704790F89C3280F89D32042380F8A5
-S315080042F89C320020704790F89C32042B01D000208D
-S31508004308704790F89D3280F89C32F8E708B590F81F
-S315080043189C32032B01D0002008BDD0F8B832DB69DF
-S31508004328002BF8D09847F6E700207047002070471A
-S315080043380020704708B5012380F89C32D0F8B832B7
-S3150800434813B15B6801799847002008BD002302E08D
-S315080043580133DBB201300278002AF9D118467047D2
-S3150800436808B54B88012B00D008BDC0F8A43200F068
-S315080043787CFBF9E70B7803704B7843708B78CA781F
-S3150800438843EA022343800B794A7943EA0223838066
-S315080043988B79CA7943EA0223C380704710B5044665
-S315080043A8802101F0C0FE0021204601F0BCFE10BDA8
-S315080043B830B583B004460D460023ADF806304A8862
-S315080043C8130A013B062B00F2AB80DFE803F0041F53
-S315080043D833A9A98D9A00D0F8B4321B680DF10601E5
-S315080043E8007C9847EA88002A00F0A380BDF80630C2
-S315080043F8002B00F099809A4228BF1A46ADF8062085
-S315080044080146204600F014FB03B030BD037C43B9CF
-S31508004418D0F8B8329B6A0DF1060098470223437014
-S31508004428E0E7D0F8B832DB6A0DF1060098470223B0
-S315080044384370D7E7D2B2052A52D8DFE802F003104C
-S315080044481D2A3744D0F8B4325B6823B10DF106014A
-S31508004458007C9847C6E72946FFF7A0FFD4E7D0F8B7
-S31508004468B4329B6823B10DF10601007C9847B9E779
-S315080044782946FFF793FFC7E7D0F8B432DB6823B1BC
-S315080044880DF10601007C9847ACE72946FFF786FF39
-S31508004498BAE7D0F8B4321B6923B10DF10601007CDE
-S315080044A898479FE72946FFF779FFADE7D0F8B43272
-S315080044B85B6923B10DF10601007C984792E7294606
-S315080044C8FFF76CFFA0E7D0F8B4329B6923B10DF16A
-S315080044D80601007C984785E72946FFF75FFF93E7BB
-S315080044E82946FFF75BFF8FE7037C33B9D0F8B83264
-S315080044F85B6B0DF10600984774E72946FFF74EFFF0
-S3150800450882E7037C43B9D0F8B8321B6B0DF1060075
-S3150800451898470723437065E72946FFF73FFF73E780
-S315080045282946FFF73BFF6FE729462046FFF736FF80
-S315080045386AE7204600F099FA66E738B504468B8894
-S31508004548F3B9CB88E3B94B887F2B19D803F07F05D5
-S3150800455890F89C32032B0CD080F89E52294601F01D
-S31508004568F2FD204600F081FA35B1022384F89C3220
-S3150800457809E0FFF713FF06E0012384F89C3202E0FE
-S315080045882046FFF70BFF38BD70B504460D468978F7
-S315080045982E4B197001290FD890F89C32022B11D08E
-S315080045A8032B25D02946FFF7F9FE284B197820460C
-S315080045B8FFF7A4FD032603E02946FFF7EFFE0326C7
-S315080045C8304670BD81B14160FFF78FFD064620B1C0
-S315080045D829462046FFF7E2FEF2E7204600F045FAAC
-S315080045E8032384F89C32EBE700F03FFA0026E7E756
-S315080045F8C9B14368994225D0D9B2FFF77FFD134B55
-S31508004608197861602046FFF770FD0646B0B129465D
-S315080046182046FFF7C3FE21792046FFF76FFD0223E0
-S3150800462884F89C32CCE7022380F89C324160FFF775
-S3150800463865FD204600F019FA0026C1E7204600F075
-S3150800464814FABDE700F011FA0026B9E7EC000024D1
-S3150800465808B5CB88012B0BD190F89C329BB1022B5D
-S3150800466809D9032B0FD10122011D00F0E1F901E058
-S31508004678FFF794FE08BD0146002341F8083F0122CA
-S3150800468800F0D6F9F6E7FFF789FEF3E708B590F8DC
-S315080046989C32013B022B12D8CB88022B0CD1012362
-S315080046A8C360D0F8A4320BB10323C360022200F119
-S315080046B80C0100F0BDF908BDFFF770FEFBE7FFF730
-S315080046C86DFEF8E708B590F89C32013B022B09D82D
-S315080046D84B88012B00D008BD0023C0F8A43200F08F
-S315080046E8C4F9F8E7FFF75AFEF5E708B50B7803F0BB
-S315080046F86003202B06D0402B04D043B1FFF74EFEAB
-S31508004708002003E0D0F8B8329B68984708BD4B7874
-S31508004718092B21D8DFE803F0141C201820090520E6
-S31508004728100DFFF745FE0020F0E7FFF706FF00200B
-S31508004738ECE7FFF729FFE9E7FFF78AFF0020E5E737
-S31508004748FFF7A4FF0020E1E7FFF70AFE0020DDE7F0
-S31508004758FFF7B8FF0020D9E7FFF720FE0020D5E7C6
-S3150800476870B505460C460B7803F06003202B07D076
-S31508004778402B05D023B1FFF711FE0026304670BD41
-S3150800478895F89C32013B022B18D82379012B0FD8B0
-S31508004798D5F8B8329B682146284698470646E388DE
-S315080047A8002BEBD10028E9D1284600F05EF9E5E7A9
-S315080047B821462846FFF7F2FD0026DFE72146284668
-S315080047C8FFF7ECFD0026D9E738B505460C468A8872
-S315080047D80B7803F06003202B08D0D1B2402B05D004
-S315080047E85BB12146FFF7DAFD002005E0D5F8B832B7
-S315080047F89B6821462846984738BD6378012B38D0E8
-S31508004808002B6BD0032B40F0F08090F89C32022BDB
-S3150800481806D0032B19D02146FFF7C0FD0020EBE789
-S31508004828B1F1800318BF0123002908BF00233BB153
-S3150800483801F079FC8021284601F075FC0020DBE7A9
-S315080048482146FFF7ABFD0020D6E763884BB9B1F1DF
-S31508004858800318BF0123002908BF00230BB1E3888A
-S3150800486823B1284600F001F90020C5E701F05BFCF2
-S31508004878F7E790F89C32022B06D0032B19D021466D
-S31508004888FFF78CFD0020B7E7B1F1800318BF0123B5
-S31508004898002908BF00233BB101F045FC80212846C2
-S315080048A801F041FC0020A7E72146FFF777FD002025
-S315080048B8A2E76388002B40F09D8011F07F0F0AD18C
-S315080048C8284600F0D2F8D5F8B8329B68214628461B
-S315080048D89847002090E701F02EFCF1E790F89C3203
-S315080048E8022B06D0032B2FD02146FFF757FD0020B1
-S315080048F882E7B1F1800318BF0123002908BF002306
-S315080049089BB912F0800F15D101F07F0101EB8101E7
-S315080049188B0003F5A8710144043100240C600222B7
-S31508004928284600F085F8204666E72146FFF736FD53
-S31508004938002061E701F07F0101EB81018B0003F19B
-S31508004948100101440431E8E752B2002A24DB01F0D9
-S315080049580F0303EB830398002844B0F8643153B374
-S31508004968002A2EDB01F07F0202EB8202930003F590
-S31508004978A8742C440434802914BF00230123002971
-S3150800498808BF01233BB30023236002222146284699
-S3150800499800F04EF800202FE701F00F0303EB83031E
-S315080049A898002844838C002BDAD121462846FFF73D
-S315080049B8F5FC002020E721462846FFF7EFFC0020F3
-S315080049C81AE701F07F0202EB8202930003F1100452
-S315080049D82C440434CFE7284601F054FB10B10123D0
-S315080049E82360D2E700232360CFE72146FFF7D6FCEA
-S315080049F8002001E70020FFE6C8B170B50D46164647
-S31508004A080446FFF7A3FC01304000308028700323D2
-S31508004A186B70022307E0EA5401345A1CD2B200210B
-S31508004A28A9540233DBB22278002AF4D170BD704744
-S31508004A3810B513460222C0F894228361C3610A4658
-S31508004A48002101F088FB002010BD08B513460A4668
-S31508004A58002101F080FB002008BD08B513460A4668
-S31508004A68002101F080FB002008BD08B50423C0F822
-S31508004A78943200231A46194601F06DFB002008BD3A
-S31508004A8808B50523C0F8943200231A46194601F0DA
-S31508004A986AFB002008BD72B6704762B67047000008
-S31508004AA8F0B4194D2C6D24F040542C65002401E00F
-S31508004AB80134E4B2112C23D8144D15F8146005EB0B
-S31508004AC844056F78F51905FB00054FF4FA5CBCFB3D
-S31508004AD8F5FC05FB0CF5B5F5FA5FE9D135463D4415
-S31508004AE805FB000C4FF4FA55B5FBFCF50D80013DA6
-S31508004AF8ADB2B5F5007FDBD216701F70012000E055
-S31508004B080020F0BC704700BF00440258F062000855
-S31508004B1870B58CB00022ADF82E208DF82D200CAB80
-S31508004B2803F8042D0DF12D020DF12E014FF4FA703C
-S31508004B38FFF7B6FF002842D0234C244B23600025F4
-S31508004B48A560E560012626746574A574BDF82E303F
-S31508004B586361A6619DF82D30E3619DF82C302362C8
-S31508004B686662A662E66226636563A663E5632664EB
-S31508004B7804236364A564E36425656365A565E6653A
-S31508004B8825666566A3662046FCF75EF903950495CF
-S31508004B980596069640F2676307930893099503A94D
-S31508004BA82046FCF79BFA0096334602221146204611
-S31508004BB8FCF7D7FA2046FCF7F0FA0CB070BDB82116
-S31508004BC8034800F08BFDB7E7F000002400A000407A
-S31508004BD8B462000810B58AB040F2E1730193002365
-S31508004BE8029303930904049105930693079308937C
-S31508004BF8522309930123024601A90E48FCF7E7FA4E
-S31508004C0808B10AB010BD01210A48FCF716FB0028AE
-S31508004C18F7D100F071FB00F1320401210548FCF7D1
-S31508004C28FDFB0028EDD000F063FE00F065FBA0420E
-S31508004C38F3D9E6E7F000002430B58BB004460D46F4
-S31508004C4840211048FCF7F3FB10B900200BB030BD23
-S31508004C5823466A4640210B48FCF702FB68B9009AC6
-S31508004C6840F267639A4201D00020EFE7019B33B907
-S31508004C789DF80E302B700120E8E70020E6E70020B3
-S31508004C88E4E700BFF000002408B5FFF704FF08BDF5
-S31508004C9810B500F03DFA00B910BDFBF721FB002856
-S31508004CA8FAD000F0CFFDFBF793FE00F0FBFA00F010
-S31508004CB833FA054B0340054A936000F02DFA446819
-S31508004CC8FFF7EBFEA047E7E780FFFF1F00ED00E0D0
-S31508004CD870B508E04D1C461C0B78037000F008FEFA
-S31508004CE8304629462246531E9CB2002AF2D170BD88
-S31508004CF838B50546002401E00134E4B20E2C12D872
-S31508004D0800F0F6FD04EB44029300084AD358AB4278
-S31508004D18F2D804EB44029100044A0A445268134440
-S31508004D28AB42E9D900E0FF24204638BD14630008E1
-S31508004D3808B5C1F3090353B903688B4209D040F88B
-S31508004D48041B4FF48062FFF7C3FF012000E0002030
-S31508004D5808BD0120FCE72DE9F04107460068FFF782
-S31508004D68C7FFFF282CD0FCF771FB00264FF0010877
-S31508004D7805E04FF00008B8F1000F1CD001361F2EC9
-S31508004D8819D83D68740125443C44043400F0B0FD44
-S31508004D98224629460120FCF721FC50B900231F2B7F
-S31508004DA8E9D8595DE25CD2B29142E2D10133DBB26D
-S31508004DB8F5E74FF00008FCF777FB4046BDE8F081B9
-S31508004DC84FF00008F9E7000070B50E460E4B9842FA
-S31508004DD812D004460D4B994209D10B4D2C4625B1E4
-S31508004DE831462046FFF7A4FF58B1284670BDFFF79D
-S31508004DF8B2FF20B12546F2E7054D2C46EFE7002518
-S31508004E08EDE70025F1E700BF940500240000020835
-S31508004E18900100242DE9F84305460C4617461E4618
-S31508004E28DFF8848001EA08080368B3F1FF3F0AD06F
-S31508004E382B6843450ED14FF00109B9F1010F12D07D
-S31508004E484846BDE8F8834146FFF772FF81460028C1
-S31508004E58F3D0EDE741462846FFF7B6FF0546E8B121
-S31508004E684FF00109E9E72B68E41A2C44043405E0F5
-S31508004E7817F8013B04F8013B013EE1D000F038FD84
-S31508004E882B1DE31AB3F5806FF2D308F5806128461F
-S31508004E98FFF79AFF054620B1041DE9E74FF0000918
-S31508004EA8CEE74FF00009CBE700FCFFFF70B586B0E8
-S31508004EB804460D4600230093884203D80E2937D89E
-S31508004EC8012600E0002616B9304606B070BDFCF784
-S31508004ED8BDFAAC4227D800F00BFD164963002344F7
-S31508004EE89A008B188A585B68002B18BFB2F1FF3FE7
-S31508004EF818D000230193202305930A46630018193E
-S31508004F08810008461144497A02910244137A0393A8
-S31508004F1801230493694601A8FCF730FC30B901342B
-S31508004F28E4B2D6E70026FCF7BFFACDE70026FAE78B
-S31508004F380026C9E7146300084FF0FF33024A1360D6
-S31508004F48024A1360704700BF9001002494050024A4
-S31508004F5870B504460D4616464A1E154B1B1A9A4244
-S31508004F6803D9002001280CD070BDFFF7C1FEFF2821
-S31508004F781AD028190138FFF7BBFEFF2816D00120DA
-S31508004F88F0E70C4B23400C4A934206D02B46324690
-S31508004F9821460A48FFF73EFFE6E72B4632462146F2
-S31508004FA80748FFF737FFDFE70020DDE70020DBE7E4
-S31508004FB8FFFF1F0800FCFFFF0000020890010024FD
-S31508004FC89405002470B54A1E0F4B1B1A9A4205D938
-S31508004FD8FF210E460020012812D070BD05460C4652
-S31508004FE8FFF786FE064660190138FFF781FE014677
-S31508004FF8FF2818BFFF2E01D00120ECE70020EAE7BA
-S315080050083046FFF753FFE8E7FFFF1F08104B1B68FA
-S31508005018B3F1FF3F1AD000B583B00D4A53689168BB
-S315080050280B44D1680B4411690B4451690B449169C7
-S315080050380B44D26913445B4202AA42F8043D042190
-S315080050480448FFF785FF03B05DF804FB01207047A5
-S3150800505894050024980202080D4B1B680D4A12682D
-S315080050681A440D4B1B6813440C4A126813440C4A1D
-S3150800507812681A440B4B1B681A440B4B1B681344DB
-S315080050880A4A1268DA4201D00020704701207047A0
-S315080050980000020804000208080002080C000208BA
-S315080050A810000208140002081800020898020208EC
-S315080050B808B50D4B1B68B3F1FF3F0BD10B4B1B68AB
-S315080050C8B3F1FF3F0DD00948FFF745FE034648B13F
-S315080050D8012307E00448FFF73EFE03460028EDD102
-S315080050E800E00123184608BD940500249001002411
-S315080050F8004870470000020808B5FFF71DFF08BDFD
-S3150800510808B5FFF725FF08BD08B5FFF75BFF08BD1B
-S3150800511808B5FFF7A1FF08BD08B5FFF7E9FF08BD01
-S3150800512808B5FFF773FF034608B9184608BDFFF721
-S31508005138BFFF0346F9E70000054BDB6913F0200FAC
-S3150800514804D0034B5B6A0370012070470020704740
-S315080051580048004010B5094B986200F0CDF800F1F8
-S315080051680A04064BDB6913F0800F05D100F0C0FB73
-S3150800517800F0C2F8A042F4D910BD00BF00480040AC
-S3150800518810B588B00D4C236823F00103236000236B
-S3150800519800934FF4614201920293039304930C22FD
-S315080051A805920693079369462046FEF709F9236888
-S315080051B843F00103236008B010BD00BF0048004053
-S315080051C870B506460D46402904D82846FFF7C2FF9B
-S315080051D800240BE08421074800F080FAF5E700F080
-S315080051E887FB305DFFF7B6FF0134A4B2ABB2A34222
-S315080051F8F5D870BDC863000870B5254B1C78BCB9CE
-S315080052082448FFF799FF012801D0204670BD214B95
-S315080052181B78013BDBB23F2BF7D800F06DF81E4B25
-S3150800522818601E4B00221A70194B01221A70ECE7F7
-S3150800523806460D46194B1B78013316481844FFF7DE
-S315080052487BFF0446012815D1144B1A780132D2B2CD
-S315080052581A70104B1B789A4201D00024D5E71049DA
-S315080052683046FFF735FD0A4B00221A700B4B1B78A0
-S315080052782B70CAE700F040F8074B1B68643398425E
-S3150800528803D90024024B1C70BFE70024BDE700BF02
-S31508005298D909002498090024DC090024DA0900241D
-S315080052A899090024024B00221A605A609A607047CE
-S315080052B810E000E008B5FFF7F5FF054B054A5A6008
-S315080052C800229A6005211960034B1A6008BD00BFC1
-S315080052D810E000E0FF520700E0090024044B1B68B1
-S315080052E813F4803F03D0034A1368013313607047E9
-S315080052F810E000E0E009002408B5FFF7EFFF014BCE
-S31508005308186808BDE009002408B5FFF7F5FF08BDC9
-S31508005318094B03F11801002232B19A7400225A6126
-S31508005328064B054A1A6070479A745961183318313A
-S315080053380132D2B2F0E700BF240A0024540A002436
-S315080053480A4B1B6883B110B45C69084A146019745F
-S315080053589860D86000225A74186001390844586061
-S31508005368987C5DF8044B7047FF207047540A002460
-S3150800537838B504460D4601281CD862002244D100D7
-S31508005388114B0B445A7C1B7C9A4219D00E4B0B4482
-S31508005398DA6815705A7C01325A74DA680132DA60AA
-S315080053A85B689A420ED9084A084651580244D160A1
-S315080053B8012038BD4FF4E171044800F08FF9DCE7A5
-S315080053C80020F6E70120F4E7240A00240864000808
-S315080053D808B50146024B1878FFF7CAFF08BD00BF93
-S315080053E8580A002438B504460D4601281ED804EB89
-S315080053F84403DA00124B13445B7CEBB16200224487
-S31508005408D1000F4B0B449A6812782A705A7C013AD5
-S315080054185A749A6801329A605B689A420ED9084AA1
-S315080054280846515802449160012006E04FF4F2718B
-S31508005438044800F053F9DAE7002038BD0120FCE7F4
-S31508005448240A00240864000808B50146024B18789F
-S31508005458FFF7C8FF08BD00BF9C0A002410B504461C
-S31508005468012804D94FF40171044800F037F904EB10
-S315080054784404E200024B1344587C10BD0864000833
-S31508005488240A002438B5FFF743FF1B4C4021601C4B
-S31508005498FFF756FF2070194D4021681CFFF750FF8B
-S315080054A828702378FF2B1DD0FF281BD0144C002208
-S315080054B814492046FEF7C8FD13492046FEF7FDFDA8
-S315080054C80120FAF724FF2046FEF70BFEFDF7C4F97C
-S315080054D8D4F8C402FCF7ECFF00F02CF9B0F5FA6F23
-S315080054E805D338BD8521094800F0F8F8DEE74FF4FA
-S315080054F8FA6000F019F9F4E7580A00249C0A00240F
-S31508005508E00A00247800002414000024086400082F
-S3150800551810B5064CD4F8C402FCF7E8FF2046FEF797
-S31508005528AFFD0020FAF7F3FE10BD00BFE00A00241D
-S3150800553870B506460D463F2906D82846FFF748FFA0
-S31508005548012806D100240BE0BB210D4800F0C6F857
-S31508005558F3E7BF210A4800F0C1F8F3E70134A4B21B
-S31508005568ABB2A3420BD900F0C3F9305DFFF730FFA1
-S315080055780128F3D0C821024800F0B0F8EEE770BD5C
-S315080055880864000870B506460D461F4BD3F8C402D2
-S31508005598FCF71AFD1D4B1C789CB91D48FFF754FFEC
-S315080055A8012801D0204670BD194B1B78013BDBB298
-S315080055B83E2BF7D8154B01221A70164B00221A7083
-S315080055C8F0E7144B1B78013311481844FFF73CFFE2
-S315080055D80446012801D00024E4E70E4B1A78013264
-S315080055E8D2B21A700A4B1B789A4201D00024D9E71E
-S315080055F809493046FFF76CFB044B00221A70054B25
-S315080056081B782B70CEE700BFE00A0024F00D0024B3
-S31508005618B00D0024F10D0024B10D002430B583B077
-S31508005628144B1878FFF71AFF08B30546402800D91F
-S315080056384025002405E09DF807200F4B1A5501342C
-S31508005648E4B2A5420DD90DF107010A4B1878FFF700
-S31508005658C9FE0128EFD04FF4A471084800F03EF8B7
-S31508005668E9E72B46044A8121054800F074FD03B092
-S3150800567830BD00BF580A0024E4090024086400085D
-S31508005688E00A002470B5044600F0A8FB0646214641
-S315080056980F4800F00EFD85B2002401E00134A4B2DB
-S315080056A8AC420CD2315D0B4B1878FFF761FE012826
-S315080056B8F4D04FF4B571084800F010F8EEE700F09A
-S315080056C88DFB402302460121014800F04CFD70BDC0
-S315080056D8E00A00249C0A00240864000808B500F0BB
-S315080056E807F9FCE708B500F0F7F8012803D00B4BD3
-S315080056F81B78012B00D008BDFFF7FEFD084B1B6879
-S31508005708084A1268134403F5FA739842F3D3034B0D
-S3150800571800221A70FFF7BCFAEDE700BFF80D00245F
-S31508005728F40D0024FC0D0024014B1860704700BFD7
-S31508005738F40D0024014B1868704700BFF40D0024C7
-S3150800574808B5054B1B78012B00D008BDFFF7D4FD1B
-S31508005758024B1860F9E700BFF80D0024FC0D002479
-S3150800576808B5044B01221A70FFF7EAFFFFF7BAFFDC
-S3150800577808BD00BFF80D002408B5FFF785FA00F044
-S31508005788B3F8FFF797FDFFF7B7FC00F00DF8FFF73A
-S31508005798E7FF08BD08B500F0ABF8FFF79FFD00F076
-S315080057A817F8FFF79FFF08BD10B500F00FFAFFF7C7
-S315080057B8AFF9064C01232370FFF7E2FC0023237098
-S315080057C8FFF760FE0223237010BD00BF10000024F7
-S315080057D800B583B00DF107011848FFF72DFA01281F
-S315080057E810D00DF107011548FFF706FD012812D05C
-S315080057F80DF107011148FFF7C5FE012814D003B0BB
-S315080058085DF804FB0E4B01221A709DF807100B4829
-S3150800581800F0FCF9E5E70A4B00221A709DF8071014
-S31508005828064800F0F3F9E3E7054B02221A709DF8DB
-S315080058380710024800F0EAF9E1E700BF000E002465
-S315080058481000002408B5FFF763FE08BD38B50446FE
-S315080058580D460E4B1B78012B09D00C4B1B7853B100
-S315080058680A4B1B78022B0BD000F0C8F938BDC9B211
-S31508005878FFF7B0F9F1E7E9B22046FFF7A1FCEFE731
-S31508005888E9B22046FFF754FEEEE700BF10000024F1
-S31508005898074B1B78022B05D0032B05D0012B05D007
-S315080058A8402070473F2070470020704708207047FF
-S315080058B810000024074B1B78022B05D0032B05D0B4
-S315080058C8012B05D0402070473F20704700207047BD
-S315080058D8082070471000002408B500F085F903462B
-S315080058E800B10123184608BD08B5FAF707FD08BD33
-S315080058F808B5FAF708FD08BD014B00225A7070472B
-S31508005908400E0024034BFE22DA7018710222A3F80F
-S3150800591844207047400E002410B5054C0023237018
-S31508005928FFF7EAFFFF23E3700123A4F8443010BD0C
-S31508005938400E0024064BFF22DA7000221A715978A5
-S3150800594859719A71DA711A720622A3F844207047B7
-S31508005958400E002408B50020FFF7D4FF08BD000054
-S31508005968074BFF22DA70074A9A6400221A715A719D
-S315080059789A710722C3F807200822A3F8442070471B
-S31508005988400E002444640008044BFF22DA7042687B
-S315080059989A640122A3F84420704700BF400E0024E9
-S315080059A808B53120FFF7AEFF08BD000038B5084C2A
-S315080059B8FF23E370002525716571FFF769FFA0715C
-S315080059C8E571257265720723A4F8443038BD00BF0F
-S315080059D8400E002438B5FFF78FFF0E4C01252570B9
-S315080059E8FF23E3701023237100236371FFF750FF29
-S315080059F8A071FFF75FFFE071FFF75CFFC0F30720B0
-S31508005A0820726572A5720823A4F84430FFF774FB60
-S31508005A1838BD00BF400E002438B505464478FFF760
-S31508005A2837FF0138844210DC0A4C6A78A16C201DBD
-S31508005A38FFF74EF9FF23E3706A78A36C1344A3644F
-S31508005A486B780133A4F8443038BD2220FFF75AFF93
-S31508005A58FAE700BF400E002438B504464578FFF734
-S31508005A6817FF0138854211DC61680A4DA964627816
-S31508005A78281DFFF72DF9FF23EB706278AB6C1344EA
-S31508005A88AB6463780133A5F8443038BD2220FFF7A4
-S31508005A9839FFFAE7400E0024F8B5054617460024EC
-S31508005AA806E015F8013B1C44E4B2FFF721FF31462E
-S31508005AB84E1E0029F5D13C600120F8BD10B5084CEA
-S31508005AC8FF23E370E21D4168A06CFFF7E5FF20712C
-S31508005AD800236371A3710823A4F8443010BD00BFDE
-S31508005AE8400E002438B505460D4B9C6CFFF7D0FED2
-S31508005AF86A1C411E2046FFF703FB60B1084CFF23CA
-S31508005B08E370FFF7C5FE0138A36C0344A3640123B9
-S31508005B18A4F8443038BD3120FFF7F4FEFAE700BF91
-S31508005B28400E002438B504464578FFF7B1FE02381A
-S31508005B3885420EDC114BFF22DA700122A3F84420B5
-S31508005B48617851B9FFF7ECFA30B93120FFF7DAFE78
-S31508005B5802E02220FFF7D6FE38BDA21C074B986C38
-S31508005B68FFF7CEFA28B16178044A936C0B4493641C
-S31508005B78F2E73120FFF7C6FEEEE700BF400E002425
-S31508005B8808B54168074B986CFFF7BEFA30B1054B64
-S31508005B98FF22DA700122A3F8442008BD3120FFF756
-S31508005BA8B1FEFAE7400E002408B5FFF771F8034B73
-S31508005BB8FF22DA700122A3F8442008BD400E00240B
-S31508005BC808B589B2FFF742FE08BD0000054B00225A
-S31508005BD81A709A6483F84320A3F844209A705A7076
-S31508005BE8704700BF400E0024034B1B780BB10120F9
-S31508005BF870470020704700BF400E0024024B002261
-S31508005C0883F84320704700BF400E002408B5037880
-S31508005C18FF2B04D0354A1278012A14D008BDFFF79D
-S31508005C28D9FE324B93F84330012B5AD02F4BB3F990
-S31508005C3844100029F2DD1846012380F84330033062
-S31508005C48FFF7BEFFEAE7C93B352B46D8DFE803F07E
-S31508005C583345454245453F363C394545454545451D
-S31508005C6845454545454545454545454545454545CE
-S31508005C7845454545454545454545241E1B21454554
-S31508005C884527452A2D30FFF7C7FECAE7FFF7E4FE82
-S31508005C98C7E7FFF779FEC4E7FFF710FFC1E7FFF785
-S31508005CA85FFEBEE7FFF756FEBBE7FFF743FEB8E71A
-S31508005CB8FFF732FEB5E7FFF715FFB2E7FFF732FF42
-S31508005CC8AFE7FFF773FEACE7FFF75AFFA9E7FFF759
-S31508005CD86BFFA6E7FFF764FEA3E72020FFF712FE8F
-S31508005CE89FE71020FFF70EFEA0E700BF400E00242E
-S31508005CF820230380004870474C0000240A230380A9
-S31508005D08004870476C00002408B590F89C32032BAD
-S31508005D1801D0002008BDFFF781FCFAE708B5FFF7B0
-S31508005D287DFC002008BD08B50846FFF7ABFC002037
-S31508005D3808BD000008B50B7813F0600F06D14B783C
-S31508005D480A2B14D00B2B17D0062B01D0002008BD20
-S31508005D584B881B0A212B04D00B491722FEF768FE2D
-S31508005D68F4E7CA88172A28BF17220849F6E701223E
-S31508005D780749FEF75DFEE9E78B7813B9044A13600D
-S31508005D88E4E7FEF70BFBE1E7550000245E00002474
-S31508005D988C0E002410B50446812100F0BCF90121B7
-S31508005DA8204600F0B8F9002010BD000010B50446DA
-S31508005DB840230222812100F0A3F94023022201216F
-S31508005DC8204600F09DF94023034A0121204600F0A9
-S31508005DD8CAF9002010BD00BF5813002400487047B0
-S31508005DE85813002412230B80004870479400002497
-S31508005DF804230B8000487047A80000240023934218
-S31508005E0816D230B40BE0373401F8134000015C00B1
-S31508005E18013400250D550133DBB2934206D2040F2F
-S31508005E28092CF0D8303401F81340EFE730BC704736
-S31508005E387047000038B50A4B186804331C680433E1
-S31508005E481B68C01800D138BD064D0822A91CFFF7E3
-S31508005E58D5FF042205F112012046FFF7CFFFF2E726
-S31508005E6800E8F11FAC00002408B51A230B80FFF7D9
-S31508005E78E1FF014808BD00BFAC00002408B50A4682
-S31508005E8828B105490548FEF7B7FD034808BD024984
-S31508005E980248FEF7B1FDF8E7981300247C64000869
-S31508005EA810B5044C0A4621460348FEF7A5FD2046C8
-S31508005EB810BD00BF981300246C64000808B50A468C
-S31508005EC828B105490548FEF797FD034808BD024964
-S31508005ED80248FEF791FDF8E7981300244C64000879
-S31508005EE808B50A4628B105490548FEF785FD034859
-S31508005EF808BD02490248FEF77FFDF8E79813002413
-S31508005F085464000808B500F57171D0F80404FEF762
-S31508005F18FDF808BD08B5C1EBC10293000344D3F8E0
-S31508005F280822D0F80404FEF71DF908BD08B5C1EB28
-S31508005F38C102930003449A6CD0F80404FEF74BF99F
-S31508005F4808BD08B5D0F80404FEF7E0F908BD000056
-S31508005F5810B50446C3683BB1022B0FD091210848F7
-S31508005F68FFF7BCFB012100E00021D4F80404FEF782
-S31508005F78B6F9D4F80404FEF789F910BD0121F4E747
-S31508005F889064000810B50446D0F80404FEF7AAF988
-S31508005F982268D2F8003E43F00103C2F8003E236A9D
-S31508005FA823B1044A136943F006031361FAF7B0F9F3
-S31508005FB810BD00BF00ED00E010B50446FAF7A9F9D0
-S31508005FC8D4F80404FEF797F910BD08B5D0F8040408
-S31508005FD8FEF7ACF908BD08B5D0F80404FEF7A4F92D
-S31508005FE808BD10B504460120FAF791F9D4F8040457
-S31508005FF8FEF79EF910BD10B504460020FAF787F992
-S31508006008D4F80404FEF796F910BD000003780BB11E
-S315080060180020704710B503461748C0F80434C3F87B
-S31508006028C402164B0360092343600222C260002398
-S31508006038036182610122C261036243628362C362A9
-S315080060480363FBF72FFE80B90B4C80212046FCF72B
-S31508006058E8FB402200212046FCF7BFFB80220121ED
-S315080060682046FCF7BAFB002010BD4FF4937104488C
-S31508006078FFF734FBE8E700BF900E0024000008404D
-S3150800608890640008D0F8C43211F0800F08D101F0E6
-S315080060987F01C1EBC1018A00134493F8FE017047DA
-S315080060A801F07F01C1EBC1018A00134493F83E0051
-S315080060B8704708B5D0F8C402FCF7E4FA08BD18B169
-S315080060C8022803D003207047002070470120704734
-S315080060D808B5D0F8C402FBF7BEFEFFF7F0FF08BD07
-S315080060E808B5D0F8C402FBF775FEFFF7E8FF08BD48
-S315080060F808B5D0F8C402FBF78EFEFFF7E0FF08BD27
-S3150800610810B51C4613462246D0F8C402FCF714FA02
-S31508006118FFF7D5FF10BD08B5D0F8C402FCF74DFA4D
-S31508006128FFF7CDFF08BD08B5D0F8C402FCF7DDFABD
-S31508006138FFF7C5FF08BD08B5D0F8C402FCF716FB7B
-S31508006148FFF7BDFF08BD08B5D0F8C402FCF7E0F9AB
-S31508006158FFF7B5FF08BD08B5D0F8C402FCF79BFAE7
-S31508006168FFF7ADFF08BD08B5D0F8C402FCF75CFA1E
-S31508006178FFF7A5FF08BD000070B50D4E0D4CA41B12
-S31508006188A4100025A54209D10B4E0C4C00F02CF89A
-S31508006198A41BA4100025A54205D170BD56F82530C4
-S315080061A898470135EEE756F8253098470135F2E75E
-S315080061B8B4640008B4640008B4640008B864000845
-S315080061C810B5431E0A44914200D110BD11F8014B7F
-S315080061D803F8014FF7E702440346934200D1704794
-S315080061E803F8011BF9E70000F8B500BFF8BC08BCBE
-S315080061F89E467047F8B500BFF8BC08BC9E4670476F
-S315080062080000000000000000000000000000000078
-S315080062180000000001000000020000000300000062
-S31508006228040000000000000005000000000000004F
-S315080062380000000000000000060000000000000042
-S315080062480000000000000000070000000000000031
-S3150800625801020304010203040607080900010203F0
-S3150800626804050607080C1014182030400000000022
-S3150800627801020304010203040607080901000000D5
-S3150800628802000000040000000600000008000000E4
-S315080062980A0000000C0000001000000020000000A2
-S315080062A8400000008000000000010000433A2F5714
-S315080062B86F726B2F736F6674776172652F4F70658F
-S315080062C86E424C542F5461726765742F536F7572FA
-S315080062D863652F41524D434D375F53544D3332480A
-S315080062E8372F63616E2E630005020602060307034D
-S315080062F80803090309040A040B040C040C050D0514
-S315080063080E050F050F0610061007100800000208EC
-S315080063180000020001010000000004080000020055
-S315080063280201000000000608000002000301000040
-S3150800633800000808000002000401000000000A081E
-S31508006348000002000501000000000C080000020019
-S315080063580601000000000E08000002000701000000
-S3150800636800001008000002000002000000001208E1
-S3150800637800000200010200000000140800000200E4
-S3150800638802020000000016080000020003020000CE
-S3150800639800001808000002000402000000001A089D
-S315080063A8000002000502000000001C0800000200A8
-S315080063B80602000000001E0800000200070200008E
-S315080063C8433A2F576F726B2F736F667477617265CE
-S315080063D82F4F70656E424C542F5461726765742F3F
-S315080063E8536F757263652F41524D434D375F53544A
-S315080063F84D333248372F72733233322E630000001A
-S31508006408433A2F576F726B2F736F6674776172658D
-S315080064182F4F70656E424C542F5461726765742FFE
-S31508006428536F757263652F41524D434D375F535409
-S315080064384D333248372F7573622E63004F70656E79
-S31508006448424C540044656661756C740057696E550C
-S3150800645853422042756C6B20496E74657266616397
-S31508006468650000004F70656E424C5420557365727E
-S315080064780000000057696E5553422042756C6B2020
-S3150800648844657669636500002E2E2F5553425F448E
-S3150800649845564943452F5461726765742F7573626B
-S311080064A8645F636F6E662E6300000000E0
-S309080064B4BD0200080F
-S309080064B8990200082F
-S315080064BC0090D0030090D0030100000010000000EB
-S315080064CC04000000B55D00089D5D00083D5D0008F0
-S315080064DC0000000000000000255D00082F5D000884
-S315080064EC115D00080000000000000000000000001C
-S315080064FCF95C000800000000055D00080902200090
-S3150800650C010100C0320904000002FF000000070563
-S3150800651C81024000FF070501024000FF0A0600023F
-S3150800652C0000004001000000ED5D0008F95D000860
-S3150800653CA95E0008855E0008715E0008C55E000845
-S3150800654CE95E00081201000200000040501DAC6014
-S3150800655C0002010203010000040309041A030000E7
-S3150800656C0000000000000000000000000000000011
-S30D0800657C000000000000000009
-S7050800098564
+S3150800038830B58DB0002406940794089409940A9405
+S315080003980B942A4BD3F8E02042F00402C3F8E02075
+S315080003A8D3F8E02002F004020592059AD3F8E02073
+S315080003B842F08002C3F8E020D3F8E02002F0800279
+S315080003C80492049AD3F8E02042F00802C3F8E02021
+S315080003D8D3F8E02002F008020392039AD3F8E02043
+S315080003E842F00102C3F8E020D3F8E02002F0010247
+S315080003F80292029AD3F8E02042F00202C3F8E020FB
+S31508000408D3F8E03003F002030193019B0C4D4FF437
+S315080004180003AB614FF40053069306A9094802F096
+S315080004284FFC8023069301230793089409940A949A
+S3150800043806A9284602F044FC0DB030BD004402580F
+S31508000448000402580008025810B590B0202200216E
+S315080004580DEB020005F048FF002402940394049467
+S315080004680594069407942C4BD3F8E82042F4802286
+S31508000478C3F8E820D3F8E82002F480220192019A0A
+S31508000488D3F8E02042F00802C3F8E020D3F8E030B9
+S3150800049803F008030093009B4FF44073029302236A
+S315080004A803930723079302A91C4802F009FC08943A
+S315080004B84FF4E13309930A940B940C940C230D9387
+S315080004C80E940F94164C08A9204602F083FFA368D9
+S315080004D823F06043A360A36823F06063A3602368DE
+S315080004E823F000532360636823F490436360A3688A
+S315080004F823F02A03A360236843F001032360084B0B
+S31508000508DB6913F4001FFAD0054BDB6913F4800F77
+S31508000518F5D010B010BD00BF00440258000C0258B0
+S315080005280048004010B5574A136823F00F0343F0F4
+S3150800053804031360534B1B6803F00F03042BF9D10C
+S31508000548514AD36823F0070343F00203D36093693B
+S3150800055843F4404393614D4B1A6842F480221A606B
+S315080005681A6842F480321A60484B1B6813F4003F35
+S31508000578FAD0464B9A6A22F0030242F002029A62BD
+S31508000588DA6A42F48032DA62DA6A42F40032DA6205
+S31508000598DA6A22F00C0242F00402DA62DA6A22F017
+S315080005A80202DA629A6A22F47C7242F040029A627D
+S315080005B81A6B3749114040F2DF120A431A631A6B5D
+S315080005C822F47E4242F400721A631A6B22F4FE027F
+S315080005D842F498121A631A6B22F0FE4242F08072AD
+S315080005E81A631A6842F080721A60284B1B6813F05F
+S315080005F8007FFAD0254CA36923F00F0343F00803BC
+S31508000608A361236923F0070343F003032361A3695E
+S3150800061823F47063A361A36923F00F0343F0080367
+S31508000628A361E36923F0700343F04003E361E369D8
+S3150800063823F4E06343F48063E361A36923F070035A
+S3150800064843F04003A361236A23F0700343F0400391
+S315080006582362104803F00AFD002000F0FFF90E4A4D
+S31508000668D2F8543423F00703C2F85434236D23F020
+S3150800067840532365636D23F4401343F4801363657D
+S3150800068810BD00BF00200052004802580044025816
+S3150800069800FEFFFF00389C1C0040025808B500F011
+S315080006A805FAFFF73FFFFFF76BFEFFF7CDFEFFF7EB
+S315080006B80FFEFFF711FEFCE782B0074BD3F8F420CC
+S315080006C842F00202C3F8F420D3F8F43003F0020328
+S315080006D80193019B02B070470044025800B589B0DF
+S315080006E80023039304930593069307930268154B0F
+S315080006F89A4202D009B05DF804FB134BD3F8EC20F4
+S3150800070842F48072C3F8EC20D3F8EC2002F4807225
+S315080007180192019AD3F8E02042F00202C3F8E020D9
+S31508000728D3F8E03003F002030293029B4FF44073B8
+S315080007380393022304930923079303A9034801F0A3
+S31508000748CBF8D7E700A00040004402580004025836
+S3150800075810B588B00023039304930593069307936B
+S315080007680268154B9A4201D008B010BD134CD4F84C
+S31508000778E03043F00103C4F8E030D4F8E03003F081
+S3150800078801030193019B4FF4C05303930223049377
+S315080007980A23079303A90A4801F09EF8D4F8D83023
+S315080007A843F00063C4F8D830D4F8D83003F00063AF
+S315080007B80293029BD8E700BF00000840004402588D
+S315080007C80000025808B50268084B9A4200D008BDCE
+S315080007D8074AD2F8D83023F00063C2F8D8304FF465
+S315080007E8C051044801F076F9F1E700BF0000084057
+S315080007F8004402580000025810B502F0D7FA214CF6
+S315080008084FF40003A361204802F06EF91F4802F06E
+S315080008186BF9204602F068F91D4802F065F91D4B88
+S31508000828D3F8D82022F00062C3F8D820D3F8EC20F1
+S3150800083822F48072C3F8EC20D3F8E82022F4802248
+S31508000848C3F8E820D3F8E02022F00802C3F8E0202D
+S31508000858D3F8E02022F00402C3F8E020D3F8E02019
+S3150800086822F00202C3F8E020D3F8E02022F00102C1
+S31508000878C3F8E020D3F8F42022F00202C3F8F420E3
+S3150800088810BD00BF00040258000C025800080258A0
+S3150800089800000258004402587047FEE7FEE7FEE7E4
+S315080008A8FEE770477047704708B500F02DF908BD90
+S315080008B8294AD2F8883043F47003C2F88830274B9F
+S315080008C81B6803F00F03062B06D8244A136823F07F
+S315080008D80F0343F007031360214B1A6842F001021D
+S315080008E81A6000221A6119681E4A0A401A601B4BC8
+S315080008F81B6813F0080F06D0184A136823F00F036D
+S3150800090843F007031360164B00229A61DA611A62EC
+S31508000918154999621549D962154919635A6399633C
+S31508000928DA6319645A64196821F4802119601A6609
+S31508000938104B1A68104B1340B3F1005F03D20F4BE4
+S315080009480122C3F808210E4B43F2D2021A60024B61
+S315080009584FF000629A60704700ED00E000200052F0
+S31508000968004402587FEDF6EA000202020000FF0181
+S31508000978800201010010005C0000FFFF00800051A2
+S3150800098800400052DFF834D0FFF792FF002103E059
+S315080009980B4B5B58435004310A480B4B42189A4292
+S315080009A8F6D30A4A02E0002342F8043B084B9A4267
+S315080009B8F9D305F067FCFFF771FE704700000824B5
+S315080009C85C660008000000249001002490010024B9
+S315080009D884160024FEE7000010B5194B194ADA6791
+S315080009E80024DC67184AC3F88020C3F8804040F220
+S315080009F87122C3F88420C3F88440144AC3F88820AF
+S31508000A08C3F888401822C3F88C20C3F88C40104ACB
+S31508000A18C3F89020C3F890404FF49B72C3F894200B
+S31508000A28C3F894400B4AC3F89820C3F898400A4A72
+S31508000A38C3F89C20C3F89C40FFF7DEFE204610BD8D
+S31508000A48004402583150010023C0000AFF07280352
+S31508000A58FFC3FFE83330D731AADE2000104B1B78D6
+S31508000A680BB90120704710B504464FF47A70B0FBED
+S31508000A78F3F30C4A1068B0FBF3F000F0ADF868B968
+S31508000A880F2C01D901200AE0002221464FF0FF3039
+S31508000A9800F06CF8044B1C60002000E0012010BD33
+S31508000AA808000024000000240C00002410B50320C8
+S31508000AB800F04AF801F0FCFE0F498B69C3F30323DB
+S31508000AC80E4AD35C03F01F03D8408B6903F00F0363
+S31508000AD8D35C03F01F0320FA03F3094A1360094B92
+S31508000AE818600020FFF7BAFF10B10124204610BD90
+S31508000AF80446FFF7E1FDF9E7004402586463000875
+S31508000B080400002400000024034B1B78034A1168DC
+S31508000B180B441360704700BF08000024BC05002476
+S31508000B2838B5044604F008FC0546B4F1FF3F02D080
+S31508000B38044B1B781C4404F0FFFB401BA042FAD365
+S31508000B4838BD00BF080000240649CB6823F4E063D3
+S31508000B581B041B0C000200F4E0600343024A1A4314
+S31508000B68CA60704700ED00E00000FA0500B5174BAB
+S31508000B78DB68C3F30223C3F1070CBCF1040F28BFD3
+S31508000B884FF0040C03F1040EBEF1060F14D9033B0B
+S31508000B984FF0FF3E0EFA0CFC21EA0C0199400EFABA
+S31508000BA803F322EA03031943002807DB0901C9B23C
+S31508000BB8074B19545DF804FB0023E9E700F00F001A
+S31508000BC80901C9B2034B1954F4E700BF00ED00E068
+S31508000BD800E400E014ED00E00138B0F1807F0BD2A4
+S31508000BE84FF0E0235861054AF02182F823100020C7
+S31508000BF8986107221A6170470120704700ED00E0E6
+S31508000C0830B4446B0368D3F884106F4A114041EA3C
+S31508000C188401C3F884100368D3F8841021F47F018B
+S31508000C28856B41EA0541C3F88410836B234404683D
+S31508000C38D4F88810114041EA8301C4F8881004687A
+S31508000C48D4F8881021F4FE01C56B41EA0541C4F8B9
+S31508000C588810C16B03EB41030468D4F8A01011404F
+S31508000C6841EA8301C4F8A0100468D4F8A01021F456
+S31508000C78FE01056C41EA0541C4F8A010016C446CF4
+S31508000C8804FB01330468D4F8B010114041EA830123
+S31508000C98C4F8B0100468D4F8B01021F4FE01856CC5
+S31508000CA841EA0541C4F8B010816CC46C04FB0133F1
+S31508000CB80468D4F8AC10114041EA8301C4F8AC10B2
+S31508000CC8016D446D04FB01330468D4F8F010114033
+S31508000CD841EA8301C4F8F0100468D4F8F01021F446
+S31508000CE87C11856D41EA0541C4F8F010816D03EB66
+S31508000CF841030468D4F8C0100A4042EA8303C4F8DA
+S31508000D08C0300268D2F8C03023F47C13C16D43EAB8
+S31508000D180143C2F8C0300268D2F8C03023F07C53C9
+S31508000D28016E43EA0163C2F8C030436B274A1A4486
+S31508000D389200C266836B02EB83030367C16B03EBFE
+S31508000D48C1034367016C446C04FB01F103EB81039F
+S31508000D588367816CC46C04FB01F103EB8103C367E9
+S31508000D68016D446D04FB01F103EB8103C0F8803083
+S31508000D78816D03EBC103C0F88430816EC46D01FB35
+S31508000D8804FC03EB8C03C0F88830046E04FB01F1FD
+S31508000D9803EB8103C0F890300D498B420DD9D0F882
+S31508000DA89C3043F02003C0F89C30032380F8983021
+S31508000DB8012007E0002342F8043BD0F8903093421C
+S31508000DC8F8D8002030BC70470300FFFF002B00103E
+S31508000DD8FCD3004070B54C68F4B90D698C68254396
+S31508000DE80C6845EA84450E6ACC6944EA06648E6945
+S31508000DF834434E693443CE683443D0F88460806EF1
+S31508000E0800FB03F306EB830E46F82350CEF804409E
+S31508000E180EF1080E002019E00C698D6825430C6848
+S31508000E28254345F08045DEE702EB000C9CF80340B5
+S31508000E389CF802301B0443EA04639CF8014043EA21
+S31508000E480423145C23434EF8043B0430CB89024C34
+S31508000E58E35C8342E8D870BD7463000830B595B082
+S31508000E6804464C22A04901A805F030FA002C00F0E7
+S31508000E78388123689D4A934220D094F898300BB35A
+S31508000E882268936923F01003936104F055FA05461E
+S31508000E9823689A6912F0080F1AD004F04DFA431B12
+S31508000EA80A2BF5D9D4F89C3043F00103C4F89C30D2
+S31508000EB8032384F89830012015B030BD03F58073F4
+S31508000EC86360DAE784F899302046FFF707FCD7E726
+S31508000ED89A6942F001029A6104F02EFA05462368D7
+S31508000EE89A6912F0010F0FD104F026FA401B0A2856
+S31508000EF8F5D9D4F89C3043F00103C4F89C30032391
+S31508000F0884F898300120D7E79A6942F002029A6174
+S31508000F18237C012B40D02268936943F040039361F0
+S31508000F28637C012B3ED02268936923F4804393613E
+S31508000F38A37C012B3CD02268936943F480539361C0
+S31508000F482268936923F44073A1680B439361226866
+S31508000F58936923F0A40393612268136923F01003A5
+S31508000F681361E368012B29D0002B2CD0022B00F043
+S31508000F789B802268936943F080039361226813690A
+S31508000F8843F010031361E368032B1CD122689369A5
+S31508000F9843F02003936116E02268936923F040031F
+S31508000FA89361BDE72268936943F480439361BFE779
+S31508000FB82268936923F480539361C1E72268936989
+S31508000FC843F004039361A3695A1EE369013B1B02B4
+S31508000FD843EA4263226A013A13436269013A21687D
+S31508000FE843EA0243CB61A368B3F5407F62D0236E18
+S31508000FF833B12268D2F8C030616E0B43C2F8C030EC
+S31508001008E36D226ED3420DD02168D1F8C83023F09B
+S315080010180703A26E14A800EB820252F84C2C13435D
+S31508001028C1F8C830236C6BB12168D1F8BC3023F0FD
+S315080010380703626C14A800EB820252F84C2C13437F
+S31508001048C1F8BC30A36C73B12168D1F8BC3023F061
+S315080010587003E26C14A800EB820252F84C2C43EA9F
+S315080010680213C1F8BC30236D73B12168D1F8BC30BE
+S3150800107823F4E063626D14A800EB820252F84C2C44
+S3150800108843EA0223C1F8BC302268184B9A4222D098
+S315080010980023C4F89430C4F89C30012384F89830A7
+S315080010A82046FFF7ADFD07E72268936943F020035A
+S315080010B8936188E7A36A013BE26A013A43EA022395
+S315080010C8226B013A43EA0213626A013A216843EA43
+S315080010D80243CB608BE76268936823F00303936047
+S315080010E8D6E70120E8E600BF1863000800A000401C
+S315080010F890F89830013BDBB2012B07D9D0F89C3021
+S3150800110843F00203C0F89C3001207047CB680A6890
+S31508001118D2B9072B0ED08A68DB0643EA82730A69B6
+S3150800112843EA02434A691343C26E496842F82130C2
+S31508001138002070470A69CB691B0243EA02438A6999
+S31508001148134343F06053EFE710B40A6942EA43725F
+S31508001158072B0FD04B698C6843EA8473006F49687C
+S3150800116800EBC10C40F83120CCF8043000205DF8BB
+S31508001178044B70478B69F1E790F898C05FFA8CFCC6
+S31508001188BCF1010F07D0D0F89C3043F00403C0F82F
+S315080011989C3001207047920042EA011242EA430253
+S315080011A8036800990A43C3F880200020704790F81E
+S315080011B89830DBB2012B07D0D0F89C3043F00403F3
+S315080011C8C0F89C3001207047022380F898300268DE
+S315080011D8936923F0010393610023C0F89C301846ED
+S315080011E8704738B590F898C00CF1FF3C5FFA8CFC4C
+S315080011F8BCF1010F26D893FAA3FEBEFA8EFE05683F
+S31508001208D5F8C040C4F3054CE6450BD2D5F8CC4012
+S315080012181C420FD0D0F89C3043F04003C0F89C30ED
+S31508001228012016E0D0F89C3043F02003C0F89C3023
+S3150800123801200EE093FAA3F3B3FA83F3FFF7CAFD86
+S31508001248002006E0D0F89C3043F00203C0F89C3032
+S31508001258012038BD90F89830DBB2022B07D0D0F8B9
+S315080012689C3043F00803C0F89C3001207047036897
+S31508001278C3F8D0100020704790F898C05FFA8CFC25
+S31508001288BCF1020F40F0DE8070B540290CD0412928
+S315080012983BD0046D8C4269D8D0F89C3043F02003C3
+S315080012A8C0F89C300120BFE00468D4F8A05015F4B3
+S315080012B8FE0F0CD0D4F8A45015F07F0F0FD1D0F834
+S315080012C89C3043F48073C0F89C300120ACE0D0F819
+S315080012D89C3043F02003C0F89C300120A4E0D4F8E1
+S315080012E8A450C5F3006615F0807F02D0D4F8A05044
+S315080012F80026D4F8A440C4F305242644456F446C54
+S3150800130806FB04F405EB840C37E00468D4F8B050FF
+S3150800131815F4FE0F0CD0D4F8B45015F07F0F0FD182
+S31508001328D0F89C3043F48073C0F89C3001207BE0E9
+S31508001338D0F89C3043F02003C0F89C30012073E0B5
+S31508001348D4F8B450C5F3006615F0807F02D0D4F8F7
+S31508001358B0500026D4F8B440C4F305242644856F53
+S31508001368C46C06FB04F405EB840C06E0C56F446DF3
+S3150800137801FB04F405EB840C0026DCF8004004F0B5
+S315080013888044546074BBDCF80040C4F38A44146093
+S31508001398DCF8004004F000549460DCF8004004F0DF
+S315080013A800441461BCF80440D461DCF8044004F431
+S315080013B87024D460DCF8044004F480145461DCF822
+S315080013C8044004F4001494619CF8074004F07F0470
+S315080013D81462DCF80440E40F54620CF1080E4FF06E
+S315080013E8000C0BE0DCF8004024F060441460CFE7FA
+S315080013F81EF80C4003F80C400CF1010CD489154D65
+S315080014082C5D6445F4D840290AD041290DD01F29F6
+S315080014180FD80268012303FA01F1C2F8981002E00E
+S315080014280368C3F8A860002070BD0368C3F8B860ED
+S31508001438F9E701F01F010268012303FA01F1C2F86E
+S315080014489C10F0E7D0F89C3043F00803C0F89C30AD
+S3150800145801207047746300080368D3F8CC00084075
+S3150800146800D001207047402905D00368D3F8B40096
+S3150800147800F07F0070470368D3F8A40000F07F00E7
+S3150800148870470000144BDB6813F0010F09D0124BA4
+S31508001498124A5A6002F188325A60DB6813F0010F63
+S315080014A814D10D4BD3F80C3113F0010F10D00A4B99
+S315080014B80A4AC3F8042102F18832C3F80421D3F88A
+S315080014C80C3113F0010F05D1002070470120704731
+S315080014D80020704701207047002000522301674505
+S315080014E80D4BDA6842F00102DA60DB6813F0010F87
+S315080014F80DD0094BD3F80C2142F00102C3F80C2190
+S31508001508D3F80C3113F0010F03D0002070470120DF
+S3150800151870470120704700BF002000522DE9F041AE
+S3150800152805460F46374B1E6903F006FF8046022F0D
+S3150800153807D026F0684626F48016760C7604042426
+S3150800154823E0304BD3F8106126F0684626F4801657
+S31508001558760C760446F000462B4C16E003F0ECFEB3
+S31508001568A0EB0800A84247D87DB9032034E0254BEC
+S31508001578D3F8103124EA030333F000430CBF0123E0
+S3150800158800236BB1B5F1FF3FE8D134F00403EED17F
+S315080015981C4B1B6934EA03030CBF01230023F0E73D
+S315080015A836F000420ED1012F1BD0164BD3F8103156
+S315080015B813F4803F24D0134B4FF48032C3F8142118
+S315080015C8002009E011498B6933438B61002E05DA3F
+S315080015D80C4BC3F814210120BDE8F081094B5E6164
+S315080015E8F9E7084B1B6913F4803F07D0054B4FF4FE
+S315080015F880325A610020EFE70320EDE70020EBE789
+S315080016080020E9E70020005204000080C0050024F5
+S315080016182D4B1B7D012B53D070B50D4614462A4B0E
+S3150800162801221A7501F17843B3F5801F3AD3A1F15F
+S315080016380161B1F5801F45D20226234B00229A6123
+S3150800164831464CF25030FFF769FF38BB012E2BD0D4
+S315080016581E4AD2F80C3143F00203C2F80C31BFF324
+S315080016686F8FBFF34F8F082354F8042B45F8042BC4
+S31508001678013B13F0FF03F7D1BFF36F8FBFF34F8F0B
+S3150800168831464CF25030FFF749FF012E12D00F4A67
+S31508001698D2F80C3123F00203C2F80C310A4B0022A7
+S315080016A81A7570BD0126C8E7084AD36843F00203CD
+S315080016B8D360D4E7054AD36823F00203D360EDE77D
+S315080016C8022070470120ECE7C005002400200052DC
+S315080016D801F00303032B24D011F0010F0BD01D4B87
+S315080016E8DA6822F03002DA60DA680243DA60DA6821
+S315080016F842F08802DA6011F0020F11D0154BD3F8C0
+S315080017080C2122F03002C3F80C21D3F80C2110431F
+S31508001718C3F80C01D3F80C2142F08802C3F80C214F
+S3150800172870470C4BDA6822F03002DA60D3F80C21DD
+S3150800173822F03002C3F80C21DA680243DA60D3F8DB
+S315080017480C211043C3F80C019A6942F010029A61F9
+S31508001758704700BF0020005210B411F0010F0CD0DA
+S31508001768114CE36823F4E663E360E36842EA002C75
+S3150800177843EA0C0343F08403E36011F0020F0FD029
+S315080017880949D1F80C3123F4E663C1F80C31D1F8CC
+S315080017980C3142EA00221A4342F08402C1F80C21AD
+S315080017A85DF8044B704700BF00200052F8B5474B58
+S315080017B81B7D012B00F0888004460F46434B012207
+S315080017C81A7500229A61436813F0010F0DD1002596
+S315080017D8636813F0020F12D1CDB92368012B1BD009
+S315080017E84FF0FF333B60A6684CE001214CF25030BD
+S315080017F8FFF794FE05460028EAD00125E8E7022106
+S315080018084CF25030FFF78AFE0028E5D001252F4B09
+S3150800181800221A752846F8BD61682069FFF758FF3F
+S31508001828636813F0010F12D1636813F0020FEED044
+S3150800183802214CF25030FFF771FE00B10125244A07
+S31508001848D2F80C3123F00803C2F80C31DFE701217E
+S315080018584CF25030FFF762FE00B101251C4AD368E6
+S3150800186823F00803D360DFE701214CF25030FFF775
+S3150800187855FE0546164AD168164B0B40D3600FE04D
+S3150800188805BB0136E368A2681344B342BFD9226987
+S3150800189861683046FFF760FF636813F0010FE3D10C
+S315080018A8636813F0020FEBD002214CF25030FFF7B1
+S315080018B835FE0546064AD2F80C11064B0B40C2F807
+S315080018C80C31DDE73E60A2E70225A3E7C005002440
+S315080018D800200052FBF8FFFFF0B583B0002340E074
+S315080018E8092400E00024B44044EA0C040235764E84
+S315080018F846F825404FF0B044D4F88050D44325EA3A
+S3150800190802064F6817F4803F01D042EA05064FF0F1
+S31508001918B045C5F88060D5F8845004EA05064F68CE
+S3150800192817F4003F01D042EA05064FF0B045C5F85E
+S3150800193884602D6804EA05064F6817F4801F01D0ED
+S3150800194842EA05064FF0B0452E606D682C404E6891
+S3150800195816F4001F01D042EA05044FF0B04254605D
+S3150800196801330A6832FA03F400F0AB804FF0010C31
+S315080019780CFA03FC1CEA0202F2D04C68651E112C0C
+S3150800198818BF012D01D9122C13D185685E000324CE
+S31508001998B44025EA0405CC68B4402C4384604468FE
+S315080019A824EA0C0C4C68C4F300149C4044EA0C0462
+S315080019B84460C6684FEA430C032505FA0CF5EC4360
+S315080019C826EA050E8D6805FA0CF545EA0E05C56082
+S315080019D84D68122D18BF022D12D1DE08083650F8A8
+S315080019E8267003F007054FEA850E0F2505FA0EF54A
+S315080019F827EA05070D6905FA0EF53D4340F826500E
+S31508001A08056825404C6804F0030404FA0CF42C43D2
+S31508001A1804604C6814F0805FA2D02C4CD4F8F450BB
+S31508001A2845F00205C4F8F450D4F8F44004F002046A
+S31508001A380194019C9D08AE1C234C54F8267003F0AB
+S31508001A480304A6000F24B44027EA040C204CA0423D
+S31508001A583FF448AF04F58064A04222D004F58064B8
+S31508001A68A04220D004F58064A0421ED004F5806404
+S31508001A78A0421CD004F58064A0421AD004F58064FC
+S31508001A88A04218D004F58064A04216D004F58064F4
+S31508001A98A04214D004F58064A0423FF421AF0A247A
+S31508001AA821E701241FE702241DE703241BE7042472
+S31508001AB819E7052417E7062415E7072413E7082472
+S31508001AC811E703B0F0BD00BF0004005800440258EF
+S31508001AD800000258002331FA03F200F09D80F0B5A1
+S31508001AE82EE0092500E0002505FA0CFCA44572D06D
+S31508001AF804685D004FF0030C0CFA05FC44EA0C0474
+S31508001B0804604FEAD30E0EF1080E50F82E4003F083
+S31508001B180705AE000F25B54024EA050440F82E400F
+S31508001B28C46824EA0C04C460446824EA02024260D1
+S31508001B38826822EA0C028260013331FA03F26AD01B
+S31508001B4801229A4012EA010EF6D09E08B51C334CBB
+S31508001B5854F8254003F0030C4FEA8C0C0F2505FAB8
+S31508001B680CF73C402E4DA842BDD005F58065A84225
+S31508001B7821D005F58065A8421FD005F58065A842DD
+S31508001B881DD005F58065A8421BD005F58065A842D5
+S31508001B9819D005F58065A84217D005F58065A842CD
+S31508001BA815D005F58065A84213D005F58065A842C5
+S31508001BB897D00A2598E7012596E7022594E703258D
+S31508001BC892E7042590E705258EE706258CE707257D
+S31508001BD88AE7082588E74FF0B044D4F8805025EA04
+S31508001BE80E05C4F88050D4F8845025EA0E05C4F8C2
+S31508001BF88450256825EA0E052560656825EA0E05D8
+S31508001C086560DFF818C0B41C5CF8245025EA070597
+S31508001C184CF824506CE7F0BD704700BF0004005824
+S31508001C28000002582DE9F04383B0D0F80080C1EBD4
+S31508001C38C10300EB83035A6D1B6D9A4254D80746B5
+S31508001C480C469B1AC1EBC10200EB8202526C9A42FF
+S31508001C5800D31A4602F103094FEA990915E006F175
+S31508001C6803094FEA9909C4EBC40507EB8505A96C6E
+S31508001C783B7C0093B3B2E2B2404601F09DFFAB6CE1
+S31508001C883344AB646B6D33446B6508EB441303F557
+S31508001C9810639B699BB24B4512D3C4EBC40207EB8E
+S31508001CA88202516D136D99420AD24BB15B1AC4EB85
+S31508001CB8C40207EB8202566C9E42D0D31E46CEE774
+S31508001CC8C4EBC40007EB80073A6D7B6D9A420FD8C0
+S31508001CD804F00F040123A340D8F8344824EA03047F
+S31508001CE8C8F83448002000E0012003B0BDE8F083B6
+S31508001CF80020FAE770B58AB0002800F097800546F4
+S31508001D08046890F8BD333BB3032385F8BD33E36B0A
+S31508001D1813F4807F01D100232B61286801F0E0FCC9
+S31508001D282C4654F8106BEC460FCCACE80F000FCCD9
+S31508001D38ACE80F0094E803008CE803002B1D0ECBD3
+S31508001D48304601F00FFC044658B1022385F8BD3326
+S31508001D58012420460AB070BD80F8BC33FEF7F8FCAB
+S31508001D68D2E70021286801F0C1FC234616E0C3EB38
+S31508001D78C30205EB8202012182F83D1082F83C3045
+S31508001D88A2F84230002182F83F1051649164C3EBEF
+S31508001D98C30205EB820211650133DBB269688B421F
+S31508001DA8E5D316E0C4EBC40305EB8303002283F8E6
+S31508001DB8FD2183F8FC4183F8FF21C3F80422C3F800
+S31508001DC80822C4EBC40305EB8303C3F810220134C5
+S31508001DD8E4B2A142E6D82C4654F8106BEC460FCC70
+S31508001DE8ACE80F000FCCACE80F0094E803008CE8C9
+S31508001DF803002B1D0ECB304601F0BEFC044660B925
+S31508001E08002385F83830012385F8BD336B6A012B22
+S31508001E1808D0286802F0A8F89BE7022385F8BD339E
+S31508001E28012496E7284600F025FDF2E7012490E705
+S31508001E38026890F8BC33012B19D010B50446012363
+S31508001E4880F8BC33836A012B09D0206802F080F831
+S31508001E58206801F03FFC002084F8BC0310BD8369A4
+S31508001E68012BF2D0936B43F480339363EDE702209A
+S31508001E78704738B590F8BC33012B18D004460123AF
+S31508001E8880F8BC33006801F02BFC206802F030F8B3
+S31508001E98054628B1002384F8BC330125284638BDF1
+S31508001EA8206802F061F8002384F8BC33F6E70225B7
+S31508001EB8F4E768B110B50446032380F8BD33FFF785
+S31508001EC8D8FF2046FEF77EFC002084F8BD0310BD27
+S31508001ED80120704770B504460D460068066C00EB8D
+S31508001EE8411303F530639A682169012911D03449E9
+S31508001EF88E424ED03DB9C5EBC50304EB8303D3F830
+S31508001F081032002B56D0E9B2204604F089F8002092
+S31508001F1870BD12F0080F09D02A498E42F7D912F473
+S31508001F28004FF4D04FF400429A60F0E712F0200F01
+S31508001F3802D020229A60EAE712F0280FE7D1214951
+S31508001F488E4206D912F4004F03D04FF400429A6025
+S31508001F58DDE7C5EBC50204EB8202D2F804121B6959
+S31508001F68C3F31203CB1AC2F81432D2F808320B4458
+S31508001F78C2F8083215B9D2F8103223B1E9B22046A8
+S31508001F8804F04EF8C3E704F57172012102F03EF831
+S31508001F98F4E712F4004F03D04FF400429A60B6E70C
+S31508001FA812F0200F01D020229A60E9B2204604F0E8
+S31508001FB837F8ACE704F57172002102F027F8A2E7B2
+S31508001FC80A31544F0A30544F38B5044603681D6C15
+S31508001FD803EB4113D3F8081B0E4A954207D903F5B4
+S31508001FE8306311F4004F02D04FF400429A6020463D
+S31508001FF804F00EF8074B9D4202D92369012B01D03C
+S31508002008002038BD04F571720121206801F0FEFF31
+S31508002018F6E700BF0A30544F2DE9F84F044605681D
+S31508002028284601F0DEFF08B1BDE8F88F06462068A5
+S3150800203801F0A6FF0028F7D0206801F0A1FF10F0EC
+S31508002048020F04D02268536903F00203536120681B
+S3150800205801F096FF10F0100F14D02268936923F048
+S31508002068100393612F6A07F00F08C7F34343022B3F
+S3150800207800F08580062B00F0A1802268936943F05A
+S3150800208810039361206801F07BFF10F4002F40F0DD
+S31508002098A780206801F074FF10F4802F40F0E980CB
+S315080020A8206801F06DFF0028C0F25381206801F00E
+S315080020B867FF10F4006F0AD0D5F8083813F0010F37
+S315080020C840F061812268536903F40063536120680C
+S315080020D801F056FF10F0006F15D02268536903F017
+S315080020E80063536194F8F433002B40F050810121C2
+S315080020F884F8F41323685B6DC3F38303C4F8F833D1
+S31508002108204600F0CBFB206801F03AFF10F4805F08
+S3150800211840F04181206801F033FF10F4005F40F079
+S315080021289581206801F02CFF10F0080F40F0A68171
+S31508002138206801F025FF10F4801F40F0A881206868
+S3150800214801F01EFF10F4001F40F0AB81206801F073
+S3150800215817FF10F0804F40F0AE81206801F010FF9D
+S3150800216810F0040F3FF460AF23685D6815F0040F9C
+S3150800217840F0AA81226853682B43536054E747F610
+S31508002188F0731F423FF479AF4FEA171BC8EBC8092B
+S3150800219804EB8909C7F30A12D9F80812284601F088
+S315080021A83DFECBF30A02D9F808321344C9F80832B7
+S315080021B8D9F814321A44C9F814225EE7082204F535
+S315080021C87171284601F02AFEC7F30A17C8EBC80238
+S315080021D804EB8202D2F814321F44C2F814724CE790
+S315080021E8206801F0D1FE0746B04616E005EB48130D
+S315080021F80122C3F8082B41462046FFF76BFE1BE071
+S3150800220805EB48130822C3F8082B41462046FFF772
+S31508002218DBFE14E008F101087F08002F3FF439AF08
+S3150800222817F0010FF6D05FFA88F1206801F0BCFEB6
+S31508002238814610F0010FD9D119F0080FE0D119F02D
+S31508002248100F04D005EB48131022C3F8082B19F011
+S31508002258200F04D005EB48132022C3F8082B19F4DD
+S31508002268005FD7D005EB48134FF40052C3F8082B84
+S31508002278D0E7206801F090FE0746B04629E05146A7
+S31508002288204603F0D9FE19F0080F04D005EB4813C9
+S315080022980822C3F8082919F0100F04D005EB4813CB
+S315080022A81022C3F8082919F0400F04D005EB481383
+S315080022B84022C3F8082919F0020F04D005EB481381
+S315080022C80222C3F8082919F0800F3DD108F1010840
+S315080022D87F08002F3FF4E4AE17F0010FF6D05FFA37
+S315080022E888FA5146206801F068FE814610F0010F09
+S315080022F8C9D008F00F03012101FA03F2D5F83438DA
+S3150800230823EA0203C5F8343805EB4813C3F8081955
+S3150800231823698B42B3D1C8EBC80304EB8303596C12
+S315080023289A6C0A449A64B8F1000FA8D1C8EBC80396
+S3150800233804EB83031B6D002BA1D104F571720121EF
+S31508002348206801F063FE9AE741462046FFF76AFCD3
+S31508002358BCE7D5F8043823F00103C5F8043894F81F
+S31508002368F433012B08D0204603F0ACFE22685369E3
+S3150800237803F00043536199E6002184F8F4132046D4
+S3150800238800F08CFAF2E7204603F082FE9AE6204629
+S3150800239803F07EFEB7E605F500677B6823F00103C0
+S315080023A87B601021206801F0B9F920E005EB461397
+S315080023B84FF67F31C3F80819D3F8002922F400121A
+S315080023C8C3F80029D3F8002942F00062C3F80029A7
+S315080023D8C3F8081BD3F8002B22F40012C3F8002B05
+S315080023E8D3F8002B42F00062C3F8002B0136636865
+S315080023F8B342DBD8FB6943F00113FB61236BDBB1FE
+S31508002408D7F8843043F00B03C7F884307B6C43F065
+S315080024180B037B64D5F8003823F4FE63C5F8003847
+S3150800242804F57172217C206801F0F0FD2268536971
+S3150800243803F4805353616DE67A6942F22B0313431A
+S315080024487B613B6943F00B033B61E3E7206801F0D6
+S31508002458CDFD206801F054FAE060256800F022FBFB
+S315080024680146227B284601F0C3F8204603F0F6FD0C
+S315080024782268536903F40053536152E6204603F071
+S31508002488E6FD2268536903F00803536150E6002104
+S31508002498204603F026FE2268536903F48013536125
+S315080024A84DE60021204603F016FE2268536903F418
+S315080024B8001353614AE6204603F019FE2268536959
+S315080024C803F08043536148E6204603F01AFE51E6B6
+S315080024D8026890F8BC33012B16D010B504460123C0
+S315080024E880F8BC33836A012B06D0206801F030FDDA
+S315080024F8002084F8BC0310BD8369012BF5D0936BC3
+S3150800250843F480339363F0E70220704790F8BC33AE
+S31508002518012B0BD010B50446012380F8BC3300689C
+S3150800252801F022FD002084F8BC0310BD0220704784
+S3150800253890F8BC33012B0DD010B50446012380F85A
+S31508002548BC3380F83810006801F0F2FC002084F8E3
+S31508002558BC0310BD0220704738B505468C4611F0F5
+S31508002568800F29D101F00F0ECEEBCE04A40004F596
+S31508002578FC740444211DCEEBCE0E00EB8E0E002013
+S315080025888EF8FD010CF00F0C81F800C08A60CB703C
+S315080025984A780AB1A1F806C0022B1DD095F8BC33B3
+S315080025A8012B1CD0012385F8BC33286801F0B8F93B
+S315080025B8002085F8BC0338BD01F00F00C0EBC00148
+S315080025C88900383129440431C0EBC00005EB800086
+S315080025D8012480F83D40D5E700230B71DEE7022089
+S315080025E8E9E710B504460A4611F0800F20D101F034
+S315080025F80F00C0EBC0039B0003F5FC732344191DA9
+S31508002608C0EBC00004EB8000002380F8FD3102F01F
+S315080026180F020A7094F8BC33012B19D0012384F8E9
+S31508002628BC33206801F0CAF9002084F8BC0310BD41
+S3150800263801F00F00C0EBC0039B0038332344191D73
+S31508002648C0EBC00004EB8000012380F83D30DEE7CC
+S315080026580220ECE710B501F00F04C4EBC4018900A9
+S3150800266801F5FC7101440431C4EBC40C00EB8C0C75
+S31508002678CCF80822CCF810320023CCF814328CF89F
+S31508002688FD318CF8FC410369012B06D064B9DAB22E
+S31508002698006801F003FA002010BDC4EBC40C00EB77
+S315080026A88C0CCCF80C22F1E7DAB2006801F09CFA37
+S315080026B8F1E701F00F01C1EBC10100EB8101D1F887
+S315080026C81402704710B501F00F04C4EBC401890061
+S315080026D8383101440431C4EBC40C00EB8C0CCCF83B
+S315080026E84820CCF850300023CCF8543001238CF815
+S315080026F83D308CF83C400369012B06D064B9DAB240
+S31508002708006801F0CBF9002010BDC4EBC40C00EB3F
+S315080027188C0CCCF84C20F1E7DAB2006801F064FAC0
+S31508002728F1E738B501F00F054268954239D80446ED
+S315080027380B4611F0800F1FD1C1EBC101890001F5C5
+S31508002748FC7101440431C3EBC30300EB8303002285
+S3150800275883F8FD2101238B700D7094F8BC33012B87
+S3150800276821D0012384F8BC33206801F066FB8DB1BB
+S31508002778002084F8BC0338BDC5EBC501890038318B
+S3150800278801440431C5EBC50300EB8303012283F832
+S315080027983D20DFE704F57172217C206801F036FCDC
+S315080027A8E6E70120E7E70220E5E701F00F034268BC
+S315080027B8934231D810B5044611F0800F1ED1C3EBE9
+S315080027C8C301890001F5FC7101440431C3EBC30256
+S315080027D800EB8202002082F8FD0100228A700B7045
+S315080027E894F8BC33012B19D0012384F8BC3320682C
+S315080027F801F050FB002084F8BC0310BDC3EBC301ED
+S315080028088900383101440431C3EBC30200EB820264
+S31508002818012082F83D00E0E7012070470220ECE736
+S3150800282810B40468606A31B940EA0240A062002020
+S315080028385DF8044B70478C46A36A00EB13400023E7
+S3150800284808E003F1400104EB8101496800EB1140F7
+S315080028580133DBB20CF1FF318B42F2D340EA024076
+S315080028680CF13F0104EB81014860E0E7036859620F
+S3150800287800207047034602680121C0F8FC130020AF
+S3150800288883F8F403936943F000639361516D024B2F
+S315080028980B435365704700BF0300001070470000DC
+S315080028A8024AD36843F08073D360704700480258D9
+S315080028B8744B1B6903F03803102B00F0DE80182BC5
+S315080028C810D00BB1704870476E4B1B6813F0200F79
+S315080028D800F0D5806B4B1868C0F3C1006B4B23FA20
+S315080028E800F0704710B4674A916A01F00301946AC8
+S315080028F8C4F30510D36A03F0010C536BC3F3CC0376
+S315080029080CFB03F307EE903AF8EE677A14F47C7F2B
+S3150800291800F09380012965D0022900F09180E1B181
+S3150800292807EE100AF8EE476A9FED596A86EE267A88
+S31508002938544B1B6BC3F3080306EE903AF8EE666A27
+S315080029489FED546A67EE867A76EEA77AF7EE006AFE
+S3150800295877EEA67A27EE277A60E0136813F0200F39
+S3150800296823D011461268C2F3C102484BD34007EE7A
+S31508002978103AF8EE476A07EE100AB8EE476A86EE86
+S31508002988867A0B6BC3F3080306EE903AF8EE666A86
+S315080029989FED406A67EE867A76EEA77AF7EE006AC2
+S315080029A877EEA67A27EE277A38E007EE100AF8EEC9
+S315080029B8476A9FED396A86EE267A324B1B6BC3F354
+S315080029C8080306EE903AF8EE666A9FED326A67EEF5
+S315080029D8867A76EEA77AF7EE006A77EEA67A27EE73
+S315080029E8277A1BE007EE100AF8EE476A9FED286A71
+S315080029F886EE267A234B1B6BC3F3080306EE903A3A
+S31508002A08F8EE666A9FED236A67EE867A76EEA77A07
+S31508002A18F7EE006A77EEA67A27EE277A194B1B6B2C
+S31508002A28C3F34623013307EE903AF8EE677AC7EE02
+S31508002A38276AFCEEE67A17EE900A5DF8044B7047AB
+S31508002A4807EE100AF8EE476A9FED146A86EE267AAC
+S31508002A580C4B1B6BC3F3080306EE903AF8EE666A4E
+S31508002A689FED0C6A67EE867A76EEA77AF7EE006A25
+S31508002A7877EEA67A27EE277AD0E7094870470348FB
+S31508002A88704700BF0044025800093D000090D00373
+S31508002A980024744A000000390024744C0024F44ABF
+S31508002AA800127A0008B5FFF703FF0B4A9369C3F3C8
+S31508002AB803230A49CB5C03F01F0320FA03F3926940
+S31508002AC802F00F02885C00F01F0023FA00F0044A9F
+S31508002AD81060044A136008BD00440258646300087D
+S31508002AE804000024000000246A4B984222D06A4B4E
+S31508002AF898422FD0694B98423CD0694B984249D0A6
+S31508002B08684B984256D0684B984263D0674B9842B0
+S31508002B1870D0674B98427DD0664B984200F08A8001
+S31508002B28654B984200F09680644B984200F0A28064
+S31508002B380120704703F58843D3F8882042F001023C
+S31508002B48C3F88820D3F8882022F00102C3F8882021
+S31508002B580020704703F58043D3F8882042F0020224
+S31508002B68C3F88820D3F8882022F00202C3F8882000
+S31508002B780020704703F57053D3F8882042F0040202
+S31508002B88C3F88820D3F8882022F00402C3F88820DE
+S31508002B980020704703F56053D3F8882042F00802EE
+S31508002BA8C3F88820D3F8882022F00802C3F88820BA
+S31508002BB80020704703F55053D3F8882042F01002D6
+S31508002BC8C3F88820D3F8882022F01002C3F8882092
+S31508002BD80020704703F54053D3F8882042F02002B6
+S31508002BE8C3F88820D3F8882022F02002C3F8882062
+S31508002BF80020704703F53053D3F8882042F0400286
+S31508002C08C3F88820D3F8882022F04002C3F8882021
+S31508002C180020704703F52053D3F8882042F0800235
+S31508002C28C3F88820D3F8882022F08002C3F88820C1
+S31508002C380020704703F51053D3F8882042F48072B1
+S31508002C48C3F88820D3F8882022F48072C3F888202D
+S31508002C580020704703F50053D3F8882042F4007221
+S31508002C68C3F88820D3F8882022F40072C3F888208D
+S31508002C780020704703F5E053D3F8882042F48062B1
+S31508002C88C3F88820D3F8882022F48062C3F88820FD
+S31508002C98002070470000025800040258000802582D
+S31508002CA8000C02580010025800140258001802585E
+S31508002CB8001C02580020025800240258002802580E
+S31508002CC80B6893FAA3F3B3FA83FC3CE08C68826832
+S31508002CD803FB03F505EB450622EA060205FB04F4A1
+S31508002CE8224382600C68CD68426822EA040205FB22
+S31508002CF804F42243426034E0FF2B0ED84D69046A77
+S31508002D080EFB03F606FB03F3C3EB031624EA0604D5
+S31508002D1805FB03F32343036233E04C69456A1B0A40
+S31508002D2803FB03F603FB06F606FB03F3C3EB0316DE
+S31508002D3825EA060504FB03F32B43436221E000203A
+S31508002D4870BD0CF1010C0B6833FA0CF22CD0012279
+S31508002D5802FA0CF21340F4D070B54A68013A012A0F
+S31508002D68B4D9C46803FB03FE0EEB4E05EA4324EA0E
+S31508002D7805040D690EFB05F52C43C4604C68022C46
+S31508002D88BAD04C68036813400EFB04F42343036067
+S31508002D980CF1010C0B6833FA0CF2D0D0012202FAB6
+S31508002DA80CF21340F4D0D8E7002070472C4B1B6868
+S31508002DB803F00F03062B06D8294A136823F00F03D6
+S31508002DC843F007031360274A136843F001031360A7
+S31508002DD8244B1B6813F0040FFAD0224B00221A6101
+S31508002DE81968214A0A401A601E4B1B6813F0007FAF
+S31508002DF8FAD11C4B1B6813F0006FFAD1194B1B68E4
+S31508002E0813F0005FFAD1174B00229A61DA611A6249
+S31508002E18164999621649D962164919635A63996314
+S31508002E28DA6319645A64196821F4802119601A66E4
+S31508002E38996E40F2FF720A439A66D3F8D02042F494
+S31508002E488032C3F8D020064B1B6813F0080F06D04B
+S31508002E58034A136823F00F0343F007031360704708
+S31508002E68002000520044025845EDF6EA0002020224
+S31508002E780000FF018002010105EE900A06EE101A0D
+S31508002E8807EE902A07EE103AF8EE655AB8EE466A43
+S31508002E98C5EE866AF8EE677AB8EE477A9FED096A4C
+S31508002EA827EE067A77EE877A66EEA77A9DED007A98
+S31508002EB8B8EE477AC7EE876AFCEEE67A17EE900A06
+S31508002EC8704700BF000000392DE9F04182B004467A
+S31508002ED8394B9B6A03F00303012B5ED0022B63D0A0
+S31508002EE8002B4FD00026002323606360A360324B73
+S31508002EF89F6AC7F305171A6BC2F3080202F101089D
+S31508002F08DD6A15F0010502D05D6BC5F3CC05002F07
+S31508002F1835D0294BDB6A13F4803F0CD0264B1B6B44
+S31508002F28C3F34623013300932B46424639463046B7
+S31508002F38FFF7A2FF2060204BDB6A13F4003F0CD092
+S31508002F481D4B1B6BC3F30643013300932B464246BE
+S31508002F5839463046FFF790FF6060174BDB6A13F473
+S31508002F68802F0CD0144B1B6BC3F3066301330093F5
+S31508002F782B46424639463046FFF77EFFA06002B028
+S31508002F88BDE8F0810C4B1E6816F00406ABD01B682A
+S31508002F98C3F3C103094EDE40A5E7074B1E6816F4BE
+S31508002FA88076A0D0064E9EE7034B1E6816F40036B8
+S31508002FB899D0044E97E700BF004402580090D00302
+S31508002FC800093D0000127A002DE9F04182B0044656
+S31508002FD8394B9B6A03F00303012B5ED0022B63D09F
+S31508002FE8002B4FD00026002323606360A360324B72
+S31508002FF89F6AC7F305379A6BC2F3080202F10108FC
+S31508003008DD6A15F0100502D0DD6BC5F3CC05002F77
+S3150800301835D0294BDB6A13F4002F0CD0264B9B6B53
+S31508003028C3F34623013300932B46424639463046B6
+S31508003038FFF722FF2060204BDB6A13F4801F0CD0B1
+S315080030481D4B9B6BC3F30643013300932B4642463D
+S3150800305839463046FFF710FF6060174BDB6A13F4F2
+S31508003068001F0CD0144B9B6BC3F306630133009304
+S315080030782B46424639463046FFF7FEFEA06002B0A8
+S31508003088BDE8F0810C4B1E6816F00406ABD01B6829
+S31508003098C3F3C103094EDE40A5E7074B1E6816F4BD
+S315080030A88076A0D0064E9EE7034B1E6816F40036B7
+S315080030B899D0044E97E700BF004402580090D00301
+S315080030C800093D0000127A002DE9F04182B0044655
+S315080030D83A4B9B6A03F00303012B60D0022B65D099
+S315080030E8002B51D00026002323606360A360334B6E
+S315080030F89F6AC7F305571A6CC2F3080202F101085A
+S31508003108DD6A15F4807502D05D6CC5F3CC05002F11
+S3150800311818BF002E35D0294BDB6A13F4800F0CD064
+S31508003128264B1B6CC3F34623013300932B464246B2
+S3150800313839463046FFF7A0FE2060204BDB6A13F4B9
+S31508003148000F0CD01D4B1B6CC3F3064301330093C9
+S315080031582B46424639463046FFF78EFE6060174BC7
+S31508003168DB6A13F0807F0CD0144B1B6CC3F3066321
+S31508003178013300932B46424639463046FFF77CFE14
+S31508003188A06002B0BDE8F0810C4B1E6816F0040674
+S31508003198A9D01B68C3F3C103094EDE40A3E7074B52
+S315080031A81E6816F480769ED0064E9CE7034B1E686A
+S315080031B816F4003697D0044E95E700BF0044025827
+S315080031C80090D00300093D0000127A00154B1B69D0
+S315080031D803F03803182B0ED8DFE803F00F0D0D0D92
+S315080031E80D0D0D0D210D0D0D0D0D0D0D160D0D0DDC
+S315080031F80D0D0D0D1800002070470A4B1B68C3F308
+S31508003208C1030948D84070470848704700B585B0D3
+S3150800321801A8FFF759FE019805B05DF804FB0448B4
+S31508003228704700BF004402580090D00300127A0085
+S3150800323800093D00044B9B6903F00F03034AD35C5E
+S3150800324803F01F03D84070470044025884630008F7
+S31508003258044BDB69C3F30213034AD35C03F01F0369
+S31508003268D84070470044025884630008044BDB6959
+S31508003278C3F30223034AD35C03F01F03D8407047FD
+S31508003288004402588463000800B585B0C2B2484BAA
+S31508003298D358020EC0F304218A401340CB4040EAB3
+S315080032A80340444B98420CD03DD8A3F500339842C6
+S315080032B86ED010D9404B984229D003F57D439842E1
+S315080032C821D13E4B186810F0005019D001A8FFF715
+S315080032D8FBFE029814E0A3F5407398420FD1FFF756
+S315080032E875FF364B9B69C3F30323354AD35C03F052
+S315080032F81F03D840FFF79EFFFFF7AAFF00E000204C
+S3150800330805B05DF804FBA3F58033984209D12B4B29
+S31508003318186810F00060F3D001A8FFF755FE029868
+S31508003328EEE70020ECE7274B984217D00ED9264B34
+S31508003338984203D003F54073984227D11F4B186F5C
+S3150800334810F00200DCD04FF40040D9E7A3F580332B
+S3150800335898420ED003F57D43984206D1174B186854
+S3150800336810F48070CCD01948CAE7A3F58033984280
+S315080033780AD1124B186810F00400C1D01B68C3F3B1
+S31508003388C1031348D840BBE70020B9E70020B7E7D0
+S31508003398FFF71CFF094B9B69C3F30323084AD35C51
+S315080033A803F01F03D840FFF745FFFFF75FFFA7E7BE
+S315080033B84C44025808030207080301070044025848
+S315080033C884630008080304070800050700093D0088
+S315080033D80090D00338B5036813F0010F40F08980D0
+S315080033E804460D460368444A1A408B6809690B4324
+S315080033F869690B43E9690B4313430360EB68426841
+S3150800340822F4405213434360AB69826822F440723F
+S3150800341813438360394B984216D0394B98421CD0CF
+S31508003428384B98421DD0384B98421ED0374B984295
+S315080034381FD0374B984220D0364B984221D0364B6E
+S31508003448984222D001204DE03448FFF71DFF002896
+S3150800345847D06A68EAB9012044E03148FFF714FF03
+S31508003468F5E72F48FFF710FFF1E72D48FFF70CFFA0
+S31508003478EDE72B48FFF708FFE9E72848FFF704FFB9
+S31508003488E5E72748FFF700FFE1E72548FFF7FCFED1
+S31508003498DDE72B68E9690B2B0ED8B1F5004F0DD07F
+S315080034A8DBB2204951F82330B0FBF3F000EB5203A6
+S315080034B8B3FBF2F39BB2E360002013E0DBB21949D1
+S315080034C851F82330B0FBF3F0530803EB4000B0FB88
+S315080034D8F2F34FF6F0721A40C3F342031343E3605C
+S315080034E8EAE70120E26A22F00F022B881343E36217
+S315080034F838BD0120FCE700BFF369FFEF0010014063
+S315080035080044004000480040004C0040005000407D
+S315080035180014014000780040007C004008030007BA
+S315080035280800000794630008002301330C4A9342F5
+S3150800353811D80269002AF8DA036943F0010303611E
+S3150800354800230133064A934207D8026912F0010F8D
+S31508003558F7D100207047032070470320704700BF43
+S31508003568400D030084B010B5044603A880E80E0091
+S31508003578089B012B1DD1A36B23F48033A363E26850
+S315080035881A4B1340E360E36823F44013E3600F9B88
+S31508003598012B09D02046FFF7C7FF069B012B1BD036
+S315080035A8BDE8104004B07047E36843F48013E3604D
+S315080035B8F0E7E36843F04003E3602046FFF7B4FF0B
+S315080035C80C9B23B9A36B43F48033A363E5E7A36B8A
+S315080035D823F48033A363E0E7A36843F00603A360F4
+S315080035E8A36843F02003A360DAE700BFBFFFBDFF67
+S315080035F8022A0AD00921C26822F47052C260C36836
+S3150800360843EA8123C36000207047204B0B44204AB5
+S31508003618934229D91F4B0B441F4A934226D91F4B5D
+S315080036280B441F4A934223D91E4B0B441E4A934206
+S3150800363820D31E4B0B441E4A93421DD91D4B0B44DF
+S315080036481D4A93421AD31D4B0B441D4A934217D35E
+S315080036581C4B0B441C4A934214D31C4B0B441C4A60
+S31508003668934211D20721C6E70F21C4E70E21C2E704
+S315080036780D21C0E70C21BEE70B21BCE70A21BAE7F2
+S315080036880921B8E70821B6E70621B4E7405327FF1A
+S31508003698FF340C00401E1BFF3F420F0000DC0BFFE7
+S315080036A87F4F1200808CF9FE20D6130060B6E5FE1F
+S315080036B85FE3160000D3CEFE40771B00C05BB3FE5F
+S315080036C8C091210000CA91FE20753800E05459FEC1
+S315080036D8E09C4100836843F001038360002070473B
+S315080036E8836823F0010383600020704708B5C36820
+S315080036F823F0C043C360012909D069B9C36843F0F8
+S315080037088043C3603220FDF70BFA002008BDC36862
+S3150800371843F00053C360F5E70120F7E7890141F054
+S315080037282001016100230133054A934205D802693D
+S3150800373812F0200FF7D1002070470320704700BF0A
+S31508003748400D03001023036100230133054A934201
+S3150800375805D8026912F0100FF7D100207047032028
+S31508003768704700BF400D0300D0F800381943C0F869
+S31508003778001800207047000084B02DE9F04104467F
+S3150800378807A880E80E00002306E003F1400204EBD0
+S3150800379882020021516001330E2BF6D9119F27BBEF
+S315080037A8D4F8043843F00203C4F80438A36B23F4A6
+S315080037B80013A363236843F040032360236843F098
+S315080037C8800323600023C4F8003E04F50065D4F896
+S315080037D80038C4F800380C9B012B10D1099B4BB94B
+S315080037E800212046FFF7C0FF0DE0A36B43F4001342
+S315080037F8A363E7E701212046FFF7B6FF03E00321A5
+S315080038082046FFF7B1FF10212046FFF787FF8046BD
+S3150800381808B14FF001082046FFF794FF08B14FF0AA
+S31508003828010800232B616B61EB610AE0C3B94FF00D
+S315080038380060C2F8000900220A614FF67F328A60E2
+S3150800384801330799994210D904EB431202F510611E
+S31508003858D2F800090028E9DB0020C2F80009EAE7DF
+S315080038684FF09040C2F80009E5E700230AE0C3B123
+S315080038784FF0904CC2F800CB002202614FF67F3217
+S3150800388882600133994211D904EB431202F530607C
+S31508003898D2F8006B002EEADB4FF0000CC2F800CB1A
+S315080038A8EAE74FF0006CC2F800CBE5E72B6923F48A
+S315080038B880732B610023A3616FF0804363610A9BC1
+S315080038C81BB9A36943F01003A361A2690A4B134302
+S315080038D8A3610D9B1BB1A36943F00803A361012FDC
+S315080038E804D04046BDE8F04104B07047A269034BCE
+S315080038F81343A361F5E700BF00383C800400004085
+S31508003908D0F8083813F0060305D0062B18BF022B83
+S3150800391803D102207047002070470F207047000027
+S3150800392810B591F800C04B78012B21D000F5006E30
+S31508003938D0F81C380CF00F040122A24043EA0243CF
+S31508003948C0F81C3800EB4C10D0F8003B13F4004FB5
+S315080039580CD1D0F8002B8B68C3F30A03C97843EA5D
+S3150800396881431343144A1A43C0F8002B002010BD9C
+S31508003978D0F81C280CF00F0E03FA0EF39BB213436B
+S31508003988C0F81C3800EB4C10D0F8003913F4004F77
+S31508003998ECD1D0F800298B68C3F30A03C97843EA3F
+S315080039A8814343EA8C5C42EA0C0C034B4CEA03035A
+S315080039B8C0F80039DAE700BF0080001030B40B7889
+S315080039C84A78012A26D000EB4313D3F8002B002A9D
+S315080039D852DBD0F83C480A7802F00F024FF0010C87
+S315080039E80CFA02F224EA0242C0F83C28D0F81C284D
+S315080039F8097801F00F010CFA01FC22EA0C42C0F81A
+S31508003A081C28D3F8001B234A0A40C3F8002B0020B9
+S31508003A1830BC704700EB4313D3F80029002A1EDB95
+S31508003A28D0F83C580A7802F00F02012404FA02F288
+S31508003A3892B225EA0202C0F83C28D0F81C28097870
+S31508003A4801F00F018C40A4B222EA0404C0F81C480D
+S31508003A58D3F80019104A0A40C3F80029D7E7D3F85B
+S31508003A68002942F00062C3F80029D3F8002942F079
+S31508003A788042C3F80029D3E7D3F8002B42F0006246
+S31508003A88C3F8002BD3F8002B42F08042C3F8002B6A
+S31508003A989FE700BF0078F3EF007833EC70B40B7833
+S31508003AA84C78012C25D000EB431000F530631D69CE
+S31508003AB83F4C2C401C611D693E4C2C401C614C69CE
+S31508003AC80CB18C684C611C6944F400241C611C699F
+S31508003AD88D68C5F3120C44EA0C041C61012A62D0ED
+S31508003AE8D0F8003B43F00443C0F8003B002070BC04
+S31508003AF870474C695CBB00EB4314D4F810692D4D2C
+S31508003B083540C4F81059D4F8105945F40025C4F8B6
+S31508003B181059D4F81069264D3540C4F81059012AA9
+S31508003B2832D000EB4313D3F8002942F00442C3F815
+S31508003B3800294B69002BD9D0D0F834380A7802F016
+S31508003B480F0101228A401343C0F83438CEE700EB48
+S31508003B58431404F510642669154D35402561266910
+S31508003B68144D354025618D684E69AE4200D94D61C0
+S31508003B78256945F40025256125694E69C6F3120CA1
+S31508003B8845EA0C052561CAE70A691AB100EB43112B
+S31508003B98C1F8142900EB4310D0F8002942F0044272
+S31508003BA8C0F80029A2E7CA68002A99D05A6197E797
+S31508003BB80000F8FFFFFF07E010B59DF8084084B934
+S31508003BC803334FEA930E4FF0000C08E000EB02337C
+S31508003BD803F5805351F8044B1C600CF1010CF445AD
+S31508003BE8F4D3002010BD0000F0B583B00B784C78EC
+S31508003BF8012C31D000EB431303F5306CDCF8105078
+S31508003C08834C2C40CCF81040DCF81050814C2C40E2
+S31508003C18CCF810404C69002C40F0C680DCF81040FF
+S31508003C288D68C5F312052C43CCF81040DCF8104013
+S31508003C3844F40024CCF81040012A00F0CF80CA7852
+S31508003C48012A00F0D280D3F8002B42F00442C3F8C8
+S31508003C58002B002003B0F0BD4C6974BB00EB43147D
+S31508003C68D4F810696B4D3540C4F81059D4F8105972
+S31508003C7845F40025C4F81059D4F81069644D354040
+S31508003C88C4F81059012A4DD000EB4313D3F800495C
+S31508003C9844F00444C3F80049CC78012C6BD04B692E
+S31508003CA8002BD6D0D0F834380A7802F00F01012252
+S31508003CB88A401343C0F83438CBE700EB4314D4F8EA
+S31508003CC81069534D3540C4F81059D4F81069514D48
+S31508003CD83540C4F81059D4F810598E684F6907EB5F
+S31508003CE8060C0CF1FF3CBCFBF6FC4B4E06EACC4C2A
+S31508003CF845EA0C05C4F81059D4F810594E69C6F3A4
+S31508003D0812063543C4F8105904F51064CD78012D08
+S31508003D18B8D1256925F0C0452561256945F00055BE
+S31508003D282561AFE70A691AB100EB4314C4F81429E8
+S31508003D38CA78012A08D000EB4313D3F8002942F0C1
+S31508003D480442C3F8002984E7D0F8082812F4807FCB
+S31508003D5808D100EB4311D1F8002942F00052C1F806
+S31508003D680029E8E700EB4311D1F8002942F0805210
+S31508003D78C1F80029DFE7D0F8084814F4807F0CD189
+S31508003D88D3F8004944F00054C3F8004900928B8AD6
+S31508003D980A78C968FFF710FF5BE7D3F8004944F0CB
+S31508003DA88054C3F80049F1E78D682C44013CB4FBFC
+S31508003DB8F5F4DCF810501FFA84FE174E06EAC444D8
+S31508003DC82543CCF81050DCF810508C680EFB04F428
+S31508003DD8C4F312042C43CCF810402DE7CA68002A0D
+S31508003DE83FF42DAFCCF8142029E7D0F8082812F4A8
+S31508003DF8807F06D1D3F8002B42F00052C3F8002B77
+S31508003E0821E7D3F8002B42F08052C3F8002B1AE7B3
+S31508003E180000F8FFFFFF07E00000F81F8446084681
+S31508003E28D11C8908002305E00CF58052126840F871
+S31508003E38042B01338B42F7D370470B784A78012A4B
+S31508003E4814D000EB4310D0F8002B002A06DB2BB160
+S31508003E58D0F8003B23F08043C0F8003BD0F8003B7D
+S31508003E6843F40013C0F8003B0020704700EB4310EA
+S31508003E78D0F80029002A06DB2BB1D0F8003923F040
+S31508003E888043C0F80039D0F8003943F40013C0F865
+S31508003E980039E9E70B784A78012A0ED000EB431077
+S31508003EA8D0F8003B23F40013C0F8003BCB78023B5C
+S31508003EB8DBB2012B15D90020704700EB4310D0F868
+S31508003EC8003923F40013C0F80039CB78023BDBB27B
+S31508003ED8012BF0D8D0F8003943F08053C0F80039E0
+S31508003EE8E9E7D0F8003B43F08053C0F8003BE2E727
+S31508003EF810B50446002208E004EB42134FF67F315A
+S31508003F08C3F80819C3F8081B01320E2AF4D9002287
+S31508003F18C4F81028C4F81428C4F81C282046FFF743
+S31508003F2811FC00B110BD10212046FFF7F7FBF9E791
+S31508003F38D0F8003823F4FE63C0F80038D0F8003803
+S31508003F48090101F4FE611943C0F8001800207047FA
+S31508003F5808B5D0F8043823F00203C0F8043803205B
+S31508003F68FCF7DEFD002008BD08B5D0F8043843F094
+S31508003F780203C0F804380320FCF7D2FD002008BD68
+S31508003F884269806910407047D0F8183800F5006013
+S31508003F98C0691840000C7047D0F8183800F500605A
+S31508003FA8C069184080B2704700EB4111D1F8082B58
+S31508003FB800F5006040691040704710B4D0F8104802
+S31508003FC8D0F8343801F00F02D340DB01DBB22343C3
+S31508003FD800EB411000F51060806818405DF8044B46
+S31508003FE87047406900F0010070470000D0F80029C2
+S31508003FF8054B1340C0F80039D0F8043843F48073E9
+S31508004008C0F804380020704700F8FFFF10B4046CA5
+S31508004018154B9C4203D9D0F8003B002B16DB00242D
+S31508004028C0F8104BD0F8104B44F40024C0F8104BD5
+S31508004038D0F8104B44F01804C0F8104BD0F8104BC1
+S3150800404844F0C044C0F8104B012903D000205DF89D
+S31508004058044B7047C0F8142BD0F8003B43F0802374
+S31508004068C0F8003BF2E700BF0A30544F014B18600E
+S31508004078704700BF00000024C0B108B50346D0F851
+S31508004088B80210B10020C3F8B802D3F8CC0210B1B0
+S315080040980020C3F8CC0209B1C3F8B412012183F889
+S315080040A89C121A70184602F037F808BD03207047A4
+S315080040B810B50446012380F89C32D0F8B83213B1FB
+S315080040C85B6801799847D4F8CC3213B10023C4F851
+S315080040D8CC32204602F093F800B110BD204602F013
+S315080040E87EF8FAE710B582B00023ADF8063059B164
+S315080040F80446C0F8B812CB6A0DF106009847C4F80A
+S31508004108CC02002002B010BD0320FBE708B502F078
+S315080041186EF808BD08B5D0F8B83213B11B689847C9
+S3150800412808BD0320FCE708B5D0F8B8320BB15B68C0
+S315080041389847002008BD38B5044600F2AA2528463F
+S3150800414800F02EF90123C4F89432B4F8B032C4F852
+S31508004158983294F8AA1201F01F03012B0DD0022BEE
+S3150800416810D02BB101F08001204602F063F803E075
+S315080041782946204600F0E0FA38BD2946204600F0D0
+S3150800418813FBF9E72946204600F042FBF4E738B561
+S3150800419804460D4631BB1346D0F89422032A01D0AB
+S315080041A8084638BDD0F85C11D0F8602191420CD881
+S315080041B8D0F8B8321B691BB190F89C22032A0FD095
+S315080041C8204600F054FC2846EBE7891AC0F85C112B
+S315080041D88A4228BF0A46194600F041FC2846E0E705
+S315080041E89847EDE7D0F8B8329B692BB190F89C222E
+S315080041F8032A03D19847D4E70320D2E70320D0E758
+S3150800420838B504460D46002948D11346D0F89422F5
+S31508004218022A05D094F8A032012B3AD0284638BD90
+S31508004228C269016A8A4211D88A421BD0D4F8B832C0
+S31508004238DB681BB194F89C22032A27D080212046E4
+S3150800424801F0F8FF204600F01DFCE3E7521AC261A8
+S31508004258194600F0FCFB00231A461946204602F0C8
+S3150800426809F8D7E783699942E0D8D0F898229342A3
+S31508004278DCD20022114600F0EAFB0021C4F89812A5
+S315080042880B460A46204601F0F5FFC3E7204698473D
+S31508004298D4E7002384F8A0322846C0E7D0F8B83215
+S315080042A85B692BB190F89C22032A03D19847B6E795
+S315080042B80320B4E70320B2E770B50446012380F863
+S315080042C89C320023C0F894324360C0F8A432D0F870
+S315080042D8BC3223B1D0F8B8325B680021984740232E
+S315080042E800221146204601F092FF0126A4F86461CF
+S315080042F84025C4F860512B4600228021204601F04B
+S3150800430886FFA6842562002070BD017400207047C8
+S3150800431890F89C3280F89D32042380F89C3200205D
+S31508004328704790F89C32042B01D00020704790F80B
+S315080043389D3280F89C32F8E708B590F89C32032B32
+S3150800434801D0002008BDD0F8B832DB69002BF8D0B8
+S315080043589847F6E700207047002070470020704706
+S3150800436808B5012380F89C32D0F8B83213B15B68D7
+S3150800437801799847002008BD0346002002E001306D
+S31508004388C0B201331A78002AF9D1704708B54B88A4
+S31508004398012B00D008BDC0F8A43200F068FBF9E785
+S315080043A80B7803704B7843708B78CA7843EA0223F4
+S315080043B843800B794A7943EA022383808B79CA7941
+S315080043C843EA0223C380704710B50446802101F0EA
+S315080043D831FF0021204601F02DFF10BD30B583B00E
+S315080043E804460D460023ADF806304A88130A013BF1
+S315080043F80E2B00F2BC80DFE803F0153044BABA9EEB
+S31508004408ABBABABABABABABA0800D0F8B432DB69DB
+S3150800441823B10DF10601007C98470AE02946FFF703
+S31508004428D3FF18E0D0F8B4321B680DF10601007CFA
+S315080044389847EA88002A00F0A380BDF80630002BC2
+S3150800444800F099809A4228BF1A46ADF80620014618
+S31508004458204600F0EFFA03B030BD037C43B9D0F824
+S31508004468B8329B6A0DF10600984702234370E0E7C5
+S31508004478D0F8B832DB6A0DF1060098470223437074
+S31508004488D7E7D2B2052A52D8DFE802F003101D2A68
+S315080044983744D0F8B4325B6823B10DF10601007CC5
+S315080044A89847C6E72946FFF78FFFD4E7D0F8B4320E
+S315080044B89B6823B10DF10601007C9847B9E72946A0
+S315080044C8FFF782FFC7E7D0F8B432DB6823B10DF1EE
+S315080044D80601007C9847ACE72946FFF775FFBAE757
+S315080044E8D0F8B4321B6923B10DF10601007C984750
+S315080044F89FE72946FFF768FFADE7D0F8B4325B694E
+S3150800450823B10DF10601007C984792E72946FFF783
+S315080045185BFFA0E7D0F8B4329B6923B10DF1060119
+S31508004528007C984785E72946FFF74EFF93E7294613
+S31508004538FFF74AFF8FE7037C33B9D0F8B8325B6BCD
+S315080045480DF10600984774E72946FFF73DFF82E70D
+S31508004558037C43B9D0F8B8321B6B0DF106009847AF
+S315080045680723437065E72946FFF72EFF73E72946B1
+S31508004578FFF72AFF6FE729462046FFF725FF6AE770
+S31508004588204600F074FA66E738B504468B88F3B90E
+S31508004598CB88E3B94B887F2B19D803F07F0590F8A9
+S315080045A89C32032B0CD080F89E52294601F052FE05
+S315080045B8204600F05CFA35B1022384F89C3209E0FB
+S315080045C8FFF702FF06E0012384F89C3202E0204642
+S315080045D8FFF7FAFE38BD000070B504460E468D781A
+S315080045E82D4B1D70012D0FD890F89C32022B0FD039
+S315080045F8032B23D0FFF7E8FE274B19782046FFF749
+S3150800460892FD0325284670BDFFF7DEFE0325F9E768
+S315080046188DB145602946FFF77DFD054620B131462F
+S315080046282046FFF7D1FEEDE7204600F020FA0323DF
+S3150800463884F89C32E6E700F01AFAE3E7CDB1416858
+S315080046488D4225D0C9B2FFF76EFD134B1978616004
+S315080046582046FFF75FFD0546B0B131462046FFF70D
+S31508004668B3FE21792046FFF75EFD022384F89C32C3
+S31508004678C8E7022380F89C3245602946FFF753FDB0
+S31508004688204600F0F4F9BDE7204600F0F0F9B9E74E
+S3150800469800F0EDF90025B5E7DC05002408B5CB8858
+S315080046A8012B0AD190F89C32022B09D9032B09D180
+S315080046B80122011D00F0BEF901E0FFF785FE08BDDD
+S315080046C85BB213B9FFF780FEF9E70146002341F804
+S315080046D8083F012200F0AEF9F1E708B590F89C32D8
+S315080046E8013B022B12D8CB88022B0CD10123C360BD
+S315080046F8D0F8A4320BB10323C360022200F10C01DF
+S3150800470800F098F908BDFFF75FFEFBE7FFF75CFEC8
+S31508004718F8E708B590F89C32013B022B09D84B8874
+S31508004728012B00D008BD0023C0F8A43200F09FF979
+S31508004738F8E7FFF749FEF5E738B50C7804F06004A2
+S31508004748202C06D0402C04D054B1FFF73DFE002497
+S3150800475804E0D0F8B8329B6898470446204638BD26
+S315080047684D78092D1DD8DFE805F012191C161C0806
+S31508004778051C0F0BFFF732FEF0E7FFF705FFEDE71D
+S31508004788FFF72AFF0446E9E7FFF788FFE6E7FFF79A
+S31508004798A4FF2C46E2E7FFF7F9FDDFE7FFF7B9FFC5
+S315080047A8DCE7FFF711FED9E770B505460C460B7826
+S315080047B803F06003202B07D0402B05D023B1FFF761
+S315080047C803FE0026304670BD95F89C32013B022B45
+S315080047D818D82379012B0FD8D5F8B8329B68214603
+S315080047E8284698470646E388002BEBD10028E9D1E6
+S315080047F8284600F03CF9E5E721462846FFF7E4FD98
+S315080048080026DFE721462846FFF7DEFD0026D9E71A
+S31508004818F8B506460D468B880C7804F06004202CFB
+S3150800482808D0D9B2402C05D06CB12946FFF7CCFD83
+S31508004838002406E0D6F8B8329B68294630469847D9
+S3150800484804462046F8BD6F78012F2FD0032F05D0D0
+S31508004858002F57D02946FFF7B7FDF2E790F89C32A4
+S31508004868022B05D0032B12D02946FFF7ADFDE8E742
+S31508004878002918BF802906D001F0DCFC80213046C3
+S3150800488801F0D8FCDDE72946FFF79EFDD9E76B88D6
+S315080048982BB9002918BF802901D0EB881BB13046EF
+S315080048A800F0E5F8CDE701F0C5FCF8E790F89C328A
+S315080048B8022B05D0032B12D02946FFF785FDC0E742
+S315080048C8002918BF802906D001F0B4FC802130469B
+S315080048D801F0B0FCB5E72946FFF776FDB1E76B8826
+S315080048E8002BAED111F07F0F09D1304600F0BFF882
+S315080048F8D6F8B8329B68294630469847A1E701F0AA
+S31508004908A1FCF2E790F89C22022A06D0032A2AD0AC
+S315080049182946FFF759FD3C4693E7002918BF802921
+S3150800492813D113F0800F15D101F07F0101EB810136
+S31508004938890001F5A8710144043100230B6002229D
+S31508004948304600F077F83C467BE72946FFF73CFDFA
+S315080049583C4676E701F07F0101EB810189001031B9
+S3150800496801440431E9E75BB2002B20DB01F00F02B2
+S3150800497802EB820200EB8202B2F864212AB3002B0A
+S3150800498828DB01F07F0303EB83039C0004F5A87476
+S3150800499834440434802918BF002924D1002323600D
+S315080049A802222146304600F045F83C4649E701F020
+S315080049B80F0202EB820200EB8202928C002ADED1F9
+S315080049C82946FFF701FD3C463BE72946FFF7FCFC6D
+S315080049D83C4636E701F07F0303EB83039C0010345B
+S315080049E834440434D6E7304601F0D2FB10B101232B
+S315080049F82360D5E700232360D2E7D0B170B50D460A
+S31508004A0816460446FFF7B8FC431C5B009BB2338086
+S31508004A182B7003236B70022307E0EA5401345A1CEF
+S31508004A28D2B20021A9540233DBB22278002AF4D183
+S31508004A3870BD704708B513460222C0F894228361F0
+S31508004A48C3610A46002101F00DFC002008BD08B51F
+S31508004A5813460A46002101F005FC002008BD08B5E2
+S31508004A6813460A46002101F005FC002008BD08B5D2
+S31508004A780423C0F8943200231A46194601F0F2FBBB
+S31508004A88002008BD08B50523C0F8943200231A4645
+S31508004A98194601F0EFFB002008BD72B6704762B6EA
+S31508004AA87047000070B5174D2C6D24F040542C65DE
+S31508004AB84FF0000C03E00CF1010C5FFA8CFCBCF11A
+S31508004AC8110F1DD8104C14F81C5004EB4C046678CA
+S31508004AD8AC1904FB00044FF4FA5EBEFBF4FE04FBB3
+S31508004AE80EFEBEF5FA5FE6D1BEFBF4F40C80013C77
+S31508004AF8A4B2B4F5007FDED215701E70012000E05E
+S31508004B08002070BD004402581464000870B58CB0C3
+S31508004B180023ADF82E308DF82D308DF82C300BABE0
+S31508004B280DF12D020DF12E014FF4FA70FFF7BAFFB9
+S31508004B38002842D0234C244B23600025A560E56055
+S31508004B48012626746574A574BDF82E306361A661BE
+S31508004B589DF82D30E3619DF82C3023626662A662C3
+S31508004B68E66226636563A663E563266404236364CD
+S31508004B78A564E36425656365A565E66525666566D2
+S31508004B88A3662046FCF76AF90395049505960696E2
+S31508004B9840F2676307930893099503A92046FCF72B
+S31508004BA8A7FA00963346022211462046FCF7E4FA8D
+S31508004BB82046FCF7FCFA0CB070BDB821034800F093
+S31508004BC8B1FDB7E7E005002400A00040C46300086B
+S31508004BD810B58AB0024640F2E173019300230293A6
+S31508004BE8039309040491059306930793089352239C
+S31508004BF80993012301A90E48FCF7F3FA08B10AB08C
+S31508004C0810BD01210A48FCF725FB0028F7D100F05A
+S31508004C188BFB00F1320401210548FCF71DFC00282E
+S31508004C28EDD000F087FE00F07FFBA042F3D9E6E757
+S31508004C38E005002430B58BB004460D4640210E48E1
+S31508004C48FCF711FC10B900200BB030BD23466A46A4
+S31508004C5840210948FCF710FB60B9009A40F26763DF
+S31508004C689A42F1D1019B002BEED19DF80E302B709C
+S31508004C780120E9E70020E7E7E005002408B5FFF783
+S31508004C880CFF08BD10B500F061FA00B910BDFBF7B6
+S31508004C9827FB0028FAD000F0F9FDFBF79DFE00F087
+S31508004CA81BFB00F057FA054B0340054A936000F0D2
+S31508004CB851FA4468FFF7F3FEA047E7E780FFFF1FAE
+S31508004CC800ED00E070B50D46044606E015F8013B10
+S31508004CD804F8013B00F02EFE3246531E9EB2002A07
+S31508004CE8F4D170BD38B50546002401E00134E4B2B4
+S31508004CF80E2C12D800F01EFE04EB4403084A52F89C
+S31508004D082330AB42F2D804EB4402054901EB820290
+S31508004D1852681344AB42E9D900E0FF24204638BD5F
+S31508004D288C64000808B5C1F3090363B903688B42A4
+S31508004D3801D1012008E040F8041B4FF48062FFF710
+S31508004D48C1FF012000E0002008BD2DE9F041074613
+S31508004D580068FFF7C7FFFF2804D14FF00008404650
+S31508004D68BDE8F081FCF78EFB00264FF0010804E049
+S31508004D78E046B8F1000F1ED001361F2E1BD83C6836
+S31508004D8804EB461407EB4615043500F0D3FD2A460E
+S31508004D9821460120FCF73CFC844650B903461F2BE4
+S31508004DA8E7D8195DEA5CD2B29142E1D10133DBB2A8
+S31508004DB8F5E74FF00008FCF793FBD0E770B50D460A
+S31508004DC80E4B984212D004460D4B994209D10B4E08
+S31508004DD8344626B129462046FFF7A4FF58B130467F
+S31508004DE870BDFFF7B2FF20B12646F2E7054E3446F6
+S31508004DF8EFE70026EDE70026F1E700BF840A00245E
+S31508004E0800000208800600242DE9F84306460C46E9
+S31508004E1817461D46DFF8848001EA08080368B3F1D7
+S31508004E28FF3F0AD0336843450ED14FF00109B9F15F
+S31508004E38010F12D04846BDE8F8834146FFF772FFCE
+S31508004E4881460028F3D0EDE741463046FFF7B6FF1E
+S31508004E580646E8B14FF00109E9E73168641A3444AF
+S31508004E68043405E017F8013B04F8013B013DE1D09D
+S31508004E7800F060FD311D611AB1F5806FF2D308F5AF
+S31508004E8880613046FFF79AFF064620B1041DE9E718
+S31508004E984FF00009CEE74FF00009CBE700FCFFFF0B
+S31508004EA870B5144B00EB400253F8225003EB82000E
+S31508004EB8466815F0030F02D116F0030F04D040F226
+S31508004EC82B310D4800F02EFC002405E02B68B3F1C1
+S31508004ED8FF3F0CD104350134B4EB960F05D214F014
+S31508004EE8FF0FF3D100F026FDF0E7012070BD002082
+S31508004EF8FCE700BF8C64000838640008F0B587B082
+S31508004F0804460D4600230093884203D80E2939D84B
+S31508004F18012600E00026012E02D0304607B0F0BD73
+S31508004F28FCF7B0FA01E00134E4B2AC4227D82046CF
+S31508004F38FFF7B6FF07460028F5D100F0FBFC124B31
+S31508004F4804EB440203EB820153F822204B68002B3A
+S31508004F5818BFB2F1FF3F11D0002301932023059310
+S31508004F684A7A02920B7A039301230493694601A8A5
+S31508004F78FCF71CFC0028D6D03E4600E03E46FCF767
+S31508004F88AFFACAE70026C8E78C6400084FF0FF3373
+S31508004F98024A1360024A1360704700BF800600245D
+S31508004FA8840A002470B504460D4616460139154B81
+S31508004FB81B1A994203D9002001280ED070BDFFF7A5
+S31508004FC891FEFF2801D10020F8E728190138FFF7D4
+S31508004FD889FEFF2814D00120EEE70B4B23400B4A25
+S31508004FE8934206D02B46324621460948FFF70CFF5E
+S31508004FF8E4E72B46324621460648FFF705FFDDE774
+S315080050080020DBE7FFFF1F0800FCFFFF000002087F
+S3150800501880060024840A002470B54A1E0F4B1B1A02
+S315080050289A4205D9FF210E460020012812D070BDE4
+S3150800503805460C46FFF756FE06462C44601EFFF743
+S3150800504851FE0146FF2818BFFF2E01D00120ECE7C4
+S315080050580020EAE73046FFF751FFE8E7FFFF1F0899
+S3150800506800B583B000230193134B1B68B3F1FF3FC8
+S3150800507803D1012003B05DF804FB0F4A5368019376
+S3150800508891680B440193D1680B44019311690B4449
+S31508005098019351690B44019391690B440193D269B1
+S315080050A813440193DB4301930133019301AA0421B5
+S315080050B80248FFF777FFDDE7840A0024980202080A
+S315080050C80A4B1A68596811449A681144DA681144EF
+S315080050D81A6911445A6911449A690A44D3F89832E4
+S315080050E8D34201D10120704700207047000002080A
+S315080050F808B50C4B1B68B3F1FF3F06D10A4B1B6872
+S31508005108B3F1FF3F07D1012008BD0648FFF71DFE8A
+S315080051180028F9D0F2E70448FFF717FE0028F3D06D
+S315080051280120F1E7840A0024800600240048704715
+S315080051380000020808B5FFF729FF08BD08B5FFF7FC
+S3150800514831FF08BD08B5FFF767FF08BD08B5FFF7C3
+S31508005158B7FF08BD08B5FFF7E9FF08BD08B5FFF7AB
+S315080051687FFF00B908BDFFF7C3FFFBE7054BDB69FF
+S3150800517813F0200F04D0034B5B6A037001207047B5
+S31508005188002070470048004010B5094B986200F0A7
+S31508005198CBF800F10A04064BDB6913F0800F05D13A
+S315080051A800F0C8FB00F0C0F8A042F4D910BD00BF53
+S315080051B80048004010B588B00D4C236823F0010359
+S315080051C82360002300934FF46142019202930393EC
+S315080051D804930C2205920693079369462046FEF720
+S315080051E8F9F8236843F00103236008B010BD00BF2F
+S315080051F80048004070B506460D46812904D8284659
+S31508005208FFF7C2FF00240BE08421074800F08AFA5A
+S31508005218F5E700F08FFB305DFFF7B6FF0134A4B25F
+S31508005228ABB2A342F5D870BD4065000870B5254BEA
+S315080052381C78BCB92448FFF799FF012801D02046F5
+S3150800524870BD214B1B78013BDBB2802BF7D800F0E9
+S315080052586BF81E4B18601E4B00221A70194B012258
+S315080052681A70ECE706460D46194B1B7801331648A3
+S315080052781844FFF77BFF0446012815D1144B1A7802
+S315080052880132D2B21A70104B1B789A4201D0002408
+S31508005298D5E710493046FFF715FD0A4B00221A7064
+S315080052A80B4B1B782B70CAE700F03EF8074B1B68B8
+S315080052B8C833984203D90024024B1C70BFE7002460
+S315080052C8BDE700BF0A0F0024880E00240C0F00242F
+S315080052D80B0F0024890E00244FF0E02300221A61E0
+S315080052E85A619A617047000008B5FFF7F5FF4FF055
+S315080052F8E023044A5A6100229A6105211961024B82
+S315080053081A6008BDFF520700100F00244FF0E0236B
+S315080053181B6913F4803F03D0024A136801331360EC
+S31508005328704700BF100F002408B5FFF7EFFF014BC1
+S31508005338186808BD100F002408B5FFF7F5FF08BD63
+S31508005348094B03F11801002232B19A7400225A61F6
+S31508005358064B054A1A6070479A745961183318310A
+S315080053680132D2B2F0E700BF540F0024840F00249C
+S315080053780A4B1B6883B110B4084A5C69146019742F
+S315080053889860D86000225A74186001390844586031
+S31508005398987C5DF8044B7047FF207047840F0024FB
+S315080053A838B504460D46012824D804EB4403164AA2
+S315080053B802EBC3035A7C1B7C9A4221D004EB4403B4
+S315080053C8114A02EBC303DA6815705A7C01325A741B
+S315080053D8DA680132DA605B689A4213D90A4B04EB39
+S315080053E8440253F8322004EB440403EBC404E26095
+S315080053F8012008E04FF4E171044800F093F9D4E776
+S31508005408002000E0012038BD540F002494650008E8
+S3150800541808B50146024B1878FFF7C2FF08BD00BF5A
+S31508005428880F002438B504460D46012822D804EB0F
+S315080054384403144A02EBC303587C10B304EB440331
+S3150800544802EBC3039A6812782A705A7C013A5A748E
+S315080054589A6801329A605B689A4211D9094B04EB3B
+S31508005468440253F8322004EB440403EBC404A26054
+S31508005478012006E04FF4F271034800F053F9D6E725
+S31508005488012038BD540F00249465000808B5014664
+S31508005498024B1878FFF7C6FF08BD00BFCC0F0024DB
+S315080054A810B50446012806D804EB4404054800EB61
+S315080054B8C404607C10BD4FF40171034800F032F94A
+S315080054C8F2E700BF540F00249465000838B5FFF7C3
+S315080054D837FF1B4C4021601CFFF74AFF2070194D07
+S315080054E84021681CFFF744FF28702378FF2B1DD03E
+S315080054F8FF281BD0144C002214492046FEF7BCFD91
+S3150800550813492046FEF7EEFD0120FAF700FF20466C
+S31508005518FEF7FCFDFDF7C4F9D4F8C402FCF7D8FF7A
+S3150800552800F02CF9B0F5FA6F05D338BD842109487F
+S3150800553800F0F8F8DEE74FF4FA6000F019F9F4E736
+S31508005548880F0024CC0F002410100024180100240A
+S31508005558140000249465000810B5064CD4F8C40253
+S31508005568FCF7D4FF2046FEF7A3FD0020FAF7CFFE86
+S3150800557810BD00BF1010002470B506460D463F2919
+S3150800558806D82846FFF744FF012806D100240BE071
+S31508005598BB210D4800F0C6F8F3E7BF210A4800F01A
+S315080055A8C1F8F3E70134A4B2ABB2A3420BD900F0B1
+S315080055B8C1F9305DFFF72CFF0128F3D0C82102484E
+S315080055C800F0B0F8EEE770BD9465000870B50646B9
+S315080055D80D461F4BD3F8C402FCF71EFD1D4B1C785D
+S315080055E89CB91D48FFF752FF012801D0204670BD17
+S315080055F8194B1B78013BDBB23E2BF7D8154B01221A
+S315080056081A70164B00221A70F0E7144B1B780133F0
+S3150800561811481844FFF73AFF0446012801D0002428
+S31508005628E4E70E4B1A780132D2B21A700A4B1B7885
+S315080056389A4201D00024D9E709493046FFF742FBC8
+S31508005648044B00221A70054B1B782B70CEE700BF57
+S315080056581010002420130024E0120024211300242B
+S31508005668E112002430B583B0144B1878FFF718FFF9
+S3150800567808B30546402800D94025002405E09DF8CA
+S3150800568807200F4B1A550134E4B2A5420DD90DF17E
+S3150800569807010A4B1878FFF7C5FE0128EFD04FF423
+S315080056A8A471084800F03EF8E9E72B46044A812128
+S315080056B8054800F0D7FD03B030BD00BF880F0024A9
+S315080056C8140F0024946500081010002470B50446C9
+S315080056D800F0FAFB064621460F4800F070FD85B231
+S315080056E8002401E00134A4B2AC420CD2315D0B4B64
+S315080056F81878FFF755FE0128F4D04FF4B571084815
+S3150800570800F010F8EEE700F0DFFB0246402301211F
+S31508005718014800F0AFFD70BD10100024CC0F00241E
+S315080057289465000808B500F005F9FCE708B500F027
+S31508005738F7F8012803D00B4B1B78012B00D008BDBE
+S31508005748FFF7F2FD084B1B68084A1268134403F56D
+S31508005758FA739842F3D3034B00221A70FFF792FAAA
+S31508005768EDE700BF28130024241300242C13002473
+S31508005778014B1860704700BF24130024014B1868B2
+S31508005788704700BF2413002408B5054B1B78012B66
+S3150800579800D008BDFFF7C8FD024B1860F9E700BF3F
+S315080057A8281300242C13002408B5044B01221A7068
+S315080057B8FFF7EAFFFFF7BAFF08BD00BF2813002462
+S315080057C808B5FFF75BFA00F0B1F8FFF78DFDFFF7AC
+S315080057D8B1FC00F00DF8FFF7E7FF08BD08B500F0C3
+S315080057E8A9F8FFF793FD00F017F8FFF79FFF08BD24
+S315080057F810B500F04FFAFFF789F9064C0123237014
+S31508005808FFF7D8FC00232370FFF760FE02232370F6
+S3150800581810BD00BF1000002400B583B00DF10701C4
+S315080058281848FFF707FA012810D00DF1070115489F
+S31508005838FFF7FCFC012812D00DF107011148FFF704
+S31508005848C5FE012814D003B05DF804FB0E4B0122EF
+S315080058581A709DF807100B4800F03EFAE5E70A4B60
+S3150800586800221A709DF80710064800F035FAE3E793
+S31508005878054B02221A709DF80710024800F02CFA08
+S31508005888E1E700BF301300241000002408B5FFF72D
+S3150800589863FE08BD38B504460D460E4B1B78012B2A
+S315080058A809D00C4B1B7853B10A4B1B78022B0BD02B
+S315080058B800F00AFA38BDC9B2FFF78AF9F1E7E9B282
+S315080058C82046FFF797FCEFE7E9B22046FFF754FEB4
+S315080058D8EEE700BF10000024074B1B78022B07D001
+S315080058E8032B07D0012B01D0812070470820704769
+S315080058F83F2070470020704710000024074B1B788C
+S31508005908022B07D0032B07D0012B01D08120704723
+S31508005918082070473F207047002070471000002471
+S3150800592808B500F0C9F900B1012008BD08B5FAF7AD
+S31508005938E5FC08BD08B5FAF7E6FC08BD024B0022E7
+S3150800594883F88220704700BFB4130024034BFE2255
+S315080059581A7058700222A3F886207047B4130024D8
+S315080059680378427843EA0223827843EA0243C078F6
+S3150800597843EA006070470870C0F307234B70C0F30A
+S3150800598807438B70000EC8707047000010B5064CA8
+S31508005998002384F88130FFF7D1FFFF232370012302
+S315080059A8A4F8863010BD00BFB4130024074BFF22A5
+S315080059B81A7000225A7093F882109970DA701A7160
+S315080059C85A710622A3F88620704700BFB41300242C
+S315080059D808B50020FFF7BAFF08BD000010B5094C46
+S315080059E8FF232370084BC4F8883000236370A3701C
+S315080059F8E370211D0720FFF7BEFF0823A4F88630A9
+S31508005A0810BD00BFB4130024E465000810B5064CA1
+S31508005A18FF2323700430FFF7A3FFC4F88800012387
+S31508005A28A4F8863010BD00BFB413002408B5312089
+S31508005A38FFF78CFF08BD000038B5084CFF23237014
+S31508005A4800256570A570FFF747FFE0702571657139
+S31508005A58A5710723A4F8863038BD00BFB4130024FF
+S31508005A6838B5FFF76BFF0F4C012584F88150FF23E3
+S31508005A7823700023637010226270A370FFF72CFF4F
+S31508005A88E070FFF73BFF2071FFF738FFC0F30720E8
+S31508005A986071A571E5710823A4F88630FFF74AFBFB
+S31508005AA838BD00BFB413002438B50446FFF714FF01
+S31508005AB86278904212D90B4DD5F88810681CFFF702
+S31508005AC801F9FF232B706278D5F888301344C5F896
+S31508005AD8883063780133A5F8863038BD2220FFF769
+S31508005AE835FFFAE7B413002438B50446FFF7F4FE81
+S31508005AF86378984217D9201DFFF732FF01460C4DE7
+S31508005B08C5F888006278681CFFF7DCF8FF232B7055
+S31508005B186278D5F888301344C5F888306378013335
+S31508005B28A5F8863038BD2220FFF710FFFAE700BF30
+S31508005B38B4130024F8B505461746002406E015F8F8
+S31508005B48013B1C44E4B2FFF7F5FE31464E1E002918
+S31508005B58F5D13C600120F8BD30B583B00025019524
+S31508005B680B4CFF2323700430FFF7FAFE014601AAFF
+S31508005B78D4F88800FFF7DEFF6070211D0198FFF74B
+S31508005B88FAFEA570E5700823A4F8863003B030BD80
+S31508005B98B413002438B504460E4BD3F88850FFF7DB
+S31508005BA89BFE621C411E2846FFF7C8FA70B1094CCD
+S31508005BB8FF232370FFF790FE0138D4F88830034492
+S31508005BC8C4F888300123A4F8863038BD3120FFF799
+S31508005BD8BDFEFAE7B413002410B50446FFF77CFEA9
+S31508005BE801386378984216DD134BFF221A70012292
+S31508005BF8A3F88620617891B1A21C0F4BD3F88800C8
+S31508005C08FFF79CFA98B161780B4AD2F888300B44AA
+S31508005C18C2F8883010BD2220FFF798FEFAE7FFF78A
+S31508005C289DFA0028F6D13120FFF790FEF2E73120D9
+S31508005C38FFF78CFEEEE700BFB413002410B50B4B34
+S31508005C48D3F888400430FFF78BFE01462046FFF755
+S31508005C5879FA30B1054BFF221A700122A3F886207B
+S31508005C6810BD3120FFF772FEFAE700BFB41300240F
+S31508005C7808B5FFF707F8034BFF221A700122A3F8A5
+S31508005C88862008BDB413002408B589B2FFF702FEBA
+S31508005C9808BD0000074B002283F88120C3F8882036
+S31508005CA883F88420A3F8862083F8832083F8822043
+S31508005CB8704700BFB4130024024B93F8810000B163
+S31508005CC801207047B4130024024B002283F884206D
+S31508005CD8704700BFB413002408B50378FF2B24D0F7
+S31508005CE8354A92F88120012A2BD1C93B352B53D83E
+S31508005CF8DFE803F04052524F52524C43494652523B
+S31508005D08525252525252525252525252525252525D
+S31508005D185252525252525252525252525252312B95
+S31508005D28282E5252523452373A3DFFF799FE224BE3
+S31508005D3893F88430012B33D01F4BB3F9861000290A
+S31508005D4832DC08BDFFF7B0FEF1E7FFF7CDFEEEE758
+S31508005D58FFF75CFEEBE7FFF7FFFEE8E7FFF73EFE17
+S31508005D68E5E7FFF735FEE2E7FFF720FEDFE7FFF78F
+S31508005D780DFEDCE7FFF70EFFD9E7FFF72DFFD6E79D
+S31508005D88FFF75AFED3E7FFF759FFD0E7FFF770FF8B
+S31508005D98CDE7FFF74BFECAE72020FFF7D7FDC6E792
+S31508005DA81020FFF7D3FDC7E71846012380F884308B
+S31508005DB8FFF76AFFC5E700BFB41300242023038052
+S31508005DC8004870474C0000240A230380004870479F
+S31508005DD86C00002408B590F89C32032B01D00020EB
+S31508005DE808BDFFF73FFCFAE708B5FFF73BFC0020BC
+S31508005DF808BD08B50846FFF769FC002008BD00007D
+S31508005E0808B50B7813F060030CD0402B11D14B78EA
+S31508005E18012B0ED18B88072B0BD19E221449FEF72E
+S31508005E2809FE06E04B780A2B14D00B2B17D0062B45
+S31508005E3801D0002008BD4B881B0A212B04D00D4928
+S31508005E481722FEF7F7FDF4E7CA88172A28BF17228C
+S31508005E580949F6E701220949FEF7ECFDE9E78B78D7
+S31508005E6813B9064A1360E4E7FEF7AEFAE1E700BF9E
+S31508005E7878000024550000245E00002480140024BD
+S31508005E8810B50446812100F0CDF90121204600F01D
+S31508005E98C9F9002010BD000010B5044640230222A7
+S31508005EA8812100F0B4F9402302220121204600F09E
+S31508005EB8AEF94023034A0121204600F0DBF9002009
+S31508005EC810BD00BF40140024004870474014002441
+S31508005ED812230B80004870475C01002404230B80BA
+S31508005EE8004870477001002421230B80004870473A
+S31508005EF838010024002393421ED200B510E00CF1A5
+S31508005F08370C01F813C000014FEA430C0CF1010CD9
+S31508005F184FF0000E01F80CE00133DBB2934209D2C8
+S31508005F284FEA107CB0F1204FE9D20CF1300C01F899
+S31508005F3813C0E8E75DF804FB7047000038B50B4B5B
+S31508005F48D3F80008D3F80448D3F80838C01800D19D
+S31508005F5838BD074D0822A91CFFF7CCFF042205F116
+S31508005F6812012046FFF7C6FFF2E700BF00E0F11F5F
+S31508005F787401002408B51A230B80FFF7DFFF0148D0
+S31508005F8808BD00BF7401002408B50A4628B90549A2
+S31508005F980548FEF732FD034808BD02490248FEF7E0
+S31508005FA82CFDF8E784140024EC65000810B50A46A9
+S31508005FB8034C21460348FEF720FD204610BD00BFC6
+S31508005FC8841400240066000808B50A4628B9054955
+S31508005FD80548FEF712FD034808BD02490248FEF7C0
+S31508005FE80CFDF8E7841400241066000808B50A466C
+S31508005FF828B905490548FEF700FD034808BD0249C2
+S315080060080248FEF7FAFCF8E7841400241866000824
+S3150800601808B500F57171D0F80404FEF78CF808BDC8
+S3150800602808B5C1EBC10300EB8303D3F80822D0F8FF
+S315080060380404FEF7ACF808BD08B5C1EBC10300EBCC
+S3150800604883039A6CD0F80404FEF7DAF808BD08B595
+S31508006058D0F80404FEF770F908BD000010B5044628
+S31508006068C3684BB1022B01D1012106E091210748EB
+S31508006078FFF758FB012100E00021D4F80404FEF7D5
+S3150800608844F9D4F80404FEF717F910BD3066000879
+S3150800609810B50446D0F80404FEF73AF92268D2F88F
+S315080060A8003E43F00103C2F8003E236A23B1044ABE
+S315080060B8136943F006031361FAF72AF910BD00BFFE
+S315080060C800ED00E010B50446FAF723F9D4F80404FD
+S315080060D8FEF727F910BD08B5D0F80404FEF73CF911
+S315080060E808BD08B5D0F80404FEF734F908BD10B59C
+S315080060F804460120FAF70BF9D4F80404FEF72EF93A
+S3150800610810BD10B504460020FAF701F9D4F80404BE
+S31508006118FEF726F910BD000002780AB1002070477C
+S3150800612810B503461748C0F80434C3F8C402164B1A
+S315080061380360092343600222C26000230361826167
+S315080061480122C261036243628362C3620363FBF787
+S31508006158D1FD80B90B4C80212046FCF787FB4022ED
+S3150800616800212046FCF75CFB802201212046FCF72B
+S3150800617857FB002010BD4FF493710448FFF7D2FA75
+S31508006188E8E700BFB40100240000084030660008AC
+S31508006198D0F8C43211F0800F08D101F07F01C1EBA5
+S315080061A8C10103EB810191F8FE01704701F07F01F7
+S315080061B8C1EBC10103EB810191F83E00704708B5B0
+S315080061C8D0F8C402FCF775FA08BD032805D8DFE835
+S315080061D800F005040205012070470320704708B53A
+S315080061E8D0F8C402FBF765FEFFF7EFFF08BD08B550
+S315080061F8D0F8C402FBF71CFEFFF7E7FF08BD08B591
+S31508006208D0F8C402FBF735FEFFF7DFFF08BD08B56F
+S3150800621894461A466346D0F8C402FCF79DF9FFF778
+S31508006228D4FF08BD08B5D0F8C402FCF7DAF9FFF7B9
+S31508006238CCFF08BD08B5D0F8C402FCF772FAFFF718
+S31508006248C4FF08BD08B5D0F8C402FCF7AEFAFFF7D4
+S31508006258BCFF08BD08B5D0F8C402FCF769F9FFF712
+S31508006268B4FF08BD08B5D0F8C402FCF72BFAFFF747
+S31508006278ACFF08BD08B5D0F8C402FCF7EBF9FFF780
+S31508006288A4FF08BD70B50D4D0D4C641BA41000265F
+S31508006298A64209D10B4D0C4C00F02EF8641BA4102D
+S315080062A80026A64205D170BD55F8043B9847013625
+S315080062B8EEE755F8043B98470136F2E754660008B6
+S315080062C85466000854660008586600080A4491424D
+S315080062D800F1FF3300D1704710B511F8014B03F8E8
+S315080062E8014F9142F9D110BD02440346934200D1A9
+S315080062F8704703F8011BF9E7F8B500BFF8BC08BCF6
+S315080063089E467047F8B500BFF8BC08BC9E4670475D
+S315080063180000000000000000000000000000000067
+S315080063280000000001000000020000000300000051
+S31508006338040000000000000005000000000000003E
+S315080063480000000000000000060000000000000031
+S315080063580000000000000000070000000000000020
+S3150800636801020304010203040607080900010203DF
+S3150800637804050607080C1014182030400000000011
+S3150800638801020304010203040607080901000000C4
+S3150800639802000000040000000600000008000000D3
+S315080063A80A0000000C000000100000002000000091
+S315080063B8400000008000000000010000433A2F5703
+S315080063C86F726B2F736F6674776172652F4F70657E
+S315080063D86E424C545F57696E5553425F4175746FE8
+S315080063E85F496E7374616C6C2F5461726765742F9C
+S315080063F8536F757263652F41524D434D375F53543A
+S315080064084D333248372F63616E2E63000502060244
+S31508006418060307030803090309040A040B040C0402
+S315080064280C050D050E050F050F06100610071008B2
+S31508006438433A2F576F726B2F736F6674776172655D
+S315080064482F4F70656E424C545F57696E5553425FBD
+S315080064584175746F5F496E7374616C6C2F54617201
+S315080064686765742F536F757263652F41524D434D97
+S31508006478375F53544D333248372F666C6173682E2D
+S315080064886300000000000208000002000101000085
+S3150800649800000408000002000201000000000608C7
+S315080064A800000200030100000000080800000200BE
+S315080064B80401000000000A080000020005010000A7
+S315080064C800000C08000002000601000000000E0883
+S315080064D80000020007010000000010080000020082
+S315080064E80002000000001208000002000102000075
+S315080064F80000140800000200020200000000160846
+S31508006508000002000302000000001808000002004C
+S315080065180402000000001A08000002000502000034
+S3150800652800001C08000002000602000000001E0801
+S315080065380000020007020000433A2F576F726B2FBC
+S31508006548736F6674776172652F4F70656E424C5427
+S315080065585F57696E5553425F4175746F5F496E732D
+S3150800656874616C6C2F5461726765742F536F7572FA
+S3150800657863652F41524D434D375F53544D33324867
+S31508006588372F72733233322E63000000433A2F577F
+S315080065986F726B2F736F6674776172652F4F7065AC
+S315080065A86E424C545F57696E5553425F4175746F16
+S315080065B85F496E7374616C6C2F5461726765742FCA
+S315080065C8536F757263652F41524D434D375F535468
+S315080065D84D333248372F7573622E63004F70656ED8
+S315080065E8424C540057696E5553422042756C6B20CD
+S315080065F844657669636500004F70656E424C5420A1
+S31508006608557365720000000044656661756C740010
+S3150800661857696E5553422042756C6B20496E7465EE
+S3150800662872666163650000002E2E2F5553425F443B
+S3150800663845564943452F5461726765742F757362C9
+S31108006648645F636F6E662E63000000003E
+S30908006654BD0200086D
+S30908006658990200088D
+S3150800665C0090D0030090D003010000001000000049
+S3150800666C04000000A15E0008895E0008095E0008A7
+S3150800667C0000000000000000F15D0008FB5D00084A
+S3150800668CDD5D0008000000000000000000000000AE
+S3150800669CC55D000800000000D15D00080902200055
+S315080066AC010100C0320904000002FF0000000705C2
+S315080066BC81024000FF070501024000FF0A0610018F
+S315080066CC00000040010000000A000000000003065C
+S315080066DC9E001400030057494E5553420000000013
+S315080066EC000000000000800004000100280044009F
+S315080066FC6500760069006300650049006E00740049
+S3150800670C650072006600610063006500470055006D
+S3150800671C4900440000004E007B003800300037006A
+S3150800672C390039003900430033002D004500340088
+S3150800673C450030002D0034003000450041002D0086
+S3150800674C38003100380038002D0034003800450078
+S3150800675C380035003200420035003400460032005D
+S3150800676C42007D0000000000D95E0008E55E0008C6
+S3150800677CB55F0008915F00087D5F0008D15F0008CF
+S3150800678CF55F0008F15E0008050F2100011C1005D5
+S3150800679C00DF60DDD88945C74C9CD2659D9E648A0E
+S315080067AC9F000003069E0001000000001201010272
+S315080067BC00000040501DAC600001010203010000FE
+S315080067CC040309041A03000000000000000000007E
+S315080067DC000000000000000000000000000000009F
+S7050800098D5C
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
index 464ac5cc0..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,9 +69,12 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
+#define USB_SIZ_BOS_DESC 0x21
+
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
@@ -121,6 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#if (USBD_WINUSB_ENABLED == 1)
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#endif
/**
* @}
@@ -140,6 +147,9 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
+#if (USBD_WINUSB_ENABLED == 1)
+, USBD_FS_USR_BOSDescriptor
+#endif /* (USBD_LPM_ENABLED == 1) */
};
#if defined ( __ICCARM__ ) /* IAR Compiler */
@@ -150,7 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
+#else
0x00, /*bcdUSB */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -160,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -169,6 +184,37 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
};
/* USB_DeviceDescriptor */
+/** BOS descriptor. */
+#if (USBD_WINUSB_ENABLED == 1)
+#if defined ( __ICCARM__ ) /* IAR Compiler */
+ #pragma data_alignment=4
+#endif /* defined ( __ICCARM__ ) */
+__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
+{
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -331,6 +377,21 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
+#if (USBD_WINUSB_ENABLED == 1)
+/**
+ * @brief Return the BOS descriptor
+ * @param speed : Current device speed
+ * @param length : Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ UNUSED(speed);
+ *length = sizeof(USBD_FS_BOSDesc);
+ return (uint8_t*)USBD_FS_BOSDesc;
+}
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
/**
* @brief Create the serial number string descriptor
* @param None
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/App/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
index cee15fdcd..7a48424b8 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_CubeIDE/Boot/USB_DEVICE/Target/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/bin/openblt_stm32h743.srec b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/bin/openblt_stm32h743.srec
index 50459f8c2..42041214f 100755
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/bin/openblt_stm32h743.srec
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/bin/openblt_stm32h743.srec
@@ -1,1606 +1,1554 @@
S01D000062696E2F6F70656E626C745F73746D3332683734332E737265638D
-S3150800000000000220050400085504000855040008ED
-S3150800001055040008550400085504000800000000AF
-S315080000200000000000000000000000005504000861
-S31508000030550400080000000055040008550400088F
-S31508000040550400085504000855040008550400081E
-S31508000050550400085504000855040008550400080E
-S3150800006055040008550400085504000855040008FE
-S3150800007055040008550400085504000855040008EE
-S3150800008055040008550400085504000855040008DE
-S3150800009055040008550400085504000855040008CE
-S315080000A055040008550400085504000855040008BE
-S315080000B055040008550400085504000855040008AE
-S315080000C0550400085504000855040008550400089E
-S315080000D0550400085504000855040008550400088E
-S315080000E055040008550400080000000055040008DF
-S315080000F0550400085504000855040008550400086E
-S31508000100550400085504000855040008550400085D
-S31508000110550400085504000855040008550400084D
-S31508000120550400085504000855040008550400083D
-S31508000130550400085504000855040008550400082D
+S3150800000000000220D9020008290300082903000875
+S315080000102903000829030008290300080000000036
+S31508000020000000000000000000000000290300088E
+S315080000302903000800000000290300088D45000870
+S3150800004029030008290300082903000829030008D2
+S3150800005029030008290300082903000829030008C2
+S3150800006029030008290300082903000829030008B2
+S3150800007029030008290300082903000829030008A2
+S315080000802903000829030008290300082903000892
+S315080000902903000829030008290300082903000882
+S315080000A02903000829030008290300082903000872
+S315080000B02903000829030008290300082903000862
+S315080000C02903000829030008290300082903000852
+S315080000D02903000829030008290300082903000842
+S315080000E02903000829030008000000002903000866
+S315080000F02903000829030008290300082903000822
+S315080001002903000829030008290300082903000811
+S315080001102903000829030008290300082903000801
+S3150800012029030008290300082903000829030008F1
+S3150800013029030008290300082903000829030008E1
S3150800014000000000000000000000000000000000A1
-S31508000150550400085504000855040008550400080D
-S3150800016055040008550400085504000855040008FD
-S31508000170550400085504000855040008000000004E
-S3150800018055040008550400085504000855040008DD
-S3150800019055040008550400085504000855040008CD
-S315080001A055040008550400085504000855040008BD
-S315080001B055040008550400085504000855040008AD
-S315080001C0550400085504000855040008550400089D
-S315080001D0550400085504000855040008550400088D
-S315080001E0550400085504000855040008550400087D
-S315080001F0550400085504000855040008550400086D
-S31508000200550400085504000855040008550400085C
-S31508000210550400085504000855040008550400084C
-S31508000220550400085504000855040008000000009D
-S31508000230550400085504000800000000550400088D
-S31508000240550400085504000855040008550400081C
-S31508000250550400085504000855040008550400080C
-S3150800026055040008550400085504000855040008FC
-S31508000270550400085504000855040008000000004D
-S31508000280550400085504000855040008000000003D
-S30D080002900000000055040008F7
+S3150800015029030008290300082903000829030008C1
+S3150800016029030008290300082903000829030008B1
+S3150800017029030008290300082903000800000000D5
+S315080001802903000829030008290300082903000891
+S315080001902903000829030008290300082903000881
+S315080001A02903000829030008290300082903000871
+S315080001B02903000829030008290300082903000861
+S315080001C02903000829030008290300082903000851
+S315080001D02903000829030008290300082903000841
+S315080001E02903000829030008290300082903000831
+S315080001F02903000829030008290300082903000821
+S315080002002903000829030008290300082903000810
+S315080002102903000829030008290300082903000800
+S315080002202903000829030008290300080000000024
+S315080002302903000829030008000000002903000814
+S3150800024029030008290300082903000829030008D0
+S3150800025029030008290300082903000829030008C0
+S3150800026029030008290300082903000829030008B0
+S3150800027029030008290300082903000800000000D4
+S3150800028029030008290300082903000800000000C4
+S30D08000290000000002903000824
S3150800029810B5054C237833B9044B13B10448AFF3AA
-S315080002A800800123237010BDF00400200000000020
-S315080002B8B05C000808B5034B1BB103490348AFF304
-S315080002C8008008BD00000000F4040020B05C0008A7
-S315080002D870B50D4E0D4D761BB61006D000240134A8
-S315080002E855F8043B9847A642F9D1094E094D761B9D
-S315080002F805F0DAFCB61006D00024013455F8043B9C
-S315080003089847A642F9D170BD285F0008285F0008FB
-S31508000318305F0008285F0008024B13B1024800F056
-S3150800032805B870470000000041030008002301468D
-S315080003381A46184600F01EB838B50A4C0A4D641B0A
-S31508000348A4100AD004F18043013B05EB8305013C60
-S3150800035855F804399847002CF9D1BDE8384005F016
-S31508000368A9BC00BF345F0008305F0008704700BFAB
-S31508000378704700BF2DE9F0411E4C05462068904697
-S315080003881F460E46FFF7F2FF1B4B1A68D2F848318C
-S3150800039833B35A6820681F2A27DC4DB9911C0132E5
-S315080003A85A6043F82160FFF7E3FF0020BDE8F081B3
-S315080003B803EB82010124C1F8888004FA02FED3F807
-S315080003C88841022D44EA0E0CC3F888C1C1F80871A1
-S315080003D8E4D1D3F88C114EEA0104C3F88C41DDE761
-S315080003E802F5A673C2F84831D3E7FFF7C1FF4FF005
-S315080003F8FF30DBE728040020145D0008DFF834D056
-S31508000408002103E00C4B5B58435004310B480C4B56
-S3150800041842189A42F6D30B4A02E0002342F8043BF4
-S31508000428094B9A42F9D300F033FDFFF751FF04F060
-S315080004383FF8704700000220345F000800000020DB
-S31508000448F0040020F004002034190020FEE710B557
-S3150800045813460222C0F89422C36103620A460021A1
-S3150800046804F0D4FA002010BD08B513460A46002140
-S3150800047804F0CCFA002008BD08B513460A46002140
-S3150800048804F0CCFA002008BD08B50423C0F8943255
-S3150800049800231A46194604F0B9FA002008BD08B51B
-S315080004A80523C0F8943200231A46194604F0B6FA0A
-S315080004B8002008BD002302781AB10133DBB20130E7
-S315080004C8F9E71846704708B54B88012B00D008BDD0
-S315080004D8C0F8A432FFF7D8FFF9E70B7803704B7812
-S315080004E843708B78CA7803EB022343800B794A79E1
-S315080004F803EB022383808B79CA7903EB0223C38033
-S31508000508704710B50446802104F068FA0021204691
-S3150800051804F064FA10BD30B583B005460C460023CE
-S31508000528ADF806304A88130A013B062B00F2A48068
-S31508000538DFE803F004182CA2A2869300D0F8B0329C
-S315080005481B680DF10601007C9847BDF806201AB10C
-S31508000558E388002B40F09480E388002B00F09A800B
-S3150800056803B030BD037C43B9D0F8B4329B6A0DF1A9
-S315080005780600984702234370E7E7D0F8B432DB6AE7
-S315080005880DF10600984702234370DEE7D2B2052A22
-S3150800059852D8DFE802F003101D2A3744D0F8B032E3
-S315080005A85B6823B10DF10601007C9847CDE7214623
-S315080005B8FFF7A7FFD4E7D0F8B0329B6823B10DF14F
-S315080005C80601007C9847C0E72146FFF79AFFC7E768
-S315080005D8D0F8B032DB6823B10DF10601007C9847E4
-S315080005E8B3E72146FFF78DFFBAE7D0F8B0321B69A3
-S315080005F823B10DF10601007C9847A6E72146FFF7C7
-S3150800060880FFADE7D0F8B0325B6923B10DF106017A
-S31508000618007C984799E72146FFF773FFA0E7D0F8CB
-S31508000628B0329B6923B10DF10601007C98478CE727
-S315080006382146FFF766FF93E72146FFF762FF8FE734
-S31508000648037C33B9D0F8B4325B6B0DF106009847D2
-S315080006587BE72146FFF755FF82E7037C43B9D0F8C5
-S31508000668B4321B6B0DF106009847072343706CE7F5
-S315080006782146FFF746FF73E72146FFF742FF6FE774
-S315080006889A4228BF1A46ADF8062001462846FFF7BB
-S31508000698DEFE61E72846FFF7F7FE61E738B5044648
-S315080006A88B88F3B9CB88E3B94B887F2B19D803F025
-S315080006B87F0590F89C32032B0CD080F89E52294669
-S315080006C804F09CF92046FFF7DFFE35B1022384F8CB
-S315080006D89C3209E0FFF715FF06E0012384F89C32EF
-S315080006E802E02046FFF70DFF38BD000038B504467E
-S315080006F80D468978284B197001290ED890F89C322E
-S31508000708022B0ED0032B21D02946FFF7FAFE224BDF
-S315080007181978204600F072FA02E02946FFF7F1FE3A
-S3150800072838BD81B14160032380F89C3200F059FA3C
-S31508000738022803D02046FFF7A7FEF1E729462046F8
-S31508000748FFF7DFFEECE7FFF79FFEE9E789B14368A5
-S3150800075899421DD0D9B200F051FA0F4B1978616049
-S31508000768204600F03EFA02280DD02046FFF78CFEF8
-S31508000778D6E7022380F89C32416000F03FFA20460B
-S31508000788FFF782FECCE729462046FFF7BAFEC7E7F9
-S31508000798FFF77AFEC4E700BF0C05002008B5CB882A
-S315080007A8012B0CD190F89C325AB29AB1022B09D96E
-S315080007B8032B0FD10122011DFFF749FE01E0FFF7C0
-S315080007C8A0FE08BD0146002341F8083F0122FFF7AD
-S315080007D83EFEF6E7FFF795FEF3E708B590F89C3274
-S315080007E8013B022B12D8CB88022B0CD10123C360FC
-S315080007F8D0F8A4320BB10323C360022200F10C011E
-S31508000808FFF725FE08BDFFF77CFEFBE7FFF779FE35
-S31508000818F8E708B590F89C32013B022B09D84B88B3
-S31508000828012B00D008BD0023C0F8A432FFF72CFE20
-S31508000838F8E7FFF766FEF5E708B50B7803F06003F7
-S31508000848202B05D0402B03D043B1FFF75AFE03E00F
-S31508000858D0F8B4329B689847002008BD4B78092B16
-S315080008681BD8DFE803F011171A141A08051A0E0B15
-S31508000878FFF751FEF0E7FFF711FFEDE7FFF736FF41
-S31508000888EAE7FFF78BFFE7E7FFF7A7FFE4E7FFF7D6
-S315080008981AFEE1E7FFF7BDFFDEE7FFF732FEDBE703
-S315080008A838B505460C460B7803F06003202B06D0AE
-S315080008B8402B04D01BB1FFF724FE002038BD95F85D
-S315080008C89C32013B022B16D82379012B0ED8D5F872
-S315080008D8B4329B68214628469847E388002BECD112
-S315080008E80028EAD12846FFF7CFFDE6E7214628463D
-S315080008F8FFF707FEE1E721462846FFF702FEDCE791
-S3150800090838B504468A880B7803F06003202B08D08C
-S31508000918D0B2402B05D05BB12046FFF7F2FD002088
-S3150800092805E0D4F8B4329B6820469847002038BDBD
-S31508000938202B13D04B78012B43D05DB2002D73D0F2
-S31508000948032B40F0F78094F89C32022B0CD0032B2B
-S3150800095821D02046FFF7D5FD0020E8E7D4F8B432C1
-S315080009689B6820469847E2E7B0F1800318BF012341
-S31508000978002808BF00234BB10146204604F02EF88C
-S315080009888021204604F02AF80020D0E72046FFF701
-S31508000998B8FD0020CBE74B884BB9B0F1800318BFE8
-S315080009A80123002808BF00230BB1CB8823B12046B2
-S315080009B8FFF76AFD0020BAE70146204604F00EF85C
-S315080009C8F5E794F89C32022B06D0032B1BD0204659
-S315080009D8FFF797FD0020AAE7B0F1800318BF0123A7
-S315080009E8002808BF00234BB10146204603F0F6FF4E
-S315080009F88021204603F0F2FF002098E72046FFF7FB
-S31508000A0880FD002093E74B88002B40F0988010F073
-S31508000A187F0F04D12046FFF737FD002087E70146F8
-S31508000A28204603F0E3FFF5E794F89C32022B06D03C
-S31508000A38032B2FD02046FFF764FD002077E7B0F197
-S31508000A48800318BF0123002808BF00239BB912F0AA
-S31508000A58800F15D100F07F0000EB8000830003F5B6
-S31508000A68A8712144043100250D6002222046FFF7AB
-S31508000A78EEFC28465BE72046FFF743FD002056E7CD
-S31508000A8800F07F0000EB8000830003F11001214489
-S31508000A980431E8E752B2002A24DB00F00F0303EB1F
-S31508000AA883039D002544D5F858314BB3002A2CDB1F
-S31508000AB800F07F0202EB8202930003F5A87525442D
-S31508000AC80435802814BF00230123002808BF012302
-S31508000AD82BB300232B60022229462046FFF7B7FCD2
-S31508000AE8002024E700F00F0303EB83039D00254449
-S31508000AF8AB69002BDAD12046FFF703FD002016E77D
-S31508000B082046FFF7FEFC002011E700F07F0202EB03
-S31508000B188202930003F1100525440435D1E70146FE
-S31508000B28204603F007FF10B101232B60D3E7002303
-S31508000B382B60D0E72046FFF7E4FC0020F7E6002004
-S31508000B48F5E6C0B170B50D4616460446FFF7B2FC81
-S31508000B58013040003080287003236B700223217807
-S31508000B6841B101345A1CD2B2E9540233DBB200212E
-S31508000B78A954F4E770BD704798B108B50346D0F88C
-S31508000B88B40210B10020C3F8B40209B1C3F8B01210
-S31508000B981846012380F89C32027003F08FFE002065
-S31508000BA808BD0220704710B50446012380F89C3218
-S31508000BB8D0F8B4325B6801799847204603F0F3FE0B
-S31508000BC8204603F0E0FE002010BD19B1C0F8B412A3
-S31508000BD8002070470220704708B503F0DCFE0020A5
-S31508000BE808BD08B5D0F8B43233B11B68984708B9B8
-S31508000BF8002008BD0220FCE70220FAE708B5D0F86D
-S31508000C08B4325B689847002008BD38B5044600F535
-S31508000C182A752846FFF761FC0123C4F89432B4F80C
-S31508000C28AE32C4F8983294F8A81201F01F03012BC3
-S31508000C380FD05AB23AB1022B10D001F080012046E3
-S31508000C4803F0CCFE03E029462046FFF7F5FD002011
-S31508000C5838BD29462046FFF723FEF8E729462046E9
-S31508000C68FFF74EFEF3E738B50446A9BB1046D4F895
-S31508000C789432032B03D0052B25D0002038E0D4F86E
-S31508000C886031D4F8642193420DD99B1AC4F86031AF
-S31508000C989A4206D99AB201462046FFF7EDFB00208C
-S31508000CA826E092B2F7E7D4F8B4321B691BB194F878
-S31508000CB89C22032A04D02046FFF7E6FB002017E00B
-S31508000CC820469847F7E70025C4F89452294620464F
-S31508000CD803F084FE28460BE00A46D0F8B4329B692E
-S31508000CE83BB190F89C12032905D111469847002074
-S31508000CF838BD0220FCE70220FAE710B504460029A9
-S31508000D0856D11046D4F89432022B09D0002B18BFB6
-S31508000D18042B44D094F8A032012B45D0002010BDEE
-S31508000D28236A626A93421BD8E169B1FBF2F302FBB4
-S31508000D3813132BB98A4203D8D4F8983299421DD38B
-S31508000D48D4F8B432DB681BB194F89C22032A23D062
-S31508000D588021204603F042FE2046FFF7A0FBD9E78C
-S31508000D689A1A226292B201462046FFF77DFB0023B3
-S31508000D781A461946204603F051FECBE700221146CB
-S31508000D882046FFF771FB0021C4F898120B460A465D
-S31508000D98204603F043FEBDE720469847D8E780215A
-S31508000DA8204603F01BFEB5E7002084F8A002B6E744
-S31508000DB80A46D0F8B4325B693BB190F89C1203290D
-S31508000DC805D1114698470020A9E70220A7E702207F
-S31508000DD8A5E770B5044640230022114603F0EBFD4B
-S31508000DE80125C4F858514026C4F8646133460022E0
-S31508000DF88021204603F0DFFDA561666284F89C52CF
-S31508000E080023C4F894326360C4F8A432D4F8B8321C
-S31508000E182BB1D4F8B4325B680021204698470020E5
-S31508000E2870BD01740020704790F89C3280F89D3296
-S31508000E38042380F89C320020704790F89C32042BD3
-S31508000E4801D00020704790F89D3280F89C32F8E768
-S31508000E5808B590F89C32032B01D0002008BDD0F8BD
-S31508000E68B432DB69002BF8D09847F6E700207047BC
-S31508000E78002070470020704708B5012280F89C2298
-S31508000E88D0F8B422526801799047002008BD0000BE
-S31508000E98184AD2F8883043F47003C2F88830164BDB
-S31508000EA81A6842F001021A6000221A611868134982
-S31508000EB8014019609A61DA611A629A62DA621A63FB
-S31508000EC85A639A63DA631A645A64196821F48021A2
-S31508000ED819601A660A4B1A680A4B1340B3F1005F81
-S31508000EE802D2094B01221A60024B4FF000629A603F
-S31508000EF8704700BF00ED00E0004402587FEDF6EAAF
-S31508000F080010005C0000FFFF0881005110B5164B61
-S31508000F186FF00042DA670024DC674FF0FF32C3F847
-S31508000F288020C3F88040C3F88420C3F88440C3F8F7
-S31508000F388820C3F88840C3F88C20C3F88C40C3F8C7
-S31508000F489020C3F89040C3F89420C3F89440C3F897
-S31508000F589820C3F89840C3F89C20C3F89C4003F02F
-S31508000F685FFB204610BD00BF00440258104B1B7893
-S31508000F780BB90120704710B504464FF47A70B0FBD8
-S31508000F88F3F30C4A1068B0FBF3F002F095FA68B967
-S31508000F980F2C01D901200AE0002221464FF0FF3024
-S31508000FA802F058FA044B1C60002000E0012010BD2E
-S31508000FB8340400202C0400203804002010B503202F
-S31508000FC802F036FA02F06AF80F498B69C3F303236D
-S31508000FD80E4AD35C03F01F03D8408B6903F00F034E
-S31508000FE8D35C03F01F0320FA03F3094A1360094B7D
-S31508000FF818600020FFF7BAFF10B10124204610BD7B
-S31508001008044603F05DFAF9E700440258185D00083B
-S31508001018300400202C04002038B5044604F040F8B3
-S315080010280546B4F1FF3F02D0044B1B781C4404F074
-S3150800103837F8401BA042FAD338BD00BF3404002055
-S31508001048204A136843F0010313601E4B1B6813F00C
-S31508001058040FFAD01B4B00221A6119681A4A0A406B
-S315080010681A60184B1B6813F0007FFAD1154B1B68DA
-S3150800107813F0006FFAD1134B1B6813F0005FFAD10F
-S31508001088104B00229A61DA611A621049996210496E
-S31508001098D962104919635A639963DA6319645A64F9
-S315080010A8196821F4802119601A66996E40F2FF7250
-S315080010B80A439A66D3F8D02042F48032C3F8D0207F
-S315080010C8704700BF0044025845EDF6EA00020202DE
-S315080010D80000FF018002010107EE900AF8EE676A30
-S315080010E807EE901AF8EE677A86EEA77A07EE902A40
-S315080010F8F8EE677A06EE903AF8EE666A9FED096AA0
-S3150800110866EE866A77EEA67A27EE277ADDED007A06
-S31508001118F8EE677AC7EE276AFCEEE67A17EE900AC3
-S31508001128704700BF000000392DE9F04182B03E4BF8
-S315080011389B6A03F00303012B24D0BBB1022B28D0EA
-S3150800114800270023036043608360374B9E6AC6F313
-S3150800115805161A6BC2F30802551CDB6A13F0010F51
-S3150800116824D0314B5B6BC3F3CC0821E02E4B1B68AC
-S3150800117813F0040F14D02C4B1B68C3F3C1032B4F71
-S31508001188DF40DEE7284B1B6813F4807F0AD1002767
-S31508001198D7E7254B1B6813F4003F05D10027D0E78E
-S315080011A80027CEE7224FCCE7224FCAE74FF00008C0
-S315080011B8002E36D004461C4BDB6A13F4803F0CD04D
-S315080011C8194B1B6BC3F346230133009343462A4640
-S315080011D831463846FFF780FF2060134BDB6A13F465
-S315080011E8003F0CD0104B1B6BC3F306430133009327
-S315080011F843462A4631463846FFF76EFF60600A4B73
-S31508001208DB6A13F4802F0CD0074B1B6BC3F30663FA
-S315080012180133009343462A4631463846FFF75CFFB2
-S31508001228A06002B0BDE8F081004402580090D003DF
-S3150800123800093D0000127A002DE9F04182B03E4BC4
-S315080012489B6A03F00303012B24D0BBB1022B28D0D9
-S3150800125800270023036043608360374B9E6AC6F302
-S3150800126805369A6BC2F30802551CDB6A13F0100F91
-S3150800127824D0314BDB6BC3F3CC0821E02E4B1B681B
-S3150800128813F0040F14D02C4B1B68C3F3C1032B4F60
-S31508001298DF40DEE7284B1B6813F4807F0AD1002756
-S315080012A8D7E7254B1B6813F4003F05D10027D0E77D
-S315080012B80027CEE7224FCCE7224FCAE74FF00008AF
-S315080012C8002E36D004461C4BDB6A13F4002F0CD0CC
-S315080012D8194B9B6BC3F346230133009343462A46AF
-S315080012E831463846FFF7F8FE2060134BDB6A13F4DD
-S315080012F8801F0CD0104B9B6BC3F306430133009336
-S3150800130843462A4631463846FFF7E6FE60600A4BEA
-S31508001318DB6A13F4001F0CD0074B9B6BC3F30663F9
-S315080013280133009343462A4631463846FFF7D4FE2A
-S31508001338A06002B0BDE8F081004402580090D003CE
-S3150800134800093D0000127A002DE9F04182B0424BAF
-S315080013589B6A03F00303012B24D0BBB1022B28D0C8
-S31508001368002500230360436083603B4B9C6AC4F3F3
-S3150800137805541A6CC2F30802561CDB6A13F4807FFC
-S3150800138824D0354B5F6CC7F3CC0720E0324B1B687B
-S3150800139813F0040F14D0304B1B68C3F3C1032F4D49
-S315080013A8DD40DEE72C4B1B6813F4807F0AD1002545
-S315080013B8D7E7294B1B6813F4003F05D10025D0E76A
-S315080013C80025CEE7264DCCE7264DCAE700272B1C75
-S315080013D818BF0123002C08BF0023002B39D08046EC
-S315080013E81D4BDB6A13F4800F0DD01B4B1B6CC3F324
-S315080013F84623013300933B46324621462846FFF7E3
-S315080014086BFEC8F80000144BDB6A13F4000F0DD006
-S31508001418114B1B6CC3F30643013300933B46324614
-S3150800142821462846FFF758FEC8F804000A4BDB6A27
-S3150800143813F0807F0DD0084B1B6CC3F3066301338A
-S3150800144800933B46324621462846FFF745FEC8F82C
-S31508001458080002B0BDE8F081004402580090D003A5
-S3150800146800093D0000127A00154B1B6903F0380382
-S31508001478182B0ED8DFE803F00F0D0D0D0D0D0D0D09
-S31508001488210D0D0D0D0D0D0D160D0D0D0D0D0D0D59
-S315080014981800002070470A4B1B68C3F3C1030948A4
-S315080014A8D84070470848704700B585B001A8FFF7C7
-S315080014B83BFE019805B05DF804FB0448704700BF79
-S315080014C8004402580090D00300127A0000093D0033
-S315080014D8044B9B6903F00F03034AD35C03F01F030D
-S315080014E8D840704700440258285D0008044BDB6959
-S315080014F8C3F30213034AD35C03F01F03D8407047AB
-S3150800150800440258285D0008044BDB69C3F302232C
-S31508001518034AD35C03F01F03D840704700440258B7
-S31508001528285D000800B585B0C2B24F4BD358020EE5
-S31508001538C0F304218A401340CB4040EA03404B4B92
-S31508001548984228D033D8A3F58133A3F580739842F7
-S3150800155866D019D8A3F58033984251D003F540735D
-S3150800156898420FD1FFF780FF414B9B69C3F30323CA
-S31508001578404AD35C03F01F03D840FFF7A9FFFFF7DB
-S31508001588C3FF24E0002022E03B4B984248D003F5ED
-S315080015987D43984209D1364B1B6813F0005F59D032
-S315080015A801A8FFF7D1FE029811E000200FE0334B9F
-S315080015B898423FD00ED9324B984242D003F5407331
-S315080015C898423ED0A3F58033984233D0002005B020
-S315080015D85DF804FBA3F58033984203D003F54073FE
-S315080015E898420BD1224B1B6813F0040F34D0204BBA
-S315080015F81B68C3F3C1032348D840E8E70020E6E799
-S31508001608FFF732FF1A4B9B69C3F30323194AD35CC6
-S3150800161803F01F03D840FFF75BFFFFF767FFD6E71E
-S31508001628134B1B6813F0006F12D001A8FFF704FECE
-S315080016380298CCE70E4B1B6813F4807F0ED1002066
-S31508001648C5E70B4B1B6F13F0020F09D10020BEE745
-S315080016580020BCE70020BAE70020B8E70A48B6E742
-S315080016684FF40040B3E700BF4C440258080302078A
-S3150800167800440258285D0008080301070800040703
-S31508001688080005070090D00300093D0030B4446BF4
-S315080016980268D2F88410704B194041EA8401C2F8EE
-S315080016A884100268D2F8841021F47F01856B41EA18
-S315080016B80541C2F88410826B22440468D4F888105D
-S315080016C8194041EA8201C4F888100468D4F88810D9
-S315080016D821F4FE01C56B41EA0541C4F88810C16BBF
-S315080016E802EB41020468D4F8A010194041EA8201C5
-S315080016F8C4F8A0100468D4F8A01021F4FE01056CFB
-S3150800170841EA0541C4F8A010046C416C01FB0424A5
-S315080017180268D2F8B010194041EA8401C2F8B0103C
-S315080017280268D2F8B01021F4FE01856C41EA054139
-S31508001738C2F8B010826CC16C01FB02440268D2F888
-S31508001748AC10194041EA8401C2F8AC10026D416D2B
-S3150800175801FB02420468D4F8F010194041EA8201F4
-S31508001768C4F8F0100468D4F8F01021F47C11856DDB
-S3150800177841EA0541C4F8F010816D02EB410204689C
-S31508001788D4F8C0100B4043EA8202C4F8C0200268A5
-S31508001798D2F8C03023F47C13C16D43EA0143C2F87A
-S315080017A8C0300268D2F8C03023F07C53016E43EA91
-S315080017B80163C2F8C030436B284A1A449200C266CD
-S315080017C8836B02EB83030367C16B03EBC1034367B0
-S315080017D8046C416C01FB04F103EB81038367846C99
-S315080017E8C16C01FB04F103EB8103C367046D416D0A
-S315080017F801FB04F103EB8103C0F88030816D03EB2C
-S31508001808C103C0F88430C46D856E05FB04F403EB88
-S315080018188403C0F88830016E01FB05F103EB8103E8
-S31508001828C0F890300E498B4207D8D0F890309342CA
-S315080018380ED9002342F8043BF7E7D0F89C3043F06A
-S315080018482003C0F89C30032380F89830012000E074
-S31508001858002030BC704700BF0300FFFF002B0010B4
-S31508001868FCD30040F0B44C68002C2FD10E698C6864
-S3150800187826430C6846EA84460D6ACC6944EA056438
-S315080018888D692C434D692C43CD682C43D0F8847058
-S31508001898806E03FB00F307EB830547F823606C604B
-S315080018A808350020CB890E4CE35C834216D91418F8
-S315080018B8E678A3781B0443EA0663647843EA0423B4
-S315080018C8145C234345F8043B0430EBE70C698E683F
-S315080018D826430C68264346F08046CDE7F0BC704799
-S315080018E8385D00087047000030B595B004464C22AC
-S315080018F8A04901A804F0C9F9002C00F0388123682A
-S315080019089D4A934220D094F898300BB3226893697D
-S3150800191823F01003936103F0C3FB054623689A690D
-S3150800192812F0080F1AD003F0BBFB401B0A28F5D99A
-S31508001938D4F89C3043F00103C4F89C30032384F898
-S315080019489830012015B030BD03F580736360DAE777
-S3150800195884F899302046FFF7C5FFD7E79A6942F019
-S3150800196801029A6103F09CFB054623689A6912F0FE
-S31508001978010F0FD103F094FB401B0A28F5D9D4F8B8
-S315080019889C3043F00103C4F89C30032384F898304C
-S315080019980120D7E79A6942F002029A61237C012B53
-S315080019A840D02268936943F040039361637C012B16
-S315080019B83ED02268936923F480439361A37C012B64
-S315080019C83CD02268936943F48053936122689369EB
-S315080019D823F44073A1680B4393612268936923F043
-S315080019E8A40393612268136923F010031361E3685B
-S315080019F8012B29D0002B2CD0022B00F09B802268C3
-S31508001A08936943F0800393612268136943F01003CE
-S31508001A181361E368032B1CD12268936943F02003FA
-S31508001A28936116E02268936923F040039361BDE742
-S31508001A382268936943F480439361BFE722689369F0
-S31508001A4823F480539361C1E72268936943F004033A
-S31508001A589361A3695A1EE369013B1B0243EA426381
-S31508001A68226A013A13436269013A216843EA024342
-S31508001A78CB61A368B3F5407F62D0236E33B1226881
-S31508001A88D2F8C030616E0B43C2F8C030E36D226EDF
-S31508001A98D3420DD02168D1F8C83023F00703A26EC7
-S31508001AA814A800EB820252F84C2C1343C1F8C8302C
-S31508001AB8236C6BB12168D1F8BC3023F00703626C3C
-S31508001AC814A800EB820252F84C2C1343C1F8BC3018
-S31508001AD8A36C73B12168D1F8BC3023F07003E26CAB
-S31508001AE814A800EB820252F84C2C43EA0213C1F8F8
-S31508001AF8BC30236D73B12168D1F8BC3023F4E06398
-S31508001B08626D14A800EB820252F84C2C43EA0223B1
-S31508001B18C1F8BC302268184B9A4222D00023C4F870
-S31508001B289430C4F89C30012384F898302046FFF78F
-S31508001B38ADFD07E72268936943F02003936188E7B8
-S31508001B48A36A013BE26A013A43EA0223226B013A95
-S31508001B5843EA0213626A013A216843EA0243CB6000
-S31508001B688BE76268936823F003039360D6E701203E
-S31508001B78E8E600BFC85C000800A0004090F8983066
-S31508001B88013BDBB2012B07D9D0F89C3043F002039E
-S31508001B98C0F89C3001207047CB680A68D2B9072B71
-S31508001BA80ED08A68DB0643EA82730A6943EA024367
-S31508001BB84A691343C26E496842F8213000207047C3
-S31508001BC80A69CB691B0243EA02438A69134343F04D
-S31508001BD86053EFE710B40A6942EA4372072B0ED03E
-S31508001BE88C684B6943EA8473006F496800EBC10443
-S31508001BF840F83120636000205DF8044B70478B6914
-S31508001C08F2E710B490F89840E4B2012C09D0D0F85D
-S31508001C189C3043F00403C0F89C3001205DF8044B5F
-S31508001C287047920042EA011242EA43020168019BA0
-S31508001C381A43C1F880200020F0E790F89830DBB204
-S31508001C48012B07D0D0F89C3043F00403C0F89C3029
-S31508001C5801207047022380F898300268936923F0B8
-S31508001C68010393610023C0F89C301846704770B585
-S31508001C7890F89840013CE4B2012C26D893FAA3F5CB
-S31508001C88B5FA85F50668D6F8C040C4F30544A542F2
-S31508001C980BD2D6F8CC401C420FD0D0F89C3043F073
-S31508001CA84003C0F89C30012016E0D0F89C3043F079
-S31508001CB82003C0F89C3001200EE093FAA3F3B3FA88
-S31508001CC883F3FFF7CFFD002006E0D0F89C3043F0F9
-S31508001CD80203C0F89C30012070BD90F89830DBB23A
-S31508001CE8022B07D0D0F89C3043F00803C0F89C3084
-S31508001CF8012070470368C3F8D01000207047000019
-S31508001D08F0B490F89840E4B2022C40F0BA80402922
-S31508001D180CD0412930D0046D8C4253D8D0F89C3069
-S31508001D2843F02003C0F89C300120B1E00468D4F8D9
-S31508001D38A05015F4FE0F0CD0D4F8A45015F07F0F58
-S31508001D480FD1D0F89C3043F48073C0F89C3001203A
-S31508001D589EE0D0F89C3043F02003C0F89C30012060
-S31508001D6896E0D4F8A440C4F3052C446F456C0CFBE4
-S31508001D7805F504EB85042DE00468D4F8B05015F48D
-S31508001D88FE0F0CD0D4F8B45015F07F0F0FD1D0F849
-S31508001D989C3043F48073C0F89C30012078E0D0F872
-S31508001DA89C3043F02003C0F89C30012070E0D4F83A
-S31508001DB8B440C4F3052C846FC56C0CFB05F504EB1D
-S31508001DC8850407E0C46F456D01FB05F504EB85043A
-S31508001DD84FF0000C256805F080455560002D2CD17C
-S31508001DE82568C5F38A451560256805F00055956088
-S31508001DF8256805F000451561A588D561656805F467
-S31508001E087025D560656805F480155561656805F41B
-S31508001E1800159561E57905F07F0515626568ED0F8A
-S31508001E28556204F108050024D6891A4FBE5DA642F4
-S31508001E3808D92E5D1E550134F6E7256825F0604554
-S31508001E481560D1E740290AD041290DD01F290FD896
-S31508001E580268012303FA01F1C2F8981002E0036840
-S31508001E68C3F8A8C0002013E00368C3F8B8C0F9E7A8
-S31508001E7801F01F010268012303FA01F1C2F89C1058
-S31508001E88F0E7D0F89C3043F00803C0F89C300120EE
-S31508001E98F0BC7047385D00080368D3F8CC300B42AD
-S31508001EA801D00120704700207047402905D00368F3
-S31508001EB8D3F8B40000F07F0070470368D3F8A4008D
-S31508001EC800F07F007047000001F00303032B24D0BD
-S31508001ED811F0010F0BD01D4BDA6822F03002DA60D8
-S31508001EE8DA680243DA60DA6842F08802DA6011F0E2
-S31508001EF8020F11D0154BD3F80C2122F03002C3F883
-S31508001F080C21D3F80C211043C3F80C01D3F80C2183
-S31508001F1842F08802C3F80C2170470C4BDA6822F0A5
-S31508001F283002DA60D3F80C2122F03002C3F80C210B
-S31508001F38DA680243DA60D3F80C211043C3F80C01B7
-S31508001F489A6942F010029A61704700BF0020005251
-S31508001F5830B411F0010F0BD0104DEB6823F4E6638B
-S31508001F68EB60EC6842EA00231C4344F08404EC6006
-S31508001F7811F0020F0FD00949D1F80C3123F4E663A2
-S31508001F88C1F80C31D1F80C3142EA0022134343F068
-S31508001F988403C1F80C3130BC704700BF00200052DA
-S31508001FA8F8B5474B1B7D012B00F088800F46044681
-S31508001FB8434B01221A7500229A61436813F0010FF0
-S31508001FC80DD10026636813F0020F12D1CEB9236823
-S31508001FD8012B1BD04FF0FF333B60A56859E0012160
-S31508001FE84CF2503000F018FA06460028EAD00126C6
-S31508001FF8E8E702214CF2503000F00EFA0028E5D046
-S3150800200801262F4B00221A753046F8BD61682069EB
-S31508002018FFF75AFF636813F0010F12D1636813F0CC
-S31508002028020FEED002214CF2503000F0F5F900B15B
-S315080020380126244AD2F80C3123F00803C2F80C31D9
-S31508002048DFE701214CF2503000F0E6F900B101262D
-S315080020581C4AD36823F00803D360DFE701214CF252
-S31508002068503000F0D9F90646164AD168164B0B4087
-S31508002078D3601CE002214CF2503000F0CDF9064638
-S31508002088104AD2F80C11104B0B40C2F80C319EB905
-S315080020980135E368A2681344AB42B2D9226961687C
-S315080020A82846FFF755FF636813F0010FD6D1636812
-S315080020B813F0020FEBD0DDE73D60A2E70226A3E79F
-S315080020C8D012002000200052FBF8FFFF6A4B984206
-S315080020D822D06A4B98422FD0694B98423CD0694B1C
-S315080020E8984249D0684B984256D0684B984263D074
-S315080020F8674B984270D0674B98427DD0664B98429A
-S3150800210800F08A80654B984200F09680644B9842A6
-S3150800211800F0A2800120704703F58843D3F8882089
-S3150800212842F00102C3F88820D3F8882022F0010279
-S31508002138C3F888200020704703F58043D3F8882021
-S3150800214842F00202C3F88820D3F8882022F0020257
-S31508002158C3F888200020704703F57053D3F8882001
-S3150800216842F00402C3F88820D3F8882022F0040233
-S31508002178C3F888200020704703F56053D3F88820F1
-S3150800218842F00802C3F88820D3F8882022F008020B
-S31508002198C3F888200020704703F55053D3F88820E1
-S315080021A842F01002C3F88820D3F8882022F01002DB
-S315080021B8C3F888200020704703F54053D3F88820D1
-S315080021C842F02002C3F88820D3F8882022F020029B
-S315080021D8C3F888200020704703F53053D3F88820C1
-S315080021E842F04002C3F88820D3F8882022F040023B
-S315080021F8C3F888200020704703F52053D3F88820B1
-S3150800220842F08002C3F88820D3F8882022F080029A
-S31508002218C3F888200020704703F51053D3F88820A0
-S3150800222842F48072C3F88820D3F8882022F4807292
-S31508002238C3F888200020704703F50053D3F8882090
-S3150800224842F40072C3F88820D3F8882022F4007272
-S31508002258C3F888200020704703F5E053D3F8882090
-S3150800226842F48062C3F88820D3F8882022F4806272
-S31508002278C3F8882000207047000002580004025856
-S3150800228800080258000C0258001002580014025898
-S3150800229800180258001C0258002002580024025848
-S315080022A800280258F0B40C6894FAA4F4B4FA84F432
-S315080022B82BE08E68826803FB03F505EB450722EADF
-S315080022C8070205FB06F52A4382600E68CD68426850
-S315080022D822EA060205FB06F52A4342600F69C66824
-S315080022E803FB03F505EB4502D243164005FB07F742
-S315080022F83E43C6604E68022E14D04B6806683240C4
-S3150800230805FB03F31343036001340B6833FA04F23D
-S315080023182BD00122A2401340F6D04A68013A012A76
-S31508002328DCD8C6E7FF2B0ED8066A05FB03F707FBBA
-S3150800233803F3C3EB031726EA07074E6903FB06F3FD
-S315080023483B430362D9E7466A1B0A03FB03F707FB05
-S3150800235803F707FB03F3C3EB031726EA07074E69D8
-S3150800236803FB06F33B434362C7E70020F0BC70470C
-S31508002378024AD36843F08073D3607047004802580E
-S31508002388144BDB6813F0010F09D0124B124A5A6036
-S3150800239802F188325A60DB6813F0010F14D10D4B2D
-S315080023A8D3F80C3113F0010F10D00A4B0A4AC3F8B8
-S315080023B8042102F18832C3F80421D3F80C3113F04A
-S315080023C8010F05D10020704701207047002070478B
-S315080023D80120704700200052230167450D4BDA6833
-S315080023E842F00102DA60DB6813F0010F0DD0094BE1
-S315080023F8D3F80C2142F00102C3F80C21D3F80C31AA
-S3150800240813F0010F03D00020704701207047012000
-S31508002418704700BF00200052F8B505460E4602F080
-S315080024283FFE0746012E09D0364C17E002F038FE63
-S31508002438C01BA84260D88DB903204EE004240DE0DD
-S31508002448314BD3F8103124EA030333F000430CBFA9
-S31508002458012300236BB1B5F1FF3FE7D134F004033C
-S31508002468EED1294B1B6934EA03030CBF0123002369
-S31508002478F0E7012E1CD0244BD3F8103123F068431B
-S3150800248823F480135B0C5B0443F0004333F00242E9
-S3150800249817D1012E25D01C4BD3F8103113F4803FE1
-S315080024A82ED0194B4FF48032C3F81421002014E0BB
-S315080024B8154B1B6923F0684323F480135B0C5B04F4
-S315080024C8E4E712498A691A438A61002B06DA23F077
-S315080024D800430D4AC2F814310120F8BD0A4A53616F
-S315080024E8FAE7094B1B6913F4803F07D0064B4FF4EC
-S315080024F880325A610020F0E70320EEE70020ECE777
-S315080025080020EAE70400008000200052D0120020CC
-S315080025182C4B1B7D012B51D070B50C461546294B03
-S3150800252801221A7501F17841B1F5801F38D216468D
-S31508002538244B00229A6131464CF25030FFF76CFF63
-S31508002548034640BB012E2DD01F4AD2F80C3143F062
-S315080025580203C2F80C31BFF36F8FBFF34F8F0823FE
-S3150800256855F8042B44F8042B013B13F0FF03F7D165
-S31508002578BFF36F8FBFF34F8F31464CF25030FFF7DA
-S315080025884BFF0346012E13D00F49D1F80C2122F030
-S315080025980202C1F80C210B4A00211175184670BDB4
-S315080025A80226C5E7084AD36843F00203D360D2E790
-S315080025B80549CA6822F00202CA60ECE702231846EF
-S315080025C8704700BFD01200200020005200230133B4
-S315080025D80C4A934211D80269002AF8DA036943F0CB
-S315080025E80103036100230133064A934207D80269A7
-S315080025F812F0010FF7D10020704703207047032017
-S31508002608704700BF400D030084B010B5044603A800
-S3150800261880E80E00089B012B1DD1A36B23F4803399
-S31508002628A363E2681A4B1340E360E36823F4401394
-S31508002638E3600F9B012B09D02046FFF7C7FF069BCF
-S31508002648012B1BD0BDE8104004B07047E36843F47B
-S315080026588013E360F0E7E36843F04003E36020464D
-S31508002668FFF7B4FF0C9B23B9A36B43F48033A3632A
-S31508002678E5E7A36B23F48033A363E0E7A36843F095
-S315080026880603A360A36843F02003A360DAE700BF44
-S31508002698BFFFBDFF022A0AD00921C26822F4705278
-S315080026A8C260C36843EA8123C36000207047274B8A
-S315080026B80B44274A934237D9264B0B44264A93425A
-S315080026C834D9264B0B44264A934231D9254B0B4419
-S315080026D802F5C332A03293422CD9234B0B44234A22
-S315080026E8934229D9224B0B4402F5922202F57872B5
-S315080026F8934223D91F4B0B4402F5C32202F52072D5
-S3150800270893421DD91C4B0B4402F5B71202F55872B1
-S31508002718934217D9194B0B4402F5122202F5F862AF
-S31508002728934211D80721B8E70F21B6E70E21B4E777
-S315080027380D21B2E70C21B0E70B21AEE70A21ACE779
-S315080027480921AAE70821A8E70621A6E7405327FF93
-S31508002758FF340C00401E1BFF3F420F0000DC0BFF36
-S315080027687F4F1200808CF9FE60B6E5FE5FE316001F
-S3150800277800D3CEFEC05BB3FE00CA91FEE05459FEF4
-S31508002788836843F00103836000207047836823F059
-S31508002798010383600020704708B5C36823F0C04367
-S315080027A8C360012909D069B9C36843F08043C36087
-S315080027B83220FEF731FC002008BDC36843F00053F9
-S315080027C8C360F5E70120F7E7890141F020010161B7
-S315080027D800230133054A934205D8026912F0200FEF
-S315080027E8F7D1002070470320704700BF400D03004B
-S315080027F81023036100230133054A934205D8026969
-S3150800280812F0100FF7D1002070470320704700BF59
-S31508002818400D0300D0F800381943C0F80018002006
-S315080028287047000084B0F8B5044607A880E80E008B
-S31508002838254600230E2B07D803F1400204EB820233
-S31508002848002151600133F5E7119B23BBD4F80438FE
-S3150800285843F00203C4F80438A36B23F40013A363F4
-S31508002868236843F040032360236843F0800323600A
-S315080028780023C4F8003E04F50066D4F80038C4F806
-S3150800288800380C9B012B10D1099B4BB90021204617
-S31508002898FFF7C0FF0DE0A36B43F40013A363E7E754
-S315080028A801212046FFF7B6FF03E003212046FFF77C
-S315080028B8B1FF10212046FFF787FF074600B1012719
-S315080028C82046FFF795FF00B101270023336173619E
-S315080028D8F3610AE0C3B94FF00060C2F800090022A4
-S315080028E80A614FF67F328A600133079A9A4210D9ED
-S315080028F805EB431202F51061D2F800090028E9DB56
-S315080029080020C2F80009EAE74FF09040C2F800092B
-S31508002918E5E700230AE0C3B94FF00060C2F8000BE8
-S3150800292800220A614FF67F328A600133079A9A4273
-S3150800293810D905EB431202F53061D2F8000B0028CE
-S31508002948E9DB0020C2F8000BEAE74FF09040C2F82E
-S31508002958000BE5E7336923F4807333610023A36129
-S315080029686FF0804363610A9B1BB9A36943F01003A0
-S31508002978A361A2690A4B1343A3610D9B1BB1A36903
-S3150800298843F00803A361119B012B04D03846BDE820
-S31508002998F84004B07047A269024B1343A361F5E7F0
-S315080029A800383C8004000040D0F8083813F00603C5
-S315080029B805D0062B18BF022B03D10220704700202A
-S315080029C870470F207047000070B40B784A78012AC0
-S315080029D820D0D0F81C2803F00F060124B44042EA98
-S315080029E80442C0F81C2800EB4310D0F8003B13F447
-S315080029F8004F0CD1D0F8002B8B68C3F30A03C978AB
-S31508002A0843EA81431343134A1A43C0F8002B0020AC
-S31508002A1870BC7047D0F81C4803F00F06B24092B253
-S31508002A282243C0F81C2800EB4310D0F8002912F4FA
-S31508002A38004FECD1D0F800498A68C2F30A02C9786F
-S31508002A4842EA814242EA8353234302491943C0F8BA
-S31508002A580019DCE70080001070B40B784A78012A60
-S31508002A681FD0D0F83C5803F00F06012404FA06F6DE
-S31508002A7825EA0645C0F83C58D0F81C58097801F0EC
-S31508002A880F018C4025EA0444C0F81C4800EB4310A3
-S31508002A98D0F8002B124B1340C0F8003B002070BC3E
-S31508002AA87047D0F83C6803F00F0402FA04F4A4B29D
-S31508002AB826EA0404C0F83C48D0F81C48097801F00E
-S31508002AC80F018A4092B224EA0202C0F81C2800EBD9
-S31508002AD84310D0F80039034A1A40C0F80029DDE740
-S31508002AE80078F3EF007833EC70B40B784C78012C47
-S31508002AF824D000EB431000F530631D693E4C2C408A
-S31508002B081C611D693D4C2C401C614C690CB18C68D4
-S31508002B184C611C6944F400241C611C698D68C5F362
-S31508002B2812052C431C61012A61D0D0F8003B43F0FA
-S31508002B380443C0F8003B002070BC70474C695CBB76
-S31508002B4800EB4314D4F810692C4D3540C4F81059D5
-S31508002B58D4F8105945F40025C4F81059D4F8106962
-S31508002B68254D3540C4F81059012A31D000EB4313D6
-S31508002B78D3F8002942F00442C3F800294B69002B10
-S31508002B88D9D0D0F83428097801F00F040121A140DA
-S31508002B980A43C0F83428CEE700EB431404F510645A
-S31508002BA82669154D354025612669144D3540256138
-S31508002BB84E698D68AE4200D94D61256945F40025F0
-S31508002BC8256125694E69C6F3120635432561CBE7A3
-S31508002BD80A691AB100EB4311C1F8142900EB43102E
-S31508002BE8D0F8002942F00442C0F80029A3E7CA68C9
-S31508002BF8002A9AD05A6198E70000F8FFFFFF07E015
-S31508002C0870B49DF80C4064B903339E08B44208D2E0
-S31508002C1800EB023303F5805351F8045B1D60013459
-S31508002C28F4E7002070BC7047F0B583B00B784C7891
-S31508002C38012C29D000EB431303F5306426697C4D33
-S31508002C483540256126697B4D354025614D69002D3E
-S31508002C5840F0BF8025698E68C6F31206354325619C
-S31508002C68256945F400252561012A00F0C780CA7838
-S31508002C78012A00F0C980D3F8002B42F00442C3F8B1
-S31508002C88002B002003B0F0BD4C6974BB00EB43145D
-S31508002C98D4F81069674D3540C4F81059D4F8105956
-S31508002CA845F40025C4F81059D4F81069604D354024
-S31508002CB8C4F81059012A4AD000EB4313D3F800493F
-S31508002CC844F00444C3F80049CC78012C68D04B6911
-S31508002CD8002BD6D0D0F83428097801F00F04012142
-S31508002CE8A1400A43C0F83428CBE700EB4314D4F8CC
-S31508002CF810694F4D3540C4F81059D4F810694D4D30
-S31508002D083540C4F81059D4F810694D698F683D44A0
-S31508002D18013DB5FBF7F5484F07EAC5453543C4F8FD
-S31508002D281059D4F810594E69C6F312063543C4F833
-S31508002D38105904F51064CD78012DBBD1256925F005
-S31508002D48C0452561256945F000552561B2E70A6938
-S31508002D581AB100EB4314C4F81429CA78012A08D012
-S31508002D6800EB4313D3F8002942F00442C3F80029BC
-S31508002D7887E7D0F8082812F4807F08D100EB4311BA
-S31508002D88D1F8002942F00052C1F80029E8E700EB1B
-S31508002D984311D1F8002942F08052C1F80029DFE72B
-S31508002DA8D0F8084814F4807F0CD1D3F8004944F0C9
-S31508002DB80054C3F8004900928B8A0A78C968FFF755
-S31508002DC81FFF5EE7D3F8004944F08054C3F800496A
-S31508002DD8F1E78E683544013DB5FBF6F52669164FC9
-S31508002DE807EAC5473E43266127698E68ADB206FBE2
-S31508002DF805F5C5F312053D43256135E7CA68002A76
-S31508002E083FF435AF626132E7D0F8082812F4807FBC
-S31508002E1806D1D3F8002B42F00052C3F8002B2AE754
-S31508002E28D3F8002B42F08052C3F8002B23E700BFE3
-S31508002E380000F8FFFFFF07E00000F81F03329208BA
-S31508002E48002393420CD210B400F58054246841F844
-S31508002E58044B01339342F7D308465DF8044B704791
-S31508002E68084670470B784A78012A14D000EB4310B5
-S31508002E78D0F8002B002A06DB2BB1D0F8003B23F04C
-S31508002E888043C0F8003BD0F8003B43F40013C0F871
-S31508002E98003B0020704700EB4310D0F80029002AB1
-S31508002EA806DB2BB1D0F8003923F08043C0F8003987
-S31508002EB8D0F8003943F40013C0F80039E9E70B786D
-S31508002EC84A78012A0ED000EB4310D0F8003B23F4C9
-S31508002ED80013C0F8003BCB78023BDBB2012B15D9AF
-S31508002EE80020704700EB4310D0F8003923F400138C
-S31508002EF8C0F80039CB78023BDBB2012BF0D8D0F802
-S31508002F08003943F08053C0F80039E9E7D0F8003BA8
-S31508002F1843F08053C0F8003BE2E738B50546044657
-S31508002F2800220E2A09D804EB42134FF67F31C3F85C
-S31508002F380819C3F8081B0132F3E70022C5F8102858
-S31508002F48C5F81428C5F81C282846FFF751FC034677
-S31508002F5808B1184638BD10212846FFF735FC034640
-S31508002F68F7E7D0F8003823F4FE63C0F80038D0F83D
-S31508002F780038090101F4FE610B43C0F80038002047
-S31508002F88704708B5D0F8043823F00203C0F80438A7
-S31508002F980320FEF741F8002008BD08B5D0F8043824
-S31508002FA843F00203C0F804380320FEF735F800207A
-S31508002FB808BD4269806910407047D0F8183800F58E
-S31508002FC80060C0691840000C7047D0F8183800F53A
-S31508002FD80060C069184080B2704700EB4111D1F80B
-S31508002FE8082B00F5006040691040704710B4D0F807
-S31508002FF81048D0F8343801F00F02D340DB01DBB2B1
-S31508003008234300EB411000F51060806818405DF80E
-S31508003018044B7047406900F001007047D0F8002952
-S31508003028054B1340C0F80039D0F8043843F48073C8
-S31508003038C0F804380020704700F8FFFF10B4046C85
-S31508003048154B9C4203D9D0F8003B002B16DB00240D
-S31508003058C0F8104BD0F8104B44F40024C0F8104BB5
-S31508003068D0F8104B44F01804C0F8104BD0F8104BA1
-S3150800307844F0C044C0F8104B012903D000205DF87D
-S31508003088044B7047C0F8142BD0F8003B43F0802354
-S31508003098C0F8003BF2E700BF0A30544F724B1B6971
-S315080030A803F03803102B00F0DB80182B10D00BB177
-S315080030B86E4870476C4B1B6813F0200F00F0D280DF
-S315080030C8694B1868C0F3C100694B23FA00F07047CA
-S315080030D8654A916A01F00301906AC0F30510D36A3C
-S315080030E803F00103526BC2F3CC0203FB02F307EEAB
-S315080030F8903AF8EE677A002800F0B580012966D07C
-S31508003108F9B1022900F08F8007EE100AF8EE476A2F
-S315080031189FED586A86EE267A534B1B6BC3F3080352
-S3150800312806EE903AF8EE666A9FED536A67EE867A77
-S3150800313876EEA77AF7EE006A77EEA67A27EE277A6A
-S3150800314861E0494B1B6813F0200F23D046490A68EB
-S31508003158C2F3C102464BD34007EE103AF8EE476A67
-S3150800316807EE100AB8EE476A86EE867A0B6BC3F343
-S31508003178080306EE903AF8EE666A9FED3F6A67EE30
-S31508003188867A76EEA77AF7EE006A77EEA67A27EEBB
-S31508003198277A38E007EE100AF8EE476A9FED376A8D
-S315080031A886EE267A304B1B6BC3F3080306EE903A75
-S315080031B8F8EE666A9FED306A67EE867A76EEA77A43
-S315080031C8F7EE006A77EEA67A27EE277A1BE007EE6F
-S315080031D8100AF8EE476A9FED276A86EE267A224B8A
-S315080031E81B6BC3F3080306EE903AF8EE666A9FED82
-S315080031F8226A67EE867A76EEA77AF7EE006A77EE9F
-S31508003208A67A27EE277A184B1B6BC3F34623013396
-S3150800321807EE903AF8EE677AC7EE276AFCEEE67A82
-S3150800322817EE900A704707EE100AF8EE476A9FED00
-S31508003238146A86EE267A0C4B1B6BC3F3080306EE54
-S31508003248903AF8EE666A9FED0C6A67EE867A76EE2D
-S31508003258A77AF7EE006A77EEA67A27EE277AD2E7F4
-S3150800326808487047024870470044025800093D005C
-S315080032780090D0030024744A000000390024744CD6
-S315080032880024F44A00127A0008B5FFF707FF0B4A2C
-S315080032989369C3F303230A49CB5C03F01F0320FA97
-S315080032A803F3926902F00F02885C00F01F0023FA04
-S315080032B800F0044A1060044A136008BD0044025826
-S315080032C8185D0008300400202C040020014B186003
-S315080032D8704700BF2C04002038B5036813F0010FA7
-S315080032E840F08C800D4604460368454A1A408B68A8
-S315080032F809690B4369690B43E9690B43134303607F
-S31508003308EB68426822F4405213434360AB6982680B
-S3150800331822F44072134383603A4B984216D03A4BCC
-S3150800332898421CD0394B98421DD0394B98421ED02A
-S31508003338384B98421FD0384B984220D0374B984282
-S3150800334821D0374B984222D001204EE03548FEF767
-S31508003358E9F8002848D06A68EAB9012045E0324801
-S31508003368FEF7E0F8F5E73048FEF7DCF8F1E72E480F
-S31508003378FEF7D8F8EDE72C48FEF7D4F8E9E7294828
-S31508003388FEF7D0F8E5E72848FEF7CCF8E1E726483F
-S31508003398FEF7C8F8DDE72B68E9690B2B2CD8B1F5D9
-S315080033A8004F0DD0DBB2214951F82330B0FBF3F3B7
-S315080033B803EB5203B3FBF2F39BB2E360002014E07D
-S315080033C8DBB21A4951F82330B0FBF3F0530803EB84
-S315080033D84000B0FBF2F34FF6F0721A40C3F342030B
-S315080033E81343E360002000E00120E26A22F00F029E
-S315080033F82B881343E36202E00020F6E7012038BD74
-S31508003408F369FFEF001001400044004000480040FF
-S31508003418004C00400050004000140140007800406D
-S31508003428007C00400803000708000007485D0008FC
-S315080034380649CB6823F4E0631B041B0C000200F45E
-S31508003448E0600343024A1A43CA60704700ED00E089
-S315080034580000FA0530B4154BDB68C3F30223C3F141
-S315080034680704042C28BF04241D1D062D01D9033B77
-S3150800347800E000234FF0FF3505FA04F421EA0401B9
-S31508003488994005FA03F322EA03031943002805DBE2
-S315080034980901C9B2064B195430BC704700F00F0031
-S315080034A80901C9B2034B1954F6E700BF00ED00E05D
-S315080034B800E400E014ED00E00138B0F1807F0AD29C
-S315080034C8064B5860064AF02182F8231000209860B7
-S315080034D807221A6070470120704700BF10E000E015
-S315080034E800ED00E030B40468606A29B940EA024091
-S315080034F8A062002030BC70470D46A36A00EB134053
-S315080035080023691E8B4209D203F1400104EB8101AD
-S31508003518496800EB11400133DBB2F2E740EA0240A2
-S3150800352805F13F0104EB81014860E2E70368596247
-S3150800353800207047024603680121C0F8FC130020E2
-S3150800354882F8F4039A6942F000629A61596D024A50
-S315080035580A435A65704700BF0300001070472DE9F3
-S31508003568F04782B0D0F80080CA00521A9300034484
-S315080035785A6D1B6D9A4255D8C1469B1AC1EBC104B0
-S31508003588A2000244526C9A4200D31A460C460746D1
-S3150800359802F1030A4FEA9A0A15E006F1030A4FEA06
-S315080035A89A0AE3001B1B9D003D44A96C3B7C0093CB
-S315080035B8B3B2E2B24046FFF723FBAB6C3344AB64C5
-S315080035C86B6D1E446E6509EB441303F510639B691E
-S315080035D89BB2534512D3E3001B1B9A003A44516D1C
-S315080035E8136D99420AD24BB15B1AC4EBC4018A001F
-S315080035F83A44566C9E42D0D31E46CEE7E3001B1BC0
-S31508003608980007443A6D7B6D9A420FD804F00F0468
-S315080036180123A340D8F8344824EA0304C8F83448F0
-S31508003628002000E0012002B0BDE8F0870020FAE794
-S315080036387047F0B58BB0002800F0918004460568FD
-S3150800364890F8BD3323B3032384F8BD33EB6B13F427
-S31508003658807F01D1002323612068FFF797F8254664
-S3150800366855F8107B6E460FCD0FC60FCD0FC695E8D9
-S31508003678030086E80300231D0ECB3846FEF7C4FF71
-S3150800368858B1022384F8BD33012528460BB0F0BD8E
-S3150800369880F8BC33FFF7CCFFD5E700212068FFF791
-S315080036A87BF800236568AB4216D2D900C81A82008F
-S315080036B82244012082F83D0082F83C30A2F84230C4
-S315080036C8002082F83F0050649064CA1A9100214489
-S315080036D808650133DBB2E5E700239D4216D9D80011
-S315080036E8C11A8A002244002182F8FD1182F8FC31A9
-S315080036F882F8FF11C2F80412C2F80812C21A90001A
-S315080037082044C0F810120133DBB2E6E7254655F81F
-S31508003718107B6E460FCD0FC60FCD0FC695E8030072
-S3150800372886E80300231D0ECB3846FFF77BF80546C7
-S3150800373860B9002384F83830012384F8BD33636AF6
-S31508003748012B08D02068FFF728FC9EE7022384F897
-S31508003758BD33012599E72046FFF7ECFEF2E7012578
-S3150800376893E77047026890F8BC33012B19D010B557
-S31508003778012380F8BC33836A012B0AD00446006803
-S31508003788FFF7FFFB2068FEF7FBFF002084F8BC0361
-S3150800379810BD8369012BF1D0936B43F4803393638F
-S315080037A8ECE70220704738B590F8BC33012B18D0DF
-S315080037B80446012380F8BC330068FEF7E7FF206853
-S315080037C8FFF7ABFB054628B1002384F8BC3301256F
-S315080037D8284638BD2068FFF7E0FB002384F8BC3389
-S315080037E8F6E70225F4E768B110B50446032380F81E
-S315080037F8BD33FFF7D8FF2046FFF7B3FF002084F84C
-S31508003808BD0310BD0120704770B504460D46006813
-S31508003818066C00EB411303F530639A6821690129A0
-S3150800382811D037498E4254D03DB9C5EBC50293002D
-S315080038382344D3F81032002B5CD0E9B2204600F0B6
-S31508003848C1FF002070BD12F0080F09D02D498E421D
-S31508003858F7D912F4004FF4D04FF400429A60F0E713
-S3150800386812F0200F02D020229A60EAE712F0280FF9
-S31508003878E7D124498E4206D912F4004F03D04FF4F3
-S3150800388800429A60DDE7E900491B8A002244D2F81B
-S3150800389804121B69C3F31203C91AC2F81412D2F820
-S315080038A80412D2F808320B44C2F8083235B9C5EB07
-S315080038B8C50293002344D3F8103223B1E9B220464F
-S315080038C800F080FFBDE704F571720121FFF7B6FB2A
-S315080038D8F4E712F4004F03D04FF400429A60B0E7B9
-S315080038E812F0200F01D020229A60E9B2204600F093
-S315080038F869FFA6E704F571720021FFF79FFB9CE7AD
-S315080039080A31544F0A30544F38B5044603681D6CBB
-S3150800391803EB4111D1F8082B0E4B9D4207D901F547
-S31508003928306112F4004F02D04FF400438B602046F2
-S3150800393800F040FF074B9D4202D92369012B01D0AD
-S31508003948002038BD04F5717201212068FFF776FB5F
-S31508003958F6E700BF0A30544F2DE9F84F04460568C4
-S315080039682846FFF757FB08B1BDE8F88F2F460646E5
-S315080039782068FFF71EFB0028F6D02068FFF719FB1A
-S3150800398810F0020F04D02268536903F0020353614A
-S315080039982068FFF70EFB10F0100F15D02268936900
-S315080039A823F010039361D5F8208008F00F09C8F3AF
-S315080039B84343022B00F08580062B00F0A580226879
-S315080039C8936943F0100393612068FFF7F2FA10F43D
-S315080039D8002F40F0AD802068FFF7EBFA10F4802F2F
-S315080039E840F0F1802068FFF7E4FA0028C0F25F810A
-S315080039F82068FFF7DEFA10F4006F0AD0D5F8083801
-S31508003A0813F0010F40F06D812268536903F40063CF
-S31508003A1853612068FFF7CDFA10F0006F15D02268B9
-S31508003A28536903F00063536194F8F433002B40F0AC
-S31508003A385C81012184F8F41323685B6DC3F383035F
-S31508003A48C4F8F8332046FFF789FD2068FFF7B1FA6E
-S31508003A5810F4805F40F04D812068FFF7AAFA10F449
-S31508003A68005F40F0AB812068FFF7A3FA10F0080F53
-S31508003A7840F0BC812068FFF79CFA10F4801F40F0DC
-S31508003A88BE812068FFF795FA10F4001F40F0C1813F
-S31508003A982068FFF78EFA10F0804F40F0C48120683E
-S31508003AA8FFF787FA10F0040F3FF45EAF23685D68E6
-S31508003AB815F0040F40F0C081226853682B43536001
-S31508003AC852E747F6F07318EA030F3FF478AF4FEA60
-S31508003AD818184FEAC90BABEB09034FEA830AA24445
-S31508003AE8C8F30A02DAF808122846FFF7A7F9C8F34E
-S31508003AF80A08DAF808324344CAF80832DAF81432F7
-S31508003B084344CAF814325AE7082204F5717128465C
-S31508003B18FFF794F9C8F30A184FEAC903A3EB090192
-S31508003B288A002244D2F814324344C2F8143246E7CB
-S31508003B382068FFF742FA8046B14617E007EB4913B3
-S31508003B480122C3F8082B49462046FFF75DFE1DE00B
-S31508003B5807EB49130822C3F8082B49462046FFF7FE
-S31508003B68D3FE16E009F101094FEA5808B8F1000F23
-S31508003B783FF431AF18F0010FF4D05FFA89F12068E5
-S31508003B88FFF72BFA824610F0010FD7D11AF0080F63
-S31508003B98DED11AF0100F04D007EB49131022C3F828
-S31508003BA8082B1AF0200F04D007EB49132022C3F874
-S31508003BB8082B1AF4005FD5D007EB49134FF40052C7
-S31508003BC8C3F8082BCEE72068FFF7FFF98046B14609
-S31508003BD82AE05946204600F001FE1AF0080F04D0DC
-S31508003BE807EB49130822C3F808291AF0100F04D05E
-S31508003BF807EB49131022C3F808291AF0400F04D016
-S31508003C0807EB49134022C3F808291AF0020F04D013
-S31508003C1807EB49130222C3F808291AF0800F41D185
-S31508003C2809F101094FEA5808B8F1000F3FF4DAAE6E
-S31508003C3818F0010FF4D05FFA89FB59462068FFF798
-S31508003C48D5F9824610F0010FC7D009F00F030121F4
-S31508003C5801FA03F2D7F8343823EA0203C7F83438E6
-S31508003C6807EB4913C3F8081923698B42B1D14FEA00
-S31508003C78C902A2EB090293002344596C9A6C0A44B8
-S31508003C889A64B9F1000FA4D1C9EBC9029300234479
-S31508003C981B6D002B9DD104F5717201212068FFF771
-S31508003CA8CDF996E749462046FFF759FCB8E7D5F80F
-S31508003CB8043823F00103C5F8043894F8F433012BC3
-S31508003CC808D0204600F0D0FD2268536903F0004367
-S31508003CD853618DE6002184F8F4132046FFF73EFC6D
-S31508003CE8F2E7204600F0A6FD8EE6204600F0A2FD83
-S31508003CF8ABE605F50068D8F8043023F00103C8F8E0
-S31508003D08043010212068FEF75FFD20E007EB461314
-S31508003D184FF67F31C3F80819D3F8002922F40012A0
-S31508003D28C3F80029D3F8002942F00062C3F800292D
-S31508003D38C3F8081BD3F8002B22F40012C3F8002B8B
-S31508003D48D3F8002B42F00062C3F8002B01366368EB
-S31508003D58B342DBD8D8F81C3043F00113C8F81C3036
-S31508003D68236BEBB1D8F8843043F00B03C8F88430DA
-S31508003D78D8F8443043F00B03C8F84430D5F800386F
-S31508003D8823F4FE63C5F8003804F57172217C2068AF
-S31508003D98FFF754F92268536903F4805353615BE6C5
-S31508003DA8D8F8142042F22B031343C8F81430D8F86D
-S31508003DB8103043F00B03C8F81030DFE72068FFF728
-S31508003DC82DF92068FEF7F0FDE0602568FFF75CFA34
-S31508003DD8227B01462846FEF75DFC204600F010FDCA
-S31508003DE82268536903F4005353613CE6204600F001
-S31508003DF800FD2268536903F0080353613AE6002177
-S31508003E08204600F040FD2268536903F48013536185
-S31508003E1837E60021204600F030FD2268536903F48E
-S31508003E280013536134E6204600F033FD22685369CF
-S31508003E3803F08043536132E6204600F034FD3BE642
-S31508003E48026890F8BC33012B16D010B5012380F808
-S31508003E58BC33836A012B07D004460068FFF791F83C
-S31508003E68002084F8BC0310BD8369012BF4D0936B3A
-S31508003E7843F480339363EFE70220704790F8BC3326
-S31508003E88012B0BD010B50446012380F8BC33006813
-S31508003E98FFF783F8002084F8BC0310BD022070479A
-S31508003EA890F8BC33012B0DD010B50446012380F8D1
-S31508003EB8BC3380F838100068FFF753F8002084F8F8
-S31508003EC8BC0310BD02207047F8B511F0800F27D142
-S31508003ED801F00F05EE00771BBC00274604F5FC74B5
-S31508003EE8044404340744002587F8FD5101F00F01FE
-S31508003EF82170A260E370627802B1E180022B1ED0BD
-S31508003F0890F8BC33012B1DD00546012380F8BC3335
-S31508003F1821460068FEF758FD002085F8BC03F8BD61
-S31508003F2801F00F06F500AF1BBC00274638340444D9
-S31508003F3804343E460644012586F83D50D6E7002354
-S31508003F482371DDE70220EAE738B511F0800F20D1A2
-S31508003F5801F00F04E200151BAB001D4603F5FC73C0
-S31508003F68034404330544002285F8FD2101F00F01B6
-S31508003F78197090F8BC23012A1AD00446012280F841
-S31508003F88BC2319460068FEF767FD002084F8BC03C1
-S31508003F9838BD01F00F04E200151BAB001D46383387
-S31508003FA8034404332C460444012284F83D20DDE703
-S31508003FB80220EDE770B501F00F05EE00711B8C00C5
-S31508003FC804F5FC740444211D761BB4000444C4F8A3
-S31508003FD80822C4F810320023C4F8143284F8FD31D4
-S31508003FE884F8FC510369012B06D065B9DAB2006872
-S31508003FF8FEF77AFD002070BDC5EBC506B40004447B
-S31508004008C4F80C22F1E7DAB20068FEF70DFEF1E70C
-S3150800401801F00F01C1EBC1018B001844D0F8140256
-S31508004028704770B501F00F05EE00711B8C00383427
-S315080040380444211D761BB4000444A26423650023A6
-S315080040486365012384F83D3084F83C500369012BE5
-S3150800405806D05DB9DAB20068FEF746FD002070BDE5
-S31508004068C5EBC506B4000444E264F2E7DAB20068B0
-S31508004078FEF7DAFDF2E738B501F00F0543689D4209
-S3150800408836D811F0800F20D1CA00541AA3001C464E
-S3150800409803F5FC730344043322460244002182F8DC
-S315080040A8FD1101229A701D7090F8BC23012A21D0AF
-S315080040B80446012280F8BC2319460068FEF7D2FE9A
-S315080040C87DB1002084F8BC0338BDEA00511B8B007B
-S315080040D819463833034404330144012281F83D2044
-S315080040E8DFE704F57172217C2068FEF7A7FFE8E789
-S315080040F80120E9E70220E7E710B501F00F04436855
-S315080041089C422CD811F0800F1DD1E3001A1B910090
-S315080041180A4601F5FC71014404310244002382F879
-S31508004128FD3100238B700C7090F8BC33012B18D026
-S315080041380446012380F8BC330068FEF7C0FE002059
-S3150800414884F8BC0310BDE3001A1B91000A463831EF
-S31508004158014404310244012382F83D30E1E7012095
-S31508004168F0E70220EEE7000012230B8000487047AC
-S315080041785804002004230B80004870476C0400206C
-S315080041880023934216D230B40BE0373401F81340B3
-S3150800419800015C00013400250D550133DBB293425A
-S315080041A806D2040F092CF0D8303401F81340EFE78B
-S315080041B830BC70477047000038B50A4B1868043396
-S315080041C81C6804331B68C01800D138BD064D082280
-S315080041D8A91CFFF7D5FF042205F112012046FFF7AF
-S315080041E8CFFFF2E700E8F11F7004002008B51A238C
-S315080041F80B80FFF7E1FF014808BD00BF70040020E7
-S3150800420808B50A4628B905490548FCF79AFC03483B
-S3150800421808BD02490248FCF794FCF8E7EC120020AE
-S31508004228A85D000810B5044C0A4621460348FCF761
-S3150800423888FC204610BD00BFEC120020985D0008D7
-S3150800424808B50A4628B905490548FCF77AFC03481B
-S3150800425808BD02490248FCF774FCF8E7EC1200208E
-S31508004268785D000808B50A4628B905490548FCF7DF
-S3150800427868FC034808BD02490248FCF762FCF8E7EF
-S31508004288EC120020805D0008014B1880704700BFBB
-S315080042980E05002008B500F0FBFE0E4B1B68984279
-S315080042A80FD30D4B1B786BB90B4B01221A700B4BAE
-S315080042B880229A6100F0ECFE094B1B881844054BCE
-S315080042C8186008BD044B00221A70044B4FF400020C
-S315080042D89A61EFE71405002010050020000402582B
-S315080042E80E050020024B4FF400029A61704700BF82
-S315080042F80004025808B5054B1B6913F4005F03D17F
-S31508004308FFF7F0FF012008BD0020FCE70008025867
-S3150800431808B56420FFF7B8FF08BD08B5FFF7BAFF68
-S3150800432808BD70477047704708B5574A136823F0A1
-S315080043380F0343F004031360136803F00F03042BF9
-S3150800434840F09C80514AD36823F0070343F00203E0
-S31508004358D360936943F4404393614D4B1A6842F41A
-S3150800436880221A601A6842F480321A60484B1B6821
-S3150800437813F4003FFAD0464B9A6A22F0030242F039
-S3150800438802029A62DA6A42F48032DA62DA6A42F435
-S315080043980032DA62DA6A22F00C0242F00402DA62C1
-S315080043A8DA6A22F00202DA629A6A22F47C7242F027
-S315080043B840029A621A6B3749114040F2DF120A43E3
-S315080043C81A631A6B22F47E4242F400721A631A6B55
-S315080043D822F4FE0242F498121A631A6B22F0FE427D
-S315080043E842F080721A631A6842F080721A60284B83
-S315080043F81B6813F0007FFAD0254B9A6922F00F0242
-S3150800440842F008029A611A6922F0070242F003028A
-S315080044181A619A6922F470629A619A6922F00F02FF
-S3150800442842F008029A61DA6922F0700242F0400204
-S31508004438DA61DA6922F4E06242F48062DA619A693A
-S3150800444822F0700242F040029A611A6A22F070025B
-S3150800445842F040021A6210490A6822F007020A6006
-S315080044681A6D22F040521A655A6D22F4401242F427
-S3150800447880125A650948FEF729FF08BD67210848CA
-S3150800448800F0D4FA5EE700BF002000520048025840
-S315080044980044025800FEFFFF5444025800389C1C8A
-S315080044A8BC5D000808B5FCF789FDFFF73DFF08BDA8
-S315080044B808B5FFF7F7FF00F0C5FA00F0D1FAFCE7F0
-S315080044C82DE9F0418EB0514CD4F8F43043F002038C
-S315080044D8C4F8F430D4F8F43003F002030793079BC2
-S315080044E8D4F8E03043F00103C4F8E030D4F8E030FB
-S315080044F803F001030693069BD4F8E03043F0020361
-S31508004508C4F8E030D4F8E03003F002030593059BBD
-S31508004518D4F8E03043F00403C4F8E030D4F8E030C7
-S3150800452803F004030493049BD4F8E03043F008032B
-S31508004538C4F8E030D4F8E03003F008030393039B8B
-S31508004548D4F8E83043F48023C4F8E830D4F8E830DF
-S3150800455803F480230293029BD4F8EC3043F4807367
-S31508004568C4F8EC30D4F8EC3003F480730193019B5B
-S31508004578802308930123099300250A950B950C9522
-S31508004588234F08A93846FDF78DFE4FF400530893C4
-S3150800459809950C9508A91F48FDF784FE4FF440783D
-S315080045A8CDF82080022609960A950B950C950723BF
-S315080045B80D9308A91848FDF775FECDF820800996C9
-S315080045C80A960B950C9509230D9308A93846FDF705
-S315080045D869FE4FF4C0530893099603230A930B956B
-S315080045E80C950A230D9308A90C48FDF75BFED4F829
-S315080045F8D83043F00063C4F8D830D4F8D83003F07C
-S3150800460800630093009B0EB0BDE8F0810044025891
-S315080046180004025800080258000C02580000025804
-S3150800462810B5FCF70DFD214C4FF40003A361204893
-S31508004638FDF74CFD1F48FDF749FD2046FDF746FDE9
-S315080046481D48FDF743FD1D4BD3F8D82022F000621C
-S31508004658C3F8D820D3F8EC2022F48072C3F8EC20EB
-S31508004668D3F8E82022F48022C3F8E820D3F8E0201B
-S3150800467822F00802C3F8E020D3F8E02022F004026A
-S31508004688C3F8E020D3F8E02022F00202C3F8E020BD
-S31508004698D3F8E02022F00102C3F8E020D3F8F4208A
-S315080046A822F00202C3F8F42010BD00BF0004025825
-S315080046B8000C025800080258000002580044025824
-S315080046C82023038000487047C40400200A23038077
-S315080046D800487047E404002008B590F89C32032B7C
-S315080046E801D0002008BD01F04DFAFAE708B501F037
-S315080046F849FA002008BD08B5084601F077FA0020EF
-S3150800470808BD000008B50B7813F0600F06D14B7882
-S315080047180A2B14D00B2B17D0062B01D0002008BD66
-S315080047284B881B0A212B04D00B491722FBF78FFE4F
-S31508004738F4E7CA88172A28BF17220849F6E7012284
-S315080047480749FBF784FEE9E78B7813B9044A13602F
-S31508004758E4E7FBF7D6FEE1E7CD040020D6040020FF
-S315080047681805002010B50446812100F02FF901210B
-S31508004778204600F02BF9002010BD000010B50446AD
-S3150800478840230222812100F016F940230222012142
-S31508004798204600F010F94023034A0121204600F07C
-S315080047A83DF9002010BD00BFEC14002000487047F2
-S315080047B8EC14002008B500F57171D0F80404FCF76C
-S315080047C824FA08BD08B5C1EBC10293000344D3F81F
-S315080047D80822D0F80404FCF746FA08BD08B5C1EB68
-S315080047E8C102930003449A6CD0F80404FCF785FACE
-S315080047F808BD08B5D0F80404FCF72AFB08BD000074
-S3150800480810B50446C3684BB1022B01D1012106E055
-S315080048189121074800F00AF9012100E00021D4F89F
-S315080048280404FCF7FEFAD4F80404FCF7D2FA10BD1F
-S31508004838C45D000810B50446D0F80404FCF7F4FA79
-S315080048482268D2F8003E43F00103C2F8003E236A04
-S3150800485823B1044A136943F006031361FFF762FD9F
-S3150800486810BD00BF00ED00E010B50446FFF75BFD7C
-S31508004878D4F80404FCF7E1FA10BD08B5D0F8040426
-S31508004888FCF7F6FA08BD08B5D0F80404FCF7EEFA02
-S3150800489808BD10B504460120FFF743FDD4F8040403
-S315080048A8FCF7E8FA10BD10B504460020FFF739FDF5
-S315080048B8D4F80404FCF7E0FA10BD000003780BB13D
-S315080048C80020704710B503461748C0F80434C3F8E3
-S315080048D8C002164B0360092343600222C260002304
-S315080048E8036182610122C261036243628362C36211
-S315080048F80363FEF79EFE80B90B4C80212046FEF71F
-S3150800490815FE402200212046FEF7ECFD80220121F3
-S315080049182046FEF7E7FD002010BD4FF493710448C2
-S3150800492800F084F8E8E700BF2C15002000000840CE
-S31508004938C45D0008D0F8C03211F0800F08D101F024
-S315080049487F01C1EBC1018A00134493F8FE01704741
-S3150800495801F07F01C1EBC1018A00134493F83E00B8
-S31508004968704708B5D0F8C002FFF752FB08BD022801
-S3150800497807D8DFE800F00206040000207047012087
-S3150800498870470220704708B5D0F8C002FEF72BFF1B
-S31508004998FFF7EDFF08BD08B5D0F8C002FEF7E2FE3E
-S315080049A8FFF7E5FF08BD08B5D0F8C002FEF7FBFE1D
-S315080049B8FFF7DDFF08BD10B51C4613462246D0F89A
-S315080049C8C002FFF781FAFFF7D2FF10BD08B5D0F885
-S315080049D8C002FFF7B9FAFFF7CAFF08BD08B5D0F84D
-S315080049E8C002FFF748FBFFF7C2FF08BD08B5D0F8B5
-S315080049F8C002FFF781FBFFF7BAFF08BD08B5D0F874
-S31508004A08C002FFF74DFAFFF7B2FF08BD08B5D0F8A0
-S31508004A18C002FFF706FBFFF7AAFF08BD08B5D0F8DE
-S31508004A28C002FFF7C7FAFFF7A2FF08BD08B500F0EE
-S31508004A3805F8FCE708B5FFF76BFC08BD08B5FFF7EE
-S31508004A486CFC08BD08B500F0E1FEFFF7F3FF00F0BF
-S31508004A58FDFA01F0F7F800F057F800F049F808BD34
-S31508004A6808B5FFF7EBFF00F005FB00F061F800F06A
-S31508004A7801F808BD08B500F0DFF8012803D00B4B8C
-S31508004A881B78012B00D008BD00F002FB084B1B68F9
-S31508004A98084A1268134403F5FA739842F3D3034B8A
-S31508004AA800221A7000F0B6FEEDE700BF20050020C8
-S31508004AB81C05002024050020014B1860704700BF1C
-S31508004AC81C050020014B1868704700BF1C0500200C
-S31508004AD808B5054B1B78012B00D008BD00F0D8FA9D
-S31508004AE8024B1860F9E700BF2005002024050020BE
-S31508004AF808B5044B01221A70FFF7EAFFFFF7BAFF59
-S31508004B0808BD00BF2005002010B500F005FA00F022
-S31508004B18B9FB064C0123237000F0EAFA0023237038
-S31508004B2800F064FF0223237010BD00BFEE040020C6
-S31508004B3800B583B00DF10701184800F037FC0128C5
-S31508004B4810D00DF10701154800F00EFB012812D008
-S31508004B580DF10701114800F0C9FF012814D003B068
-S31508004B685DF804FB0E4B01221A709DF807100B48D6
-S31508004B7800F0F2F9E5E70A4B00221A709DF80710CB
-S31508004B88064800F0E9F9E3E7054B02221A709DF892
-S31508004B980710024800F0E0F9E1E700BF2805002001
-S31508004BA8EE04002008B500F067FF08BD38B50446CE
-S31508004BB80D460E4B1B78012B09D00C4B1B7853B1AD
-S31508004BC80A4B1B78022B0BD000F0BEF938BDC9B2C8
-S31508004BD800F0BAFBF1E7E9B2204600F0A9FAEFE7D8
-S31508004BE8E9B2204600F058FFEEE700BFEE040020C1
-S31508004BF8074B1B78022B05D0032B05D0012B05D0B4
-S31508004C08402070473F2070470020704708207047AB
-S31508004C18EE040020074B1B78022B05D0032B05D082
-S31508004C28012B05D0402070473F2070470020704769
-S31508004C3808207047EE04002008B500F07BF9034603
-S31508004C4800B10123184608BD014B00225A70704767
-S31508004C5868050020034BFE22DA7018710222A3F8B1
-S31508004C68442070476805002010B5054C00232370BA
-S31508004C78FFF7EAFFFF23E3700123A4F8443010BDC9
-S31508004C8868050020064BFF22DA7000221A71597847
-S31508004C9859719A71DA711A720622A3F84420704774
-S31508004CA86805002008B50020FFF7D4FF08BD0000F6
-S31508004CB8074BFF22DA70074A9A6400221A715A715A
-S31508004CC89A710722C3F807200822A3F844207047D8
-S31508004CD868050020D05D0008044BFF22DA70426898
-S31508004CE89A640122A3F84420704700BF680500208B
-S31508004CF808B53120FFF7AEFF08BD000038B5084CE7
-S31508004D08FF23E370002525716571FFF771FFA07110
-S31508004D18E571257265720723A4F8443038BD00BFCB
-S31508004D286805002038B5FFF78FFF0E4C012525705A
-S31508004D38FF23E3701023237100236371FFF758FFDD
-S31508004D48A071FFF767FFE071FFF764FFC0F307205C
-S31508004D5820726572A5720823A4F8443000F072FF21
-S31508004D6838BD00BF6805002038B50546FFF740FF7F
-S31508004D786A7890420FD90A4CA16C201D00F06AFD8A
-S31508004D88FF23E3706A78A36C1344A3646B78013332
-S31508004D98A4F8443038BD2220FFF75CFFFAE700BFC5
-S31508004DA86805002038B50446FFF722FF637898425D
-S31508004DB811D961680A4DA9646278281D00F04AFD70
-S31508004DC8FF23EB706278AB6C1344AB6463780133EA
-S31508004DD8A5F8443038BD2220FFF73CFFFAE700BFA4
-S31508004DE868050020F8B50546174600244E1E39B151
-S31508004DF815F8013B1C44E4B2FFF720FE3146F5E7F7
-S31508004E083C600120F8BD000010B5084CFF23E3708C
-S31508004E18E21D4168A06CFFF7E5FF20710023637166
-S31508004E28A3710823A4F8443010BD00BF6805002004
-S31508004E3838B505460D4B9C6CFFF7DAFE6A1C411E11
-S31508004E48204600F003FF60B1084CFF23E370FFF724
-S31508004E58CFFE0138A36C0344A3640123A4F84430A5
-S31508004E6838BD3120FFF7F6FEFAE700BF68050020CF
-S31508004E7810B50446FFF7BCFE01386378984213DD7F
-S31508004E88114BFF22DA700122A3F84420617879B120
-S31508004E98A21C0D4B986C00F0D9FE88B161780A4AB5
-S31508004EA8936C0B44936410BD2220FFF7D3FEFAE7F0
-S31508004EB800F0DCFE0028F6D13120FFF7CBFEF2E73A
-S31508004EC83120FFF7C7FEEEE76805002008B54168F8
-S31508004ED8074B986C00F0BEFE30B1054BFF22DA701E
-S31508004EE80122A3F8442008BD3120FFF7B3FEFAE7EC
-S31508004EF86805002008B500F08DFC034BFF22DA7020
-S31508004F080122A3F8442008BD6805002008B589B21F
-S31508004F18FFF74CFE08BD0000054B00221A709A647C
-S31508004F2883F84320A3F844209A705A70704700BF44
-S31508004F3868050020034B1B780BB101207047002039
-S31508004F48704700BF68050020024B002283F84320FB
-S31508004F58704700BF6805002008B50378FF2B23D0E3
-S31508004F68354A1278012A2BD1C93B352B53D8DFE8A5
-S31508004F7803F04052524F52524C43494652525252EB
-S31508004F8852525252525252525252525252525252EB
-S31508004F98525252525252525252525252312B282E71
-S31508004FA85252523452373A3DFFF7BCFE224B93F819
-S31508004FB84330012B33D0204BB3F94410002932DC97
-S31508004FC808BDFFF7D1FEF1E7FFF7ECFEEEE7FFF7BE
-S31508004FD883FEEBE7FFF718FFE8E7FFF769FEE5E763
-S31508004FE8FFF760FEE2E7FFF74DFEDFE7FFF73CFE57
-S31508004FF8DCE7FFF71DFFD9E7FFF73AFFD6E7FFF724
-S315080050087DFED3E7FFF762FFD0E7FFF773FFCDE72B
-S31508005018FFF76EFECAE72020FFF71CFEC6E710203A
-S31508005028FFF718FEC7E71846012380F84330033010
-S31508005038FFF76CFFC4E700BF68050020024B002293
-S315080050481A605A609A60704710E000E008B5FFF7E2
-S31508005058F5FF054B054A5A6000229A600521196032
-S31508005068034B1A6008BD00BF10E000E0FF520700B6
-S31508005078B4050020044B1B6813F4803F03D0034A89
-S31508005088136801331360704710E000E0B405002088
-S3150800509808B5FFF7EFFF014B186808BDB4050020EF
-S315080050A808B5FFF7F5FF08BD054BDB6913F0200FB8
-S315080050B804D0034B5B6A03700120704700207047D1
-S315080050C80048004010B5094B9862FFF7E1FF00F168
-S315080050D80A04064BDB6913F0800F05D1FFF7AEFC0F
-S315080050E8FFF7D6FFA042F4D910BD00BF004800401C
-S315080050F810B588B00D4C236823F0010323600023FC
-S3150800510800934FF4614201920293039304930C228D
-S3150800511805920693079369462046FEF7DDF8236845
-S3150800512843F00103236008B010BD00BF00480040E3
-S3150800513870B506460D4640290ED82846FFF7C2FF21
-S315080051480024ABB2A3420CD9FFF778FC305DFFF711
-S31508005158B9FF0134A4B2F4E784210248FFF766FCD4
-S31508005168EBE770BDD85D000870B5254B1C78BCB94F
-S315080051782448FFF799FF012801D0204670BD214B26
-S315080051881B78013BDBB23F2BF7D8FFF781FF1E4B95
-S3150800519818601E4B00221A70194B01221A70ECE788
-S315080051A806460D46194B1B78013316481844FFF76F
-S315080051B87BFF0446012815D1144B1A780132D2B25E
-S315080051C81A70104B1B789A4201D00024D5E710496B
-S315080051D8304600F03FFB0A4B00221A700B4B1B782F
-S315080051E82B70CAE7FFF754FF074B1B6864339842CE
-S315080051F803D90024024B1C70BFE70024BDE700BF93
-S31508005208F9050020B8050020FC050020FA0500204D
-S31508005218B9050020F0B4194D2C6D24F040542C65BE
-S31508005228002401E00134E4B2112C23D8144D15F8F2
-S31508005238146005EB44056F78F51905FB00054FF46E
-S31508005248FA5CBCFBF5FC05FB0CF5B5F5FA5FE9D18C
-S3150800525835463D4405FB000C4FF4FA55B5FBFCF5FD
-S315080052680D80013DADB2B5F5007FDBD216701F7013
-S31508005278012000E00020F0BC704700BF0044025837
-S31508005288285E000870B58CB00023ADF82E308DF86E
-S315080052982D308DF82C300BAB0DF12D020DF12E01AA
-S315080052A84FF4FA70FFF7B6FF002842D0234C244B78
-S315080052B823600025A560E560012626746574A57433
-S315080052C8BDF82E306361A6619DF82D30E3619DF81F
-S315080052D82C3023626662A662E66226636563A66365
-S315080052E8E563266404236364A564E3642565636546
-S315080052F8A565E66525666566A3662046FCF7F4FA9D
-S31508005308039504950596069640F2676307930893EE
-S31508005318099503A92046FCF731FC00963346022274
-S3150800532811462046FCF76DFC2046FCF786FC0CB0B7
-S3150800533870BDB8210348FFF779FBB7E700060020D8
-S3150800534800A00040005E000810B58AB040F2E1737C
-S315080053580193002302930393090404910593069382
-S3150800536807930893522309930123024601A90E4875
-S31508005378FCF77DFC08B10AB010BD01210A48FCF704
-S31508005388ACFC0028F7D1FFF783FE00F132040121AF
-S315080053980548FCF781FD0028EDD0FFF74FFBFFF71E
-S315080053A877FEA042F3D9E6E70006002030B58BB0B1
-S315080053B804460D4640211048FCF777FD10B9002031
-S315080053C80BB030BD23466A4640210B48FCF798FCCB
-S315080053D868B9009A40F267639A4201D00020EFE75D
-S315080053E8019B33B99DF80E302B700120E8E70020A1
-S315080053F8E6E70020E4E700BF0006002038B50546C2
-S31508005408002401E00134E4B20E2C12D8FFF716FB8B
-S3150800541804EB44029300084AD358AB42F2D804EB8B
-S3150800542844029100044A0A4452681344AB42E9D933
-S3150800543800E0FF24204638BD4C5E000808B5C1F3D5
-S31508005448090363B903688B4201D1012008E040F8D3
-S31508005458041B4FF4806200F0FDF9012000E00020EB
-S3150800546808BD2DE9F04107460068FFF7C7FFFF2882
-S3150800547804D14FF000084046BDE8F081FCF780FFEC
-S3150800548800264FF0010805E04FF00008B8F1000FB4
-S315080054981CD001361F2E19D83D68740125443C4492
-S315080054A80434FFF7CBFA224629460120FDF730F8DF
-S315080054B850B900231F2BE9D8595DE25CD2B2914254
-S315080054C8E2D10133DBB2F5E74FF00008FCF786FFB7
-S315080054D8D1E7000070B50E460E4B984212D0054625
-S315080054E80D4B994209D10B4C254624B1314628461D
-S315080054F8FFF7A4FF58B1204670BDFFF7B2FF20B1E9
-S315080055082C46F2E7054C2546EFE70024EDE700248C
-S31508005518F1E700BFA40A002000000208A006002040
-S315080055282DE9F84306460C4617461D46DFF88480DB
-S3150800553801EA08080368B3F1FF3F0AD03368434510
-S315080055480ED14FF00109B9F1010F12D04846BDE84E
-S31508005558F8834146FFF772FF81460028F3D0EDE746
-S3150800556841463046FFF7B6FF0646E8B14FF001094F
-S31508005578E9E73368E41A3444043405E017F8013BCC
-S3150800558804F8013B013DE1D0FFF758FA331DE31A49
-S31508005598B3F5806FF2D308F580613046FFF79AFFB6
-S315080055A8064620B1041DE9E74FF00009CEE74FF09B
-S315080055B80009CBE700FCFFFF70B586B004460D4628
-S315080055C800230093884203D80E2938D8012600E01C
-S315080055D8002616B9304606B070BDFCF7D1FE01E0C4
-S315080055E80134E4B2AC4227D8FFF728FA1549630014
-S315080055F823449A008B188A585B68002B18BFB2F1A7
-S31508005608FF3F18D000230193202305930A46630019
-S315080056181819810008461144497A02910244137AF6
-S31508005628039301230493694601A8FCF7B9FC0028EB
-S31508005638D6D0002600E00026FCF7D0FECAE70026EA
-S31508005648C8E700BF4C5E00084FF0FF33024A1360F4
-S31508005658024A1360704700BFA0060020A40A00206B
-S3150800566870B504460D4616464A1E154B1B1A9A422D
-S3150800567803D9002001280ED070BDFFF7BFFEFF280A
-S3150800568801D10020F8E728190138FFF7B7FEFF28E7
-S3150800569814D00120EEE70B4B23400B4A934206D061
-S315080056A82B46324621460948FFF73AFFE4E72B46D8
-S315080056B8324621460648FFF733FFDDE70020DBE7D9
-S315080056C8FFFF1F0800FCFFFF00000208A0060020D5
-S315080056D8A40A002070B54A1E0F4B1B1A9A4205D910
-S315080056E8FF210E460020012812D070BD05460C463B
-S315080056F8FFF784FE064660190138FFF77FFE014664
-S31508005708FF2818BFFF2E01D00120ECE70020EAE7A2
-S315080057183046FFF751FFE8E7FFFF1F08104B1B68E5
-S31508005728B3F1FF3F01D10120704700B583B00C4A99
-S31508005738536891680B44D1680B4411690B44516945
-S315080057480B4491690B44D26913445B42019301AA3D
-S3150800575804210448FFF784FF03B05DF804FB00BF83
-S31508005768A40A0020980202080D4B1B680D4A126805
-S315080057781A440D4B1B6813440C4A126813440C4A06
-S3150800578812681A440B4B1B681A440B4B1B681344C4
-S315080057980A4A1268DA4201D1012070470020704788
-S315080057A80000020804000208080002080C000208A3
-S315080057B810000208140002081800020898020208D5
-S315080057C808B50E4B1B68B3F1FF3F07D10C4B1B6896
-S315080057D8B3F1FF3F09D10123184608BD0748FFF76B
-S315080057E840FE03460028F7D0F0E70548FFF739FEDC
-S315080057F803460028F0D00123EEE700BFA40A0020DC
-S31508005808A0060020004870470000020808B500F006
-S3150800581838FA08BD10B500F021FA00B910BDFEF730
-S3150800582869FD0028FAD0FFF7BDF9FBF76FFBFFF70C
-S3150800583805FC00F017FA054B0340054A936000F08B
-S3150800584811FA446800F01FFAA047E7E780FFFF1F30
-S3150800585800ED00E070B50D460446531E9EB23AB1F7
-S3150800586815F8013B04F8013BFFF7E8F83246F4E778
-S3150800587870BD0000094B03F11801002232B19A7471
-S3150800588800225A61064B054A1A6070479A7459618C
-S31508005898183318310132D2B2F0E700BFE80E0020FB
-S315080058A8180F00200A4B1B6883B110B45C69084AB4
-S315080058B8146019749860D86000225A7418600139FF
-S315080058C808445860987C5DF8044B7047FF20704779
-S315080058D8180F002038B504460D4601281CD8620062
-S315080058E82244D100114B0B445A7C1B7C9A4219D08E
-S315080058F80E4B0B44DA6815705A7C01325A74DA680A
-S315080059080132DA605B689A420ED9084A0846515845
-S315080059180244D160012038BD4FF4E1710448FFF70D
-S3150800592885F8DCE70020F6E70120F4E7E80E002012
-S31508005938005F000808B50146024B1878FFF7CAFF4A
-S3150800594808BD00BF1C0F002038B504460D460128BF
-S315080059581ED804EB4403DA00124B13445B7CEBB104
-S3150800596862002244D1000F4B0B449A6812782A70B9
-S315080059785A7C013A5A749A6801329A605B689A4264
-S315080059880ED9084A0846515802449160012006E093
-S315080059984FF4F2710448FFF749F8DAE7002038BDF2
-S315080059A80120FCE7E80E0020005F000808B501465C
-S315080059B8024B1878FFF7C8FF08BD00BF600F002024
-S315080059C810B50446012806D804EB4404E200054B42
-S315080059D81344587C10BD4FF401710348FFF726F8A5
-S315080059E8F2E700BFE80E0020005F000838B5FFF7A9
-S315080059F841FF1B4C4021601CFFF754FF2070194DCE
-S31508005A084021681CFFF74EFF28702378FF2B1DD00E
-S31508005A18FF281BD0144C002214492046FBF7ACF883
-S31508005A2813492046FBF7D1F80120FEF77AFC2046F1
-S31508005A38FBF7D2F8FCF79CFCD4F8C002FEF700FA8C
-S31508005A48FFF740F8B0F5FA6F05D338BD8521094840
-S31508005A58FEF7ECFFDEE74FF4FA60FFF72DF8F4E7F8
-S31508005A681C0F0020600F0020A40F00203C04002013
-S31508005A788C040020005F000810B5064CD4F8C00254
-S31508005A88FEF7FCF92046FBF78EF80020FEF749FCDE
-S31508005A9810BD00BFA40F002070B506460D463F2965
-S31508005AA806D82846FFF746FF012806D100240FE046
-S31508005AB8BB210D48FEF7BAFFF3E7BF210A48FEF7F0
-S31508005AC8B5FFF3E7C8210848FEF7B0FF0134A4B2CA
-S31508005AD8ABB2A34207D9FEF7B1FF305DFFF72AFF3D
-S31508005AE80128F3D0EEE770BD005F000870B50646DA
-S31508005AF80D461F4BD3F8C002FDF72EFF1D4B1C7829
-S31508005B089CB91D48FFF752FF012801D0204670BDF1
-S31508005B18194B1B78013BDBB23E2BF7D8154B0122F4
-S31508005B281A70164B00221A70F0E7144B1B780133CB
-S31508005B3811481844FFF73AFF0446012801D0002403
-S31508005B48E4E70E4B1A780132D2B21A700A4B1B7860
-S31508005B589A4201D00024D9E709493046FFF77AFE68
-S31508005B68044B00221A70054B1B782B70CEE700BF32
-S31508005B78A40F0020A812002068120020A9120020ED
-S31508005B886912002030B583B0144B1878FFF718FF50
-S31508005B9808B30546402800D9402500240AE04FF4F2
-S31508005BA8A4710F48FEF742FF9DF807200D4B1A55BA
-S31508005BB80134E4B2A54208D90DF10701074B187854
-S31508005BC8FFF7C2FE0128EFD0E9E7ABB2054A812103
-S31508005BD80548FEF71BFF03B030BD00BF1C0F0020A9
-S31508005BE8005F0008A80E0020A40F002070B5044620
-S31508005BF8FEF7DCFD064621460F48FEF7B2FE85B2DB
-S31508005C08002406E04FF4B5710C48FEF70FFF01347F
-S31508005C18A4B2AC4207D2315D094B1878FFF75AFE91
-S31508005C280128F4D0EEE7FEF7C1FD4023024601211C
-S31508005C380148FEF7F3FE70BDA40F0020005F0008B8
-S31508005C48600F002008B5FFF7FFFC08BD08B5FFF789
-S31508005C5807FD08BD08B5FFF73DFD08BD08B5FFF700
-S31508005C6883FD08BD08B5FFF7CDFD08BD08B5FFF7E4
-S31508005C7855FD034608B9184608BDFFF7A1FD0346B2
-S31508005C88F9E772B6704762B670470A44914200F15E
-S31508005C98FF3300D1704710B511F8014B03F8014FCF
-S31508005CA89142F9D110BD0000F8B500BFF8BC08BC90
-S31508005CB89E467047F8B500BFF8BC08BC9E467047B4
-S31508005CC800000000000000000000000000000000BE
-S31508005CD800000000010000000200000003000000A8
-S31508005CE80400000000000000050000000000000095
-S31508005CF80000000000000000060000000000000088
-S31508005D080000000000000000070000000000002056
-S31508005D18000000000102030401020304060708093B
-S31508005D28000000000102030401020304060708092B
-S31508005D380001020304050607080C10141820304051
-S31508005D480100000002000000040000000600000030
-S31508005D58080000000A0000000C00000010000000FF
-S31508005D68200000004000000080000000000100003C
-S31508005D7844656661756C740057696E5553422042CE
-S31508005D88756C6B20496E7465726661636500000000
-S31508005D984F70656E424C54205573657200000000BA
-S31508005DA857696E5553422042756C6B20446576696F
-S31508005DB8636500006D61696E2E6300007573626421
-S31508005DC85F636F6E662E63004F70656E424C5400B3
-S31508005DD82E2E2F2E2E2F2E2E2F536F757263652F6C
-S31508005DE841524D434D375F53544D333248372F721E
-S31508005DF8733233322E6300002E2E2F2E2E2F2E2E80
-S31508005E082F536F757263652F41524D434D375F5354
-S31508005E18544D333248372F63616E2E6300000000F5
-S31508005E2805020602060307030803090309040A0408
-S31508005E380B040C040C050D050E050F050F061006B8
-S31508005E4810071008000002080000020001010000FF
-S31508005E58000004080000020002010000000006080D
-S31508005E680000020003010000000008080000020004
-S31508005E780401000000000A080000020005010000ED
-S31508005E8800000C08000002000601000000000E08C9
-S31508005E9800000200070100000000100800000200C8
-S31508005EA800020000000012080000020001020000BB
-S31508005EB8000014080000020002020000000016088C
-S31508005EC80000020003020000000018080000020093
-S31508005ED80402000000001A0800000200050200007B
-S31508005EE800001C08000002000602000000001E0848
-S31508005EF800000200070200002E2E2F2E2E2F2E2E0F
-S31508005F082F536F757263652F41524D434D375F5353
-S31508005F18544D333248372F7573622E6300000000DC
-S30D08005F2821030008BD02000870
-S30908005F3099020008BC
-S31508005F3400000000EC02002054030020BC030020EB
-S31508005F44000000000000000000000000000000003F
-S31508005F54000000000000000000000000000000002F
-S31508005F64000000000000000000000000000000001F
-S31508005F74000000000000000000000000000000000F
-S31508005F8400000000000000000000000000000000FF
-S31508005F9400000000000000000000000000000000EF
-S31508005FA400000000000000000000000000000000DF
-S31508005FB400000000000000000000000000000000CF
-S31508005FC400000000000000000000000000000000BF
-S31508005FD400000000000000000100000000000000AE
-S31508005FE40E33CDAB34126DE6ECDE05000B00000073
-S31508005FF4000000000000000000000000000000008F
-S31508006004000000000000000000000000000000007E
-S31508006014000000000000000000000000000000006E
-S31508006024000000000000000000000000000000005E
-S31508006034000000000000000000000000000000004E
-S31508006044000000000000000000000000000000003E
-S31508006054000000000000000000000000000000002E
-S31508006064000000000000000000000000000000001E
-S31508006074000000000000000000000000000000000E
-S3150800608400000000000000000000000000000000FE
-S3150800609400000000000000000000000000000000EE
-S315080060A400000000000000000000000000000000DE
-S315080060B400000000000000000000000000000000CE
-S315080060C400000000000000000000000000000000BE
-S315080060D400000000000000000000000000000000AE
-S315080060E4000000000000000000000000000000009E
-S315080060F4000000000000000000000000000000008E
-S31508006104000000000000000000000000000000007D
-S31508006114000000000000000000000000000000006D
-S31508006124000000000000000000000000000000005D
-S31508006134000000000000000000000000000000004D
-S31508006144000000000000000000000000000000003D
-S31508006154000000000000000000000000000000002D
-S31508006164000000000000000000000000000000001D
-S31508006174000000000000000000000000000000000D
-S3150800618400000000000000000000000000000000FD
-S3150800619400000000000000000000000000000000ED
-S315080061A400000000000000000000000000000000DD
-S315080061B400000000000000000000000000000000CD
-S315080061C400000000000000000000000000000000BD
-S315080061D400000000000000000000000000000000AD
-S315080061E4000000000000000000000000000000009D
-S315080061F4000000000000000000000000000000008D
-S31508006204000000000000000000000000000000007C
-S31508006214000000000000000000000000000000006C
-S31508006224000000000000000000000000000000005C
-S31508006234000000000000000000000000000000004C
-S31508006244000000000000000000000000000000003C
-S31508006254000000000000000000000000000000002C
-S31508006264000000000000000000000000000000001C
-S31508006274000000000000000000000000000000000C
-S3150800628400000000000000000000000000000000FC
-S3150800629400000000000000000000000000000000EC
-S315080062A400000000000000000000000000000000DC
-S315080062B400000000000000000000000000000000CC
-S315080062C400000000000000000000000000000000BC
-S315080062D400000000000000000000000000000000AC
-S315080062E4000000000000000000000000000000009C
-S315080062F4000000000000000000000000000000008C
-S31508006304000000000000000000000000000000007B
-S31508006314000000000000000000000000000000006B
-S31508006324000000000000000000000000000000005B
-S31508006334000000000000000000000000000000004B
-S31508006344000000000000000000000000000000003B
-S315080063540000000000000000AC1200200090D003EA
-S315080063640090D003010000001000000071410008ED
-S315080063747D4100082D42000809420008F54100083D
-S31508006384494200086D42000812010002000000405C
-S31508006394501DAC6000020102030100000403090455
-S315080063A41A030000000000000000000000000000BE
-S315080063B400000000000000000000000085470008F7
-S315080063C46D4700080D4700080000000000000000A3
-S315080063D4F5460008FF460008E146000800000000EC
-S315080063E40000000000000000C94600080000000084
-S315080063F4D546000809022000010100C0320904003C
-S315080064040002FF000000070581024000FF0705019E
-S31508006414024000FF0A0600020000004001000400D2
-S70508000405E9
+S315080002A800800123237010BD8C0100200000000087
+S315080002B89C5C000808B5034B1BB103490348AFF318
+S315080002C8008008BD00000000900100209C5C000822
+S315080002D8DFF834D0002103E00C4B5B584350043157
+S315080002E80B480C4B42189A42F6D30B4A02E00023F5
+S315080002F842F8043B094B9A42F9D300F011FD05F080
+S3150800030897FC04F037F8704700000220405F0008A1
+S31508000318000000208C0100208C01002070160020A7
+S31508000328FEE708B513460222C0F89422C3610362A1
+S315080003380A46002104F0DCFA002008BD08B5134671
+S315080003480A46002104F0D4FA002008BD08B5134669
+S315080003580A46002104F0D4FA002008BD08B504238B
+S31508000368C0F8943200231A46194604F0C1FA002048
+S3150800037808BD08B50523C0F8943200231A4619465D
+S3150800038804F0BEFA002008BD0346002002E001304A
+S31508000398C0B201331A78002AF9D1704708B54B88D4
+S315080003A8012B00D008BDC0F8A432FFF7D7FFF9E73C
+S315080003B80B7803704B7843708B78CA7803EB022363
+S315080003C843800B794A7903EB022383808B79CA79B0
+S315080003D803EB0223C380704710B50446802104F056
+S315080003E86FFA0021204604F06BFA10BD30B583B0C9
+S315080003F805460C460023ADF806304A88130A013B21
+S315080004080E2B00F2B580DFE803F015293DB3B39744
+S31508000418A4B3B3B3B3B3B3B30800D0F8B032DB6947
+S3150800042823B10DF10601007C98470AE02146FFF73B
+S31508000438D3FF11E0D0F8B0321B680DF10601007C35
+S315080004489847BDF806201AB1E388002B40F0948037
+S31508000458E388002B00F09A8003B030BD037C43B9CB
+S31508000468D0F8B4329B6A0DF1060098470223437008
+S31508000478E7E7D0F8B432DB6A0DF10600984702239D
+S315080004884370DEE7D2B2052A52D8DFE802F0031035
+S315080004981D2A3744D0F8B0325B6823B10DF106013E
+S315080004A8007C9847CDE72146FFF796FFD4E7D0F8B2
+S315080004B8B0329B6823B10DF10601007C9847C0E766
+S315080004C82146FFF789FFC7E7D0F8B032DB6823B1C2
+S315080004D80DF10601007C9847B3E72146FFF77CFF34
+S315080004E8BAE7D0F8B0321B6923B10DF10601007CD2
+S315080004F89847A6E72146FFF76FFFADE7D0F8B03271
+S315080005085B6923B10DF10601007C984799E72146F6
+S31508000518FFF762FFA0E7D0F8B0329B6923B10DF167
+S315080005280601007C98478CE72146FFF755FF93E7B5
+S315080005382146FFF751FF8FE7037C33B9D0F8B43269
+S315080005485B6B0DF1060098477BE72146FFF744FFEA
+S3150800055882E7037C43B9D0F8B4321B6B0DF1060069
+S315080005689847072343706CE72146FFF735FF73E77B
+S315080005782146FFF731FF6FE79A4228BF1A46ADF8BA
+S31508000588062001462846FFF7CCFE61E72846FFF70E
+S31508000598E5FE61E738B504468B88F3B9CB88E3B935
+S315080005A84B887F2B19D803F07F0590F89C32032BCC
+S315080005B80CD080F89E52294604F092F92046FFF797
+S315080005C8CDFE35B1022384F89C3209E0FFF704FF13
+S315080005D806E0012384F89C3202E02046FFF7FCFE79
+S315080005E838BD000038B504460D468978284B197079
+S315080005F801290ED890F89C32022B0ED0032B21D055
+S315080006082946FFF7E9FE224B1978204600F046FAF4
+S3150800061802E02946FFF7E0FE38BD81B141600323B1
+S3150800062880F89C3200F02EFA022803D02046FFF7FD
+S3150800063895FEF1E729462046FFF7CEFEECE7FFF7D9
+S315080006488DFEE9E789B1436899421DD0D9B200F011
+S3150800065825FA0F4B19786160204600F013FA02282C
+S315080006680DD02046FFF77AFED6E7022380F89C329B
+S31508000678416000F013FA2046FFF770FECCE72946DA
+S315080006882046FFF7A9FEC7E7FFF768FEC4E700BFDD
+S31508000698A801002008B5CB88012B0AD190F89C320E
+S315080006A8022B09D9032B09D10122011DFFF739FEAF
+S315080006B801E0FFF791FE08BD5BB213B9FFF78CFEA0
+S315080006C8F9E70146002341F8083F0122FFF729FE0A
+S315080006D8F1E708B590F89C32013B022B12D8CB8873
+S315080006E8022B0CD10123C360D0F8A4320BB1032323
+S315080006F8C360022200F10C01FFF713FE08BDFFF7DD
+S315080007086BFEFBE7FFF768FEF8E708B590F89C323A
+S31508000718013B022B09D84B88012B00D008BD0023C2
+S31508000728C0F8A432FFF71AFEF8E7FFF755FEF5E713
+S3150800073808B50B7803F06003202B05D0402B03D0AF
+S3150800074843B1FFF749FE03E0D0F8B4329B689847EF
+S31508000758002008BD4B78092B1BD8DFE803F01117D2
+S315080007681A141A08051A0E0BFFF740FEF0E7FFF7EA
+S3150800077811FFEDE7FFF736FFEAE7FFF78BFFE7E735
+S31508000788FFF7A7FFE4E7FFF709FEE1E7FFF7BDFF75
+S31508000798DEE7FFF721FEDBE738B505460C460B789A
+S315080007A803F06003202B06D0402B04D01BB1FFF7BB
+S315080007B813FE002038BD95F89C32013B022B16D84B
+S315080007C82379012B0ED8D5F8B4329B6821462846DA
+S315080007D89847E388002BECD10028EAD12846FFF78A
+S315080007E8BDFDE6E721462846FFF7F6FDE1E721467F
+S315080007F82846FFF7F1FDDCE770B505468B880C78C7
+S3150800080804F06004202C07D0DAB2402C04D05CB17E
+S31508000818FFF7E2FD002405E0D5F8B4329B682846C0
+S3150800082898470024204670BD202C09D04E78012E02
+S3150800083834D0032E0AD0002E56D0FFF7CDFDF1E7A7
+S31508000848D0F8B4329B6898470446EBE790F89C3290
+S31508000858022B04D0032B11D0FFF7BEFDE2E7002ACE
+S3150800086818BF802A07D0114604F02AF8802128469E
+S3150800087804F026F8D6E7FFF7AFFDD3E74B882BB980
+S31508000888002A18BF802A01D0CB881BB12846FFF753
+S3150800089865FDC7E7114604F013F8F7E790F89C32A8
+S315080008A8022B04D0032B11D0FFF796FDBAE7002ACE
+S315080008B818BF802A07D0114604F002F88021284676
+S315080008C803F0FEFFAEE7FFF787FDABE74B88002B83
+S315080008D8A8D112F07F0F03D12846FFF73FFDA1E7FD
+S315080008E8114603F0F5FFF7E790F89C02022806D0B0
+S315080008F803282AD02846FFF76FFD344692E7002AD0
+S3150800090818BF802A13D113F0800F15D102F07F0281
+S3150800091802EB8202910001F5A871294404310023EB
+S315080009280B6002222846FFF7FCFC34467AE728467D
+S31508000938FFF752FD344675E702F07F0202EB8202A2
+S315080009489100103129440431E9E75BB2002B20DB1A
+S3150800095802F00F0000EB800005EB8000D0F8580184
+S3150800096828B3002B28DB02F07F0303EB83039C00E4
+S3150800097804F5A8742C440434802A18BF002A24D104
+S3150800098800232360022221462846FFF7CAFC34467C
+S3150800099848E702F00F0000EB800005EB800080694D
+S315080009A80028DED12846FFF717FD34463AE72846D9
+S315080009B8FFF712FD344635E702F07F0303EB83039E
+S315080009C89C0010342C440434D6E71146284603F014
+S315080009D825FF10B101232360D4E700232360D1E75C
+S315080009E8D0B170B50D4616460446FFF7CDFC431C34
+S315080009F85B009BB233802B7003236B70022307E0DE
+S31508000A0801345A1CD2B2E8540233DBB20021A95485
+S31508000A1820780028F4D170BD704798B108B5034608
+S31508000A28D0F8B40210B10020C3F8B40209B1C3F86B
+S31508000A38B012012183F89C121A70184603F0B2FE08
+S31508000A48002008BD0220704710B50446012380F827
+S31508000A589C32D0F8B4325B6801799847204603F08F
+S31508000A6814FF204603F001FF002010BD19B1C0F895
+S31508000A78B412002070470220704708B503F0FDFE3F
+S31508000A88002008BD08B5D0F8B4322BB11B689847C2
+S31508000A9800B908BD0220FCE70220FAE708B5D0F835
+S31508000AA8B4325B689847002008BD38B5044600F597
+S31508000AB82A752846FFF77CFC0123C4F89432B4F853
+S31508000AC8AE32C4F8983294F8A81201F01F03012B25
+S31508000AD80ED0022B11D02BB101F08001204603F06D
+S31508000AE8EFFE03E029462046FFF722FE002038BD20
+S31508000AF829462046FFF750FEF8E729462046FFF71D
+S31508000B087BFEF3E738B504460D4691BB1346D0F885
+S31508000B189422032A03D0052A24D0084633E0D0F8BD
+S31508000B286011D0F8642191420DD9891AC0F860116C
+S31508000B388A4206D98AB219462046FFF707FC28468C
+S31508000B4821E092B2F7E7D0F8B4321B691BB190F8E6
+S31508000B589C22032A04D02046FFF700FC284612E008
+S31508000B689847F8E70021C0F8941203F0A9FE28462A
+S31508000B7809E0D0F8B4329B6933B190F89C22032A6D
+S31508000B8804D19847002038BD0220FCE70220FAE77E
+S31508000B9838B504460D46002954D11346D0F8942290
+S31508000BA8022A09D0002A18BF042A42D094F8A0328B
+S31508000BB8012B42D0284638BD016A426A91421BD8A1
+S31508000BC8C169B1FBF2F302FB13132BB98A4203D8A6
+S31508000BD8D0F8983299421CD3D4F8B432DB681BB1E2
+S31508000BE894F89C22032A21D08021204603F068FE27
+S31508000BF82046FFF7BEFBD9E78A1A026292B219465F
+S31508000C08FFF79CFB00231A461946204603F078FE90
+S31508000C18CCE700221146FFF791FB0021C4F8981289
+S31508000C280B460A46204603F06BFEBFE72046984760
+S31508000C38DAE7802103F044FEB8E7002384F8A032F7
+S31508000C482846B8E7D0F8B4325B6933B190F89C22E5
+S31508000C58032A04D198470020ADE70220ABE7022013
+S31508000C68A9E770B5044640230022114603F015FE8D
+S31508000C780125C4F858514026C4F864613346002251
+S31508000C888021204603F009FEA561666284F89C5215
+S31508000C980023C4F894326360C4F8A432D4F8B8328E
+S31508000CA82BB1D4F8B4325B68002120469847002057
+S31508000CB870BD01740020704790F89C3280F89D3208
+S31508000CC8042380F89C320020704790F89C32042B45
+S31508000CD801D00020704790F89D3280F89C32F8E7DA
+S31508000CE808B590F89C32032B01D0002008BDD0F82F
+S31508000CF8B432DB69002BF8D09847F6E7002070472E
+S31508000D08002070470020704708B5012280F89C2209
+S31508000D18D0F8B422526801799047002008BD00002F
+S31508000D28184AD2F8883043F47003C2F88830164B4C
+S31508000D381A6842F001021A6000221A6118681349F3
+S31508000D48014019609A61DA611A629A62DA621A636C
+S31508000D585A639A63DA631A645A64196821F4802113
+S31508000D6819601A660A4B1A680A4B1340B3F1005FF2
+S31508000D7803D2094B0122C3F80821024B4FF000623F
+S31508000D889A60704700ED00E0004402587FEDF6EAE5
+S31508000D980010005C0000FFFF0080005110B5164BDC
+S31508000DA86FF00042DA670024DC674FF0FF32C3F8B9
+S31508000DB88020C3F88040C3F88420C3F88440C3F869
+S31508000DC88820C3F88840C3F88C20C3F88C40C3F839
+S31508000DD89020C3F89040C3F89420C3F89440C3F809
+S31508000DE89820C3F89840C3F89C20C3F89C4003F0A1
+S31508000DF879FB204610BD00BF00440258104B1B78EB
+S31508000E080BB90120704710B504464FF47A70B0FB49
+S31508000E18F3F30C4A1068B0FBF3F002F0A1FA68B9CC
+S31508000E280F2C01D901200AE0002221464FF0FF3095
+S31508000E3802F060FA044B1C60002000E0012010BD97
+S31508000E4808000020000000200C00002010B5032030
+S31508000E5802F03EFA02F070F80F498B69C3F30323D0
+S31508000E680E4AD35C03F01F03D8408B6903F00F03BF
+S31508000E78D35C03F01F0320FA03F3094A1360094BEE
+S31508000E8818600020FFF7BAFF10B10124204610BDEC
+S31508000E98044603F077FAF9E700440258005D0008AB
+S31508000EA8040000200000002038B5044604F0ACF819
+S31508000EB80546B4F1FF3F02D0044B1B781C4404F0E6
+S31508000EC8A3F8401BA042FAD338BD00BF080000208B
+S31508000ED8204A136843F0010313601E4B1B6813F07E
+S31508000EE8040FFAD01B4B00221A6119681A4A0A40DD
+S31508000EF81A60184B1B6813F0007FFAD1154B1B684C
+S31508000F0813F0006FFAD1134B1B6813F0005FFAD180
+S31508000F18104B00229A61DA611A62104999621049DF
+S31508000F28D962104919635A639963DA6319645A646A
+S31508000F38196821F4802119601A66996E40F2FF72C1
+S31508000F480A439A66D3F8D02042F48032C3F8D020F0
+S31508000F58704700BF0044025845EDF6EA000202024F
+S31508000F680000FF018002010105EE900A06EE101A3C
+S31508000F7807EE902A07EE103AF8EE655AB8EE466A72
+S31508000F88C5EE866AF8EE677AB8EE477A9FED096A7B
+S31508000F9827EE067A77EE877A66EEA77A9DED007AC7
+S31508000FA8B8EE477AC7EE876AFCEEE67A17EE900A35
+S31508000FB8704700BF000000392DE9F04182B00446A9
+S31508000FC8394B9B6A03F00303012B5ED0022B63D0CF
+S31508000FD8002B4FD00026002323606360A360324BA2
+S31508000FE89F6AC7F305171A6BC2F3080202F10108CC
+S31508000FF8DD6A15F0010502D05D6BC5F3CC05002F37
+S3150800100835D0294BDB6A13F4803F0CD0264B1B6B73
+S31508001018C3F34623013300932B46424639463046E6
+S31508001028FFF7A2FF2060204BDB6A13F4003F0CD0C1
+S315080010381D4B1B6BC3F30643013300932B464246ED
+S3150800104839463046FFF790FF6060174BDB6A13F4A2
+S31508001058802F0CD0144B1B6BC3F306630133009324
+S315080010682B46424639463046FFF77EFFA06002B057
+S31508001078BDE8F0810C4B1E6816F00406ABD01B6859
+S31508001088C3F3C103094EDE40A5E7074B1E6816F4ED
+S315080010988076A0D0064E9EE7034B1E6816F40036E7
+S315080010A899D0044E97E700BF004402580090D00331
+S315080010B800093D0000127A002DE9F04182B0044685
+S315080010C8394B9B6A03F00303012B5ED0022B63D0CE
+S315080010D8002B4FD00026002323606360A360324BA1
+S315080010E89F6AC7F305379A6BC2F3080202F101082B
+S315080010F8DD6A15F0100502D0DD6BC5F3CC05002FA7
+S3150800110835D0294BDB6A13F4002F0CD0264B9B6B82
+S31508001118C3F34623013300932B46424639463046E5
+S31508001128FFF722FF2060204BDB6A13F4801F0CD0E0
+S315080011381D4B9B6BC3F30643013300932B4642466C
+S3150800114839463046FFF710FF6060174BDB6A13F421
+S31508001158001F0CD0144B9B6BC3F306630133009333
+S315080011682B46424639463046FFF7FEFEA06002B0D7
+S31508001178BDE8F0810C4B1E6816F00406ABD01B6858
+S31508001188C3F3C103094EDE40A5E7074B1E6816F4EC
+S315080011988076A0D0064E9EE7034B1E6816F40036E6
+S315080011A899D0044E97E700BF004402580090D00330
+S315080011B800093D0000127A002DE9F04182B0044684
+S315080011C83A4B9B6A03F00303012B60D0022B65D0C8
+S315080011D8002B51D00026002323606360A360334B9D
+S315080011E89F6AC7F305571A6CC2F3080202F1010889
+S315080011F8DD6A15F4807502D05D6CC5F3CC05002F41
+S3150800120818BF002E35D0294BDB6A13F4800F0CD093
+S31508001218264B1B6CC3F34623013300932B464246E1
+S3150800122839463046FFF7A0FE2060204BDB6A13F4E8
+S31508001238000F0CD01D4B1B6CC3F3064301330093F8
+S315080012482B46424639463046FFF78EFE6060174BF6
+S31508001258DB6A13F0807F0CD0144B1B6CC3F3066350
+S31508001268013300932B46424639463046FFF77CFE43
+S31508001278A06002B0BDE8F0810C4B1E6816F00406A3
+S31508001288A9D01B68C3F3C103094EDE40A3E7074B81
+S315080012981E6816F480769ED0064E9CE7034B1E6899
+S315080012A816F4003697D0044E95E700BF0044025856
+S315080012B80090D00300093D0000127A00154B1B69FF
+S315080012C803F03803182B0ED8DFE803F00F0D0D0DC1
+S315080012D80D0D0D0D210D0D0D0D0D0D0D160D0D0D0B
+S315080012E80D0D0D0D1800002070470A4B1B68C3F337
+S315080012F8C1030948D84070470848704700B585B003
+S3150800130801A8FFF759FE019805B05DF804FB0448E3
+S31508001318704700BF004402580090D00300127A00B4
+S3150800132800093D00044B9B6903F00F03034AD35C8D
+S3150800133803F01F03D840704700440258105D0008A0
+S31508001348044BDB69C3F30213034AD35C03F01F0398
+S31508001358D840704700440258105D0008044BDB6902
+S31508001368C3F30223034AD35C03F01F03D84070472C
+S3150800137800440258105D000800B585B0C2B2484B53
+S31508001388D358020EC0F304218A401340CB4040EAE2
+S315080013980340444B98420CD03DD8A3F500339842F5
+S315080013A86ED010D9404B984229D003F57D43984210
+S315080013B821D13E4B186810F0005019D001A8FFF744
+S315080013C8FBFE029814E0A3F5407398420FD1FFF785
+S315080013D875FF364B9B69C3F30323354AD35C03F081
+S315080013E81F03D840FFF79EFFFFF7AAFF00E000207B
+S315080013F805B05DF804FBA3F58033984209D12B4B59
+S31508001408186810F00060F3D001A8FFF755FE029897
+S31508001418EEE70020ECE7274B984217D00ED9264B63
+S31508001428984203D003F54073984227D11F4B186F8B
+S3150800143810F00200DCD04FF40040D9E7A3F580335A
+S3150800144898420ED003F57D43984206D1174B186883
+S3150800145810F48070CCD01948CAE7A3F580339842AF
+S315080014680AD1124B186810F00400C1D01B68C3F3E0
+S31508001478C1031348D840BBE70020B9E70020B7E7FF
+S31508001488FFF71CFF094B9B69C3F30323084AD35C80
+S3150800149803F01F03D840FFF745FFFFF75FFFA7E7ED
+S315080014A84C44025808030207080301070044025877
+S315080014B8105D0008080304070800050700093D0031
+S315080014C80090D00330B4446B0368D3F884106F4A8D
+S315080014D8114041EA8401C3F884100368D3F88410DC
+S315080014E821F47F01856B41EA0541C3F88410836BB3
+S315080014F823440468D4F88810114041EA8301C4F8E3
+S3150800150888100468D4F8881021F4FE01C56B41EAEE
+S315080015180541C4F88810C16B03EB41030468D4F885
+S31508001528A010114041EA8301C4F8A0100468D4F851
+S31508001538A01021F4FE01056C41EA0541C4F8A01083
+S31508001548016C446C04FB01330468D4F8B0101140EC
+S3150800155841EA8301C4F8B0100468D4F8B01021F43D
+S31508001568FE01856C41EA0541C4F8B010816CC46C6B
+S3150800157804FB01330468D4F8AC10114041EA83012E
+S31508001588C4F8AC10016D446D04FB01330468D4F843
+S31508001598F010114041EA8301C4F8F0100468D4F841
+S315080015A8F01021F47C11856D41EA0541C4F8F01064
+S315080015B8816D03EB41030468D4F8C0100A4042EA77
+S315080015C88303C4F8C0300268D2F8C03023F47C1309
+S315080015D8C16D43EA0143C2F8C0300268D2F8C03088
+S315080015E823F07C53016E43EA0163C2F8C030436BAB
+S315080015F8274A1A449200C266836B02EB8303036781
+S31508001608C16B03EBC1034367016C446C04FB01F12E
+S3150800161803EB81038367816CC46C04FB01F103EB5C
+S315080016288103C367016D446D04FB01F103EB810374
+S31508001638C0F88030816D03EBC103C0F88430816E31
+S31508001648C46D01FB04FC03EB8C03C0F88830046EF8
+S3150800165804FB01F103EB8103C0F890300D498B4276
+S315080016680DD9D0F89C3043F02003C0F89C300323EA
+S3150800167880F89830012007E0002342F8043BD0F8A8
+S3150800168890309342F8D8002030BC70470300FFFF1B
+S31508001698002B0010FCD3004070B54C68F4B90D69EE
+S315080016A88C6825430C6845EA84450E6ACC6944EA81
+S315080016B806648E6934434E693443CE683443D0F899
+S315080016C88460806E00FB03F306EB830E46F823500E
+S315080016D8CEF804400EF1080E002019E00C698D6852
+S315080016E825430C68254345F08045DEE702EB000CE8
+S315080016F89CF803409CF802301B0443EA04639CF8F0
+S31508001708014043EA0423145C23434EF8043B04309F
+S31508001718CB89024CE35C8342E8D870BD205D00089B
+S315080017287047000030B595B004464C22A04901A878
+S3150800173804F0A2FA002C00F0388123689D4A9342E7
+S3150800174820D094F898300BB32268936923F01003D5
+S31508001758936103F059FC054623689A6912F0080F45
+S315080017681AD003F051FC431B0A2BF5D9D4F89C3040
+S3150800177843F00103C4F89C30032384F89830012009
+S3150800178815B030BD03F580736360DAE784F89930DD
+S315080017982046FFF7C5FFD7E79A6942F001029A6122
+S315080017A803F032FC054623689A6912F0010F0FD137
+S315080017B803F02AFC401B0A28F5D9D4F89C3043F0D4
+S315080017C80103C4F89C30032384F898300120D7E72E
+S315080017D89A6942F002029A61237C012B40D022685A
+S315080017E8936943F040039361637C012B3ED02268DA
+S315080017F8936923F480439361A37C012B3CD0226828
+S31508001808936943F4805393612268936923F4407378
+S31508001818A1680B4393612268936923F0A403936133
+S315080018282268136923F010031361E368012B29D092
+S31508001838002B2CD0022B00F09B802268936943F07A
+S31508001848800393612268136943F010031361E36800
+S31508001858032B1CD12268936943F02003936116E091
+S315080018682268936923F040039361BDE72268936968
+S3150800187843F480439361BFE72268936923F480534E
+S315080018889361C1E72268936943F004039361A369E6
+S315080018985A1EE369013B1B0243EA4263226A013A7C
+S315080018A813436269013A216843EA0243CB61A36894
+S315080018B8B3F5407F62D0236E33B12268D2F8C030C0
+S315080018C8616E0B43C2F8C030E36D226ED3420DD069
+S315080018D82168D1F8C83023F00703A26E14A800EBD4
+S315080018E8820252F84C2C1343C1F8C830236C6BB1EA
+S315080018F82168D1F8BC3023F00703626C14A800EB02
+S31508001908820252F84C2C1343C1F8BC30A36C73B14D
+S315080019182168D1F8BC3023F07003E26C14A800EBF8
+S31508001928820252F84C2C43EA0213C1F8BC30236DE4
+S3150800193873B12168D1F8BC3023F4E063626D14A84A
+S3150800194800EB820252F84C2C43EA0223C1F8BC3059
+S315080019582268184B9A4222D00023C4F89430C4F857
+S315080019689C30012384F898302046FFF7ABFD07E73B
+S315080019782268936943F02003936188E7A36A013BC9
+S31508001988E26A013A43EA0223226B013A43EA02135E
+S31508001998626A013A216843EA0243CB608BE76268C8
+S315080019A8936823F003039360D6E70120E8E600BFAF
+S315080019B8B45C000800A0004090F89830013BDBB200
+S315080019C8012B07D9D0F89C3043F00203C0F89C30A5
+S315080019D801207047CB680A68D2B9072B0ED08A68E7
+S315080019E8DB0643EA82730A6943EA02434A691343F0
+S315080019F8C26E496842F82130002070470A69CB69E7
+S31508001A081B0243EA02438A69134343F06053EFE72C
+S31508001A1810B40A6942EA4372072B0FD04B698C68DF
+S31508001A2843EA8473006F496800EBC10C40F831201B
+S31508001A38CCF8043000205DF8044B70478B69F1E751
+S31508001A4890F898C05FFA8CFCBCF1010F07D0D0F863
+S31508001A589C3043F00403C0F89C300120704792007C
+S31508001A6842EA011242EA4302036800990A43C3F8A4
+S31508001A7880200020704790F89830DBB2012B07D0F9
+S31508001A88D0F89C3043F00403C0F89C300120704716
+S31508001A98022380F898300268936923F0010393615A
+S31508001AA80023C0F89C301846704738B590F898C097
+S31508001AB80CF1FF3C5FFA8CFCBCF1010F26D893FAAF
+S31508001AC8A3FEBEFA8EFE0568D5F8C040C4F3054CD9
+S31508001AD8E6450BD2D5F8CC401C420FD0D0F89C303E
+S31508001AE843F04003C0F89C30012016E0D0F89C303B
+S31508001AF843F02003C0F89C3001200EE093FAA3F3C4
+S31508001B08B3FA83F3FFF7C8FD002006E0D0F89C3047
+S31508001B1843F00203C0F89C30012038BD90F898308D
+S31508001B28DBB2022B07D0D0F89C3043F00803C0F884
+S31508001B389C30012070470368C3F8D010002070470E
+S31508001B4890F898C05FFA8CFCBCF1020F40F0C88088
+S31508001B5870B540290CD0412930D0046D8C4253D831
+S31508001B68D0F89C3043F02003C0F89C300120A9E047
+S31508001B780468D4F8A05015F4FE0F0CD0D4F8A45075
+S31508001B8815F07F0F0FD1D0F89C3043F48073C0F856
+S31508001B989C30012096E0D0F89C3043F02003C0F82A
+S31508001BA89C3001208EE0D4F8A460C6F30526456F5C
+S31508001BB8446C06FB04F405EB840C2CE00468D4F8A2
+S31508001BC8B05015F4FE0F0CD0D4F8B45015F07F0FAA
+S31508001BD80FD1D0F89C3043F48073C0F89C300120AC
+S31508001BE870E0D0F89C3043F02003C0F89C30012000
+S31508001BF868E0D4F8B460C6F30526856FC46C06FB9E
+S31508001C0804F405EB840C06E0C56F446D01FB04F487
+S31508001C1805EB840C0026DCF8004004F08044546088
+S31508001C2874BBDCF80040C4F38A441460DCF800404E
+S31508001C3804F000549460DCF8004004F00044146191
+S31508001C48BCF80440D461DCF8044004F47024D46079
+S31508001C58DCF8044004F480145461DCF8044004F405
+S31508001C68001494619CF8074004F07F041462DCF8B9
+S31508001C780440E40F54620CF1080E4FF0000C0BE018
+S31508001C88DCF8004024F060441460CFE71EF80C40E6
+S31508001C9803F80C400CF1010CD489154D2C5D6445EC
+S31508001CA8F4D840290AD041290DD01F290FD802682F
+S31508001CB8012303FA01F1C2F8981002E00368C3F891
+S31508001CC8A860002070BD0368C3F8B860F9E701F09A
+S31508001CD81F010268012303FA01F1C2F89C10F0E714
+S31508001CE8D0F89C3043F00803C0F89C3001207047B0
+S31508001CF8205D00080368D3F8CC00084000D001200E
+S31508001D087047402905D00368D3F8B40000F07F006F
+S31508001D1870470368D3F8A40000F07F0070470000F6
+S31508001D2801F00303032B24D011F0010F0BD01D4B30
+S31508001D38DA6822F03002DA60DA680243DA60DA68CA
+S31508001D4842F08802DA6011F0020F11D0154BD3F869
+S31508001D580C2122F03002C3F80C21D3F80C211043C9
+S31508001D68C3F80C01D3F80C2142F08802C3F80C21F9
+S31508001D7870470C4BDA6822F03002DA60D3F80C2187
+S31508001D8822F03002C3F80C21DA680243DA60D3F885
+S31508001D980C211043C3F80C019A6942F010029A61A3
+S31508001DA8704700BF0020005210B411F0010F0CD084
+S31508001DB8114CE36823F4E663E360E36842EA002C1F
+S31508001DC843EA0C0343F08403E36011F0020F0FD0D3
+S31508001DD80949D1F80C3123F4E663C1F80C31D1F876
+S31508001DE80C3142EA00221A4342F08402C1F80C2157
+S31508001DF85DF8044B704700BF00200052F8B5474B02
+S31508001E081B7D012B00F0888004460F46434B0122B0
+S31508001E181A7500229A61436813F0010F0DD100253F
+S31508001E28636813F0020F12D1CDB92368012B1BD0B2
+S31508001E384FF0FF333B60A6684CE001214CF2503066
+S31508001E4800F028FA05460028EAD00125E8E7022125
+S31508001E584CF2503000F01EFA0028E5D001252F4B29
+S31508001E6800221A752846F8BD61682069FFF758FFE9
+S31508001E78636813F0010F12D1636813F0020FEED0EE
+S31508001E8802214CF2503000F005FA00B10125244A27
+S31508001E98D2F80C3123F00803C2F80C31DFE7012128
+S31508001EA84CF2503000F0F6F900B101251C4AD36807
+S31508001EB823F00803D360DFE701214CF2503000F025
+S31508001EC8E9F90546164AD168164B0B40D3600FE068
+S31508001ED805BB0136E368A2681344B342BFD9226931
+S31508001EE861683046FFF760FF636813F0010FE3D1B6
+S31508001EF8636813F0020FEBD002214CF2503000F061
+S31508001F08C9F90546064AD2F80C11064B0B40C2F821
+S31508001F180C31DDE73E60A2E70225A3E7AC01002005
+S31508001F2800200052FBF8FFFF6A4B984222D06A4B02
+S31508001F3898422FD0694B98423CD0694B984249D071
+S31508001F48684B984256D0684B984263D0674B98427C
+S31508001F5870D0674B98427DD0664B984200F08A80CD
+S31508001F68654B984200F09680644B984200F0A28030
+S31508001F780120704703F58843D3F8882042F0010208
+S31508001F88C3F88820D3F8882022F00102C3F88820ED
+S31508001F980020704703F58043D3F8882042F00202F0
+S31508001FA8C3F88820D3F8882022F00202C3F88820CC
+S31508001FB80020704703F57053D3F8882042F00402CE
+S31508001FC8C3F88820D3F8882022F00402C3F88820AA
+S31508001FD80020704703F56053D3F8882042F00802BA
+S31508001FE8C3F88820D3F8882022F00802C3F8882086
+S31508001FF80020704703F55053D3F8882042F01002A2
+S31508002008C3F88820D3F8882022F01002C3F888205D
+S315080020180020704703F54053D3F8882042F0200281
+S31508002028C3F88820D3F8882022F02002C3F888202D
+S315080020380020704703F53053D3F8882042F0400251
+S31508002048C3F88820D3F8882022F04002C3F88820ED
+S315080020580020704703F52053D3F8882042F0800201
+S31508002068C3F88820D3F8882022F08002C3F888208D
+S315080020780020704703F51053D3F8882042F480727D
+S31508002088C3F88820D3F8882022F48072C3F88820F9
+S315080020980020704703F50053D3F8882042F40072ED
+S315080020A8C3F88820D3F8882022F40072C3F8882059
+S315080020B80020704703F5E053D3F8882042F480627D
+S315080020C8C3F88820D3F8882022F48062C3F88820C9
+S315080020D800207047000002580004025800080258F9
+S315080020E8000C02580010025800140258001802582A
+S315080020F8001C0258002002580024025800280258DA
+S315080021080B6893FAA3F3B3FA83FC3CE08C688268FD
+S3150800211803FB03F505EB450622EA060205FB04F46C
+S31508002128224382600C68CD68426822EA040205FBED
+S3150800213804F42243426034E0FF2B0ED84D69046A42
+S315080021480EFB03F606FB03F3C3EB031624EA0604A1
+S3150800215805FB03F32343036233E04C69456A1B0A0C
+S3150800216803FB03F603FB06F606FB03F3C3EB0316AA
+S3150800217825EA060504FB03F32B43436221E0002006
+S3150800218870BD0CF1010C0B6833FA0CF22CD0012245
+S3150800219802FA0CF21340F4D070B54A68013A012ADB
+S315080021A8B4D9C46803FB03FE0EEB4E05EA4324EADA
+S315080021B805040D690EFB05F52C43C4604C68022C12
+S315080021C8BAD04C68036813400EFB04F42343036033
+S315080021D80CF1010C0B6833FA0CF2D0D0012202FA82
+S315080021E80CF21340F4D0D8E700207047024AD368A7
+S315080021F843F08073D360704700480258144BDB6875
+S3150800220813F0010F09D0124B124A5A6002F18832AC
+S315080022185A60DB6813F0010F14D10D4BD3F80C3153
+S3150800222813F0010F10D00A4B0A4AC3F8042102F129
+S315080022388832C3F80421D3F80C3113F0010F05D1FD
+S31508002248002070470120704700207047012070471A
+S3150800225800200052230167450D4BDA6842F0010257
+S31508002268DA60DB6813F0010F0DD0094BD3F80C219F
+S3150800227842F00102C3F80C21D3F80C3113F0010F10
+S3150800228803D000207047012070470120704700BF1F
+S3150800229800200052F8B505460E4602F0B5FE074678
+S315080022A8012E09D0364C17E002F0AEFEC01BA84234
+S315080022B860D88DB903204EE004240DE0314BD3F8DD
+S315080022C8103124EA030333F000430CBF012300232B
+S315080022D86BB1B5F1FF3FE7D134F00403EED1294BD2
+S315080022E81B6934EA03030CBF01230023F0E7012E18
+S315080022F81CD0244BD3F8103123F0684323F48013F9
+S315080023085B0C5B0443F0004333F0024217D1012EFD
+S3150800231825D01C4BD3F8103113F4803F2ED0194B17
+S315080023284FF48032C3F81421002014E0154B1B69BA
+S3150800233823F0684323F480135B0C5B04E4E7124933
+S315080023488A691A438A61002B06DA23F000430D4A84
+S31508002358C2F814310120F8BD0A4A5361FAE7094B55
+S315080023681B6913F4803F07D0064B4FF480325A6135
+S315080023780020F0E70320EEE70020ECE70020EAE774
+S315080023880400008000200052AC0100202A4B1B7D67
+S31508002398012B4ED070B50D461446274B01221A75E7
+S315080023A801F17841B1F5801F35D21646224B002235
+S315080023B89A6131464CF25030FFF76CFF38BB012E54
+S315080023C82BD01E4AD2F80C3143F00203C2F80C315E
+S315080023D8BFF36F8FBFF34F8F082354F8042B45F8C4
+S315080023E8042B013B13F0FF03F7D1BFF36F8FBFF33D
+S315080023F84F8F31464CF25030FFF74CFF012E12D062
+S315080024080E4AD2F80C3123F00203C2F80C310A4BF3
+S3150800241800221A7570BD0226C8E7084AD36843F031
+S315080024280203D360D4E7054AD36823F00203D360CE
+S31508002438EDE70220704700BFAC01002000200052DB
+S31508002448002301330C4A934211D80269002AF8DAA4
+S31508002458036943F00103036100230133064A9342E3
+S3150800246807D8026912F0010FF7D100207047032038
+S3150800247870470320704700BF400D030084B010B5AD
+S31508002488044603A880E80E00089B012B1DD1A36B00
+S3150800249823F48033A363E2681A4B1340E360E368C6
+S315080024A823F44013E3600F9B012B09D02046FFF75E
+S315080024B8C7FF069B012B1BD0BDE8104004B0704728
+S315080024C8E36843F48013E360F0E7E36843F0400306
+S315080024D8E3602046FFF7B4FF0C9B23B9A36B43F4CC
+S315080024E88033A363E5E7A36B23F48033A363E0E7AC
+S315080024F8A36843F00603A360A36843F02003A36018
+S31508002508DAE700BFBFFFBDFF022A0AD00921C26861
+S3150800251822F47052C260C36843EA8123C36000206C
+S315080025287047204B0B44204A934229D91F4B0B442A
+S315080025381F4A934226D91F4B0B441F4A934223D955
+S315080025481E4B0B441E4A934220D31E4B0B441E4A6D
+S3150800255893421DD91D4B0B441D4A93421AD31D4B52
+S315080025680B441D4A934217D31C4B0B441C4A9342EF
+S3150800257814D31C4B0B441C4A934211D20721C6E7B5
+S315080025880F21C4E70E21C2E70D21C0E70C21BEE7DB
+S315080025980B21BCE70A21BAE70921B8E70821B6E7FB
+S315080025A80621B4E7405327FFFF340C00401E1BFFE3
+S315080025B83F420F0000DC0BFF7F4F1200808CF9FEAC
+S315080025C820D6130060B6E5FE5FE3160000D3CEFEFC
+S315080025D840771B00C05BB3FEC091210000CA91FE7C
+S315080025E820753800E05459FEE09C4100836843F0A2
+S315080025F80103836000207047836823F00103836022
+S315080026080020704708B5C36823F0C043C360012992
+S3150800261809D069B9C36843F08043C3603220FEF71E
+S3150800262843FC002008BDC36843F00053C360F5E7C0
+S315080026380120F7E7890141F02001016100230133F0
+S31508002648054A934205D8026912F0200FF7D10020EF
+S3150800265870470320704700BF400D0300102303612D
+S3150800266800230133054A934205D8026912F0100F70
+S31508002678F7D1002070470320704700BF400D0300BC
+S31508002688D0F800381943C0F8001800207047000031
+S3150800269884B02DE9F041044607A880E80E00002317
+S315080026A806E003F1400204EB82020021516001337F
+S315080026B80E2BF6D9119F27BBD4F8043843F002032A
+S315080026C8C4F80438A36B23F40013A363236843F000
+S315080026D840032360236843F0800323600023C4F87B
+S315080026E8003E04F50065D4F80038C4F800380C9B99
+S315080026F8012B10D1099B4BB900212046FFF7C0FFD3
+S315080027080DE0A36B43F40013A363E7E70121204612
+S31508002718FFF7B6FF03E003212046FFF7B1FF1021B4
+S315080027282046FFF787FF804608B14FF00108204684
+S31508002738FFF794FF08B14FF0010800232B616B617E
+S31508002748EB610AE0C3B94FF00060C2F8000900223D
+S315080027580A614FF67F328A6001330799994210D980
+S3150800276804EB431202F51061D2F800090028E9DBE8
+S315080027780020C2F80009EAE74FF09040C2F80009BD
+S31508002788E5E700230AE0C3B14FF0904CC2F800CB46
+S31508002798002202614FF67F3282600133994211D9CD
+S315080027A804EB431202F53060D2F8006B002EEADB20
+S315080027B84FF0000CC2F800CBEAE74FF0006CC2F8FD
+S315080027C800CBE5E72B6923F480732B610023A3610B
+S315080027D86FF0804363610A9B1BB9A36943F0100332
+S315080027E8A361A2690A4B1343A3610D9B1BB1A36995
+S315080027F843F00803A361012F04D04046BDE8F04121
+S3150800280804B07047A269034B1343A361F5E700BFF9
+S3150800281800383C8004000040D0F8083813F0060356
+S3150800282805D0062B18BF022B03D1022070470020BB
+S3150800283870470F207047000010B591F800C04B7814
+S31508002848012B21D000F5006ED0F81C380CF00F04C7
+S315080028580122A24043EA0243C0F81C3800EB4C1098
+S31508002868D0F8003B13F4004F0CD1D0F8002B8B6836
+S31508002878C3F30A03C97843EA81431343144A1A433C
+S31508002888C0F8002B002010BDD0F81C280CF00F0E3D
+S3150800289803FA0EF39BB21343C0F81C3800EB4C102E
+S315080028A8D0F8003913F4004FECD1D0F800298B681A
+S315080028B8C3F30A03C97843EA814343EA8C5C42EACC
+S315080028C80C0C034B4CEA0303C0F80039DAE700BFDF
+S315080028D80080001030B50B784A78012A20D0D0F845
+S315080028E83C4803F00F0E4FF0010C0CFA0EFE24EAD2
+S315080028F80E44C0F83C48D0F81C48097801F00F0186
+S315080029080CFA01FC24EA0C44C0F81C4800EB4310F6
+S31508002918D0F8002B124B1340C0F8003B002030BDFE
+S31508002928D0F83C5803F00F0402FA04F4A4B225EAD6
+S315080029380404C0F83C48D0F81C48097801F00F018F
+S315080029488A4092B224EA0202C0F81C2800EB431017
+S31508002958D0F80039034A1A40C0F80029DEE700BF54
+S315080029680078F3EF007833EC70B40B784C78012CC8
+S3150800297825D000EB431000F530631D693F4C2C4009
+S315080029881C611D693E4C2C401C614C690CB18C6855
+S315080029984C611C6944F400241C611C698D68C5F3E4
+S315080029A8120C44EA0C041C61012A62D0D0F8003BD8
+S315080029B843F00443C0F8003B002070BC70474C69DC
+S315080029C85CBB00EB4314D4F810692D4D3540C4F8A8
+S315080029D81059D4F8105945F40025C4F81059D4F8F4
+S315080029E81069264D3540C4F81059012A32D000EB33
+S315080029F84313D3F8002942F00442C3F800294B6967
+S31508002A08002BD9D0D0F834380A7802F00F01012201
+S31508002A188A401343C0F83438CEE700EB431404F56C
+S31508002A2810642669154D354025612669144D3540CB
+S31508002A3825618D684E69AE4200D94D61256945F410
+S31508002A480025256125694E69C6F3120C45EA0C0569
+S31508002A582561CAE70A691AB100EB4311C1F81429B6
+S31508002A6800EB4310D0F8002942F00442C0F80029C8
+S31508002A78A2E7CA68002A99D05A6197E70000F8FFC2
+S31508002A88FFFF07E010B59DF8084084B903334FEAFD
+S31508002A98930E4FF0000C08E000EB023303F5805361
+S31508002AA851F8044B1C600CF1010CF445F4D30020D2
+S31508002AB810BD0000F0B583B00B784C78012C31D0E6
+S31508002AC800EB431303F5306CDCF81050834C2C40AC
+S31508002AD8CCF81040DCF81050814C2C40CCF810404B
+S31508002AE84C69002C40F0C680DCF810408D68C5F3A8
+S31508002AF812052C43CCF81040DCF8104044F40024A6
+S31508002B08CCF81040012A00F0CF80CA78012A00F0D4
+S31508002B18D280D3F8002B42F00442C3F8002B0020D9
+S31508002B2803B0F0BD4C6974BB00EB4314D4F81069C4
+S31508002B386B4D3540C4F81059D4F8105945F400259A
+S31508002B48C4F81059D4F81069644D3540C4F81059BA
+S31508002B58012A4DD000EB4313D3F8004944F0044446
+S31508002B68C3F80049CC78012C6BD04B69002BD6D01A
+S31508002B78D0F834380A7802F00F0101228A40134344
+S31508002B88C0F83438CBE700EB4314D4F81069534D32
+S31508002B983540C4F81059D4F81069514D3540C4F871
+S31508002BA81059D4F810598E684F6907EB060C0CF1C2
+S31508002BB8FF3CBCFBF6FC4B4E06EACC4C45EA0C053A
+S31508002BC8C4F81059D4F810594E69C6F31206354395
+S31508002BD8C4F8105904F51064CD78012DB8D12569C3
+S31508002BE825F0C0452561256945F000552561AFE7FB
+S31508002BF80A691AB100EB4314C4F81429CA78012AD9
+S31508002C0808D000EB4313D3F8002942F00442C3F86E
+S31508002C18002984E7D0F8082812F4807F08D100EB49
+S31508002C284311D1F8002942F00052C1F80029E8E713
+S31508002C3800EB4311D1F8002942F08052C1F8002967
+S31508002C48DFE7D0F8084814F4807F0CD1D3F8004998
+S31508002C5844F00054C3F8004900928B8A0A78C96878
+S31508002C68FFF710FF5BE7D3F8004944F08054C3F830
+S31508002C780049F1E78D682C44013CB4FBF5F4DCF80F
+S31508002C8810501FFA84FE174E06EAC4442543CCF8AA
+S31508002C981050DCF810508C680EFB04F4C4F31204C8
+S31508002CA82C43CCF810402DE7CA68002A3FF42DAF0C
+S31508002CB8CCF8142029E7D0F8082812F4807F06D122
+S31508002CC8D3F8002B42F00052C3F8002B21E7D3F8BB
+S31508002CD8002B42F08052C3F8002B1AE70000F8FFD1
+S31508002CE8FFFF07E00000F81F84460846D11C89083C
+S31508002CF8002305E00CF58052126840F8042B0133CE
+S31508002D088B42F7D370470B784A78012A14D000EB20
+S31508002D184310D0F8002B002A06DB2BB1D0F8003B6D
+S31508002D2823F08043C0F8003BD0F8003B43F4001377
+S31508002D38C0F8003B0020704700EB4310D0F8002984
+S31508002D48002A06DB2BB1D0F8003923F08043C0F8F7
+S31508002D580039D0F8003943F40013C0F80039E9E718
+S31508002D680B784A78012A0ED000EB4310D0F8003BBE
+S31508002D7823F40013C0F8003BCB78023BDBB2012BE7
+S31508002D8815D90020704700EB4310D0F8003923F412
+S31508002D980013C0F80039CB78023BDBB2012BF0D818
+S31508002DA8D0F8003943F08053C0F80039E9E7D0F87D
+S31508002DB8003B43F08053C0F8003BE2E710B50446F1
+S31508002DC8002208E004EB42134FF67F31C3F80819CE
+S31508002DD8C3F8081B01320E2AF4D90022C4F81028B1
+S31508002DE8C4F81428C4F81C282046FFF737FC00B195
+S31508002DF810BD10212046FFF71DFCF9E7D0F800386A
+S31508002E0823F4FE63C0F80038D0F80038090101F445
+S31508002E18FE611943C0F800180020704708B5D0F8B5
+S31508002E28043823F00203C0F804380320FEF73CF8F8
+S31508002E38002008BD08B5D0F8043843F00203C0F8E6
+S31508002E4804380320FEF730F8002008BD4269806977
+S31508002E5810407047D0F8183800F50060C069184067
+S31508002E68000C7047D0F8183800F50060C06918409B
+S31508002E7880B2704700EB4111D1F8082B00F50060C5
+S31508002E8840691040704710B4D0F81048D0F8343864
+S31508002E9801F00F02D340DB01DBB2234300EB4110FC
+S31508002EA800F51060806818405DF8044B7047406963
+S31508002EB800F0010070470000D0F80029054B1340C0
+S31508002EC8C0F80039D0F8043843F48073C0F80438D9
+S31508002ED80020704700F8FFFF10B4046C154B9C429D
+S31508002EE803D9D0F8003B002B16DB0024C0F8104B9A
+S31508002EF8D0F8104B44F40024C0F8104BD0F8104B07
+S31508002F0844F01804C0F8104BD0F8104B44F0C044ED
+S31508002F18C0F8104B012903D000205DF8044B704710
+S31508002F28C0F8142BD0F8003B43F08023C0F8003BC8
+S31508002F38F2E700BF0A30544F744B1B6903F0380395
+S31508002F48102B00F0DE80182B10D00BB17048704794
+S31508002F586E4B1B6813F0200F00F0D5806B4B186872
+S31508002F68C0F3C1006B4B23FA00F0704710B4674AE8
+S31508002F78916A01F00301946AC4F30510D36A03F051
+S31508002F88010C536BC3F3CC030CFB03F307EE903A1F
+S31508002F98F8EE677A14F47C7F00F09380012965D0EF
+S31508002FA8022900F09180E1B107EE100AF8EE476AA7
+S31508002FB89FED596A86EE267A544B1B6BC3F30803B2
+S31508002FC806EE903AF8EE666A9FED546A67EE867AD8
+S31508002FD876EEA77AF7EE006A77EEA67A27EE277ACC
+S31508002FE860E0136813F0200F23D011461268C2F365
+S31508002FF8C102484BD34007EE103AF8EE476A07EE87
+S31508003008100AB8EE476A86EE867A0B6BC3F308038E
+S3150800301806EE903AF8EE666A9FED406A67EE867A9B
+S3150800302876EEA77AF7EE006A77EEA67A27EE277A7B
+S3150800303838E007EE100AF8EE476A9FED396A86EE19
+S31508003048267A324B1B6BC3F3080306EE903AF8EE62
+S31508003058666A9FED326A67EE867A76EEA77AF7EEA3
+S31508003068006A77EEA67A27EE277A1BE007EE100A9B
+S31508003078F8EE476A9FED286A86EE267A234B1B6B7D
+S31508003088C3F3080306EE903AF8EE666A9FED236ADC
+S3150800309867EE867A76EEA77AF7EE006A77EEA67A6C
+S315080030A827EE277A194B1B6BC3F34623013307EE22
+S315080030B8903AF8EE677AC7EE276AFCEEE67A17EED4
+S315080030C8900A5DF8044B704707EE100AF8EE476A4F
+S315080030D89FED146A86EE267A0C4B1B6BC3F308031E
+S315080030E806EE903AF8EE666A9FED0C6A67EE867AFF
+S315080030F876EEA77AF7EE006A77EEA67A27EE277AAB
+S31508003108D0E7094870470348704700BF004402588B
+S3150800311800093D000090D0030024744A00000039D5
+S315080031280024744C0024F44A00127A0008B5FFF704
+S3150800313803FF0B4A9369C3F303230A49CB5C03F0DD
+S315080031481F0320FA03F3926902F00F02885C00F065
+S315080031581F0023FA00F0044A1060044A136008BDE9
+S3150800316800440258005D0008040000200000002002
+S31508003178014B1860704700BF0000002038B5036887
+S3150800318813F0010F40F0898004460D460368444A47
+S315080031981A408B6809690B4369690B43E9690B434C
+S315080031A813430360EB68426822F4405213434360B2
+S315080031B8AB69826822F4407213438360394B98429C
+S315080031C816D0394B98421CD0384B98421DD0384BEC
+S315080031D898421ED0374B98421FD0374B984220D07A
+S315080031E8364B984221D0364B984222D001204DE0E2
+S315080031F83448FEF7C1F8002847D06A68EAB90120BA
+S3150800320844E03148FEF7B8F8F5E72F48FEF7B4F872
+S31508003218F1E72D48FEF7B0F8EDE72B48FEF7ACF8CE
+S31508003228E9E72848FEF7A8F8E5E72748FEF7A4F8E7
+S31508003238E1E72548FEF7A0F8DDE72B68E9690B2BD7
+S315080032480ED8B1F5004F0DD0DBB2204951F823301E
+S31508003258B0FBF3F000EB5203B3FBF2F39BB2E36067
+S31508003268002013E0DBB2194951F82330B0FBF3F01C
+S31508003278530803EB4000B0FBF2F34FF6F0721A401E
+S31508003288C3F342031343E360EAE70120E26A22F044
+S315080032980F022B881343E36238BD0120FCE700BF01
+S315080032A8F369FFEF00100140004400400048004061
+S315080032B8004C0040005000400014014000780040CF
+S315080032C8007C00400803000708000007305D000876
+S315080032D80649CB6823F4E0631B041B0C000200F4C0
+S315080032E8E0600343024A1A43CA60704700ED00E0EB
+S315080032F80000FA0500B5174BDB68C3F30223C3F1D0
+S31508003308070CBCF1040F28BF4FF0040C03F1040E98
+S31508003318BEF1060F14D9033B4FF0FF3E0EFA0CFC1C
+S3150800332821EA0C0199400EFA03F322EA030319432A
+S31508003338002807DB0901C9B2074B19545DF804FBD5
+S315080033480023E9E700F00F000901C9B2034B195435
+S31508003358F4E700BF00ED00E000E400E014ED00E04B
+S315080033680138B0F1807F0BD24FF0E0235861054A47
+S31508003378F02182F823100020986107221A61704705
+S315080033880120704700ED00E010B40468606A31B99E
+S3150800339840EA0240A06200205DF8044B70478C465C
+S315080033A8A36A00EB1340002308E003F1400104EB8D
+S315080033B88101496800EB11400133DBB20CF1FF319A
+S315080033C88B42F2D340EA02400CF13F0104EB81013B
+S315080033D84860E0E7036859620020704703460268B8
+S315080033E80121C0F8FC13002083F8F403936943F01D
+S315080033F800639361516D024B0B435365704700BFD9
+S315080034080300001070472DE9F04383B0D0F8008018
+S31508003418C1EBC10300EB83035A6D1B6D9A4254D85E
+S3150800342807460C469B1AC1EBC10200EB8202526C96
+S315080034389A4200D31A4602F103094FEA990915E098
+S3150800344806F103094FEA9909C4EBC40507EB850594
+S31508003458A96C3B7C0093B3B2E2B24046FFF712FB75
+S31508003468AB6C3344AB646B6D33446B6508EB441340
+S3150800347803F510639B699BB24B4512D3C4EBC40290
+S3150800348807EB8202516D136D99420AD24BB15B1A4A
+S31508003498C4EBC40207EB8202566C9E42D0D31E4682
+S315080034A8CEE7C4EBC40007EB80073A6D7B6D9A42FA
+S315080034B80FD804F00F040123A340D8F8344824EAA7
+S315080034C80304C8F83448002000E0012003B0BDE82A
+S315080034D8F0830020FAE7704770B58AB0002800F034
+S315080034E897800546046890F8BD333BB3032385F8EF
+S315080034F8BD33E36B13F4807F01D100232B61286861
+S31508003508FFF77AF82C4654F8106BEC460FCCACE863
+S315080035180F000FCCACE80F0094E803008CE8030012
+S315080035282B1D0ECB3046FEF7A9FF044658B10223D9
+S3150800353885F8BD33012420460AB070BD80F8BC332F
+S31508003548FFF7C9FFD2E700212868FFF75BF823468B
+S3150800355816E0C3EBC30205EB8202012182F83D108F
+S3150800356882F83C30A2F84230002182F83F105164B4
+S315080035789164C3EBC30205EB820211650133DBB222
+S3150800358869688B42E5D316E0C4EBC40305EB8303ED
+S31508003598002283F8FD2183F8FC4183F8FF21C3F84C
+S315080035A80422C3F80822C4EBC40305EB8303C3F853
+S315080035B810220134E4B2A142E6D82C4654F8106B1E
+S315080035C8EC460FCCACE80F000FCCACE80F0094E83B
+S315080035D803008CE803002B1D0ECB3046FFF758F87E
+S315080035E8044660B9002385F83830012385F8BD33C9
+S315080035F86B6A012B08D02868FFF71CFC9BE7022397
+S3150800360885F8BD33012496E72846FFF7E7FEF2E773
+S31508003618012490E77047026890F8BC33012B19D04B
+S3150800362810B50446012380F8BC33836A012B09D0F8
+S315080036382068FFF7F3FB2068FEF7D8FF002084F818
+S31508003648BC0310BD8369012BF2D0936B43F4803316
+S315080036589363EDE70220704738B590F8BC33012B21
+S3150800366818D00446012380F8BC330068FEF7C4FF67
+S315080036782068FFF7A3FB054628B1002384F8BC3366
+S315080036880125284638BD2068FFF7D4FB002384F8AF
+S31508003698BC33F6E70225F4E768B110B504460323F8
+S315080036A880F8BD33FFF7D8FF2046FFF7B3FF0020A1
+S315080036B884F8BD0310BD01207047000070B50446A4
+S315080036C80D460068066C00EB411303F530639A68EB
+S315080036D82169012911D034498E424ED03DB9C5EB2E
+S315080036E8C50304EB8303D3F81032002B56D0E9B28E
+S315080036F8204600F0DBFF002070BD12F0080F09D045
+S315080037082A498E42F7D912F4004FF4D04FF40042F2
+S315080037189A60F0E712F0200F02D020229A60EAE7B2
+S3150800372812F0280FE7D121498E4206D912F4004F24
+S3150800373803D04FF400429A60DDE7C5EBC50204EBF7
+S315080037488202D2F804121B69C3F31203CB1AC2F811
+S315080037581432D2F808320B44C2F8083215B9D2F82E
+S31508003768103223B1E9B2204600F0A0FFC3E704F5FA
+S3150800377871720121FFF7B0FBF4E712F4004F03D08A
+S315080037884FF400429A60B6E712F0200F01D02022C3
+S315080037989A60E9B2204600F089FFACE704F5717231
+S315080037A80021FFF799FBA2E70A31544F0A30544F14
+S315080037B838B5044603681D6C03EB4113D3F8081B98
+S315080037C80E4A954207D903F5306311F4004F02D023
+S315080037D84FF400429A60204600F060FF074B9D426E
+S315080037E802D92369012B01D0002038BD04F571726E
+S315080037F801212068FFF770FBF6E700BF0A30544F2F
+S315080038082DE9F84F044605682846FFF750FB08B126
+S31508003818BDE8F88F06462068FFF718FB0028F7D09A
+S315080038282068FFF713FB10F0020F04D022685369CB
+S3150800383803F0020353612068FFF708FB10F0100F26
+S3150800384814D02268936923F0100393612F6A07F04E
+S315080038580F08C7F34343022B00F08580062B00F0B8
+S31508003868A1802268936943F0100393612068FFF7E3
+S31508003878EDFA10F4002F40F0A7802068FFF7E6FA63
+S3150800388810F4802F40F0E9802068FFF7DFFA002857
+S31508003898C0F253812068FFF7D9FA10F4006F0AD0EE
+S315080038A8D5F8083813F0010F40F06181226853698A
+S315080038B803F4006353612068FFF7C8FA10F0006F35
+S315080038C815D02268536903F00063536194F8F433FA
+S315080038D8002B40F05081012184F8F41323685B6DAE
+S315080038E8C3F38303C4F8F8332046FFF78BFD206833
+S315080038F8FFF7ACFA10F4805F40F041812068FFF7C3
+S31508003908A5FA10F4005F40F095812068FFF79EFA43
+S3150800391810F0080F40F0A6812068FFF797FA10F410
+S31508003928801F40F0A8812068FFF790FA10F4001F5E
+S3150800393840F0AB812068FFF789FA10F0804F40F015
+S31508003948AE812068FFF782FA10F0040F3FF460AFE3
+S3150800395823685D6815F0040F40F0AA812268536849
+S315080039682B43536054E747F6F0731F423FF479AF89
+S315080039784FEA171BC8EBC80904EB8909C7F30A12EB
+S31508003988D9F808122846FFF7AFF9CBF30A02D9F88F
+S3150800399808321344C9F80832D9F814321A44C9F84F
+S315080039A814225EE7082204F571712846FFF79CF988
+S315080039B8C7F30A17C8EBC80204EB8202D2F8143216
+S315080039C81F44C2F814724CE72068FFF743FA074603
+S315080039D8B04616E005EB48130122C3F8082B414602
+S315080039E82046FFF76BFE1BE005EB48130822C3F8D1
+S315080039F8082B41462046FFF7DBFE14E008F10108CC
+S31508003A087F08002F3FF439AF17F0010FF6D05FFA99
+S31508003A1888F12068FFF72EFA814610F0010FD9D1F0
+S31508003A2819F0080FE0D119F0100F04D005EB481368
+S31508003A381022C3F8082B19F0200F04D005EB4813F9
+S31508003A482022C3F8082B19F4005FD7D005EB4813D2
+S31508003A584FF40052C3F8082BD0E72068FFF702FA9C
+S31508003A680746B04629E05146204600F02BFE19F0D5
+S31508003A78080F04D005EB48130822C3F8082919F0DB
+S31508003A88100F04D005EB48131022C3F8082919F0BB
+S31508003A98400F04D005EB48134022C3F8082919F04B
+S31508003AA8020F04D005EB48130222C3F8082919F0B7
+S31508003AB8800F3DD108F101087F08002F3FF4E4AED6
+S31508003AC817F0010FF6D05FFA88FA51462068FFF713
+S31508003AD8DAF9814610F0010FC9D008F00F03012161
+S31508003AE801FA03F2D5F8343823EA0203C5F834385C
+S31508003AF805EB4813C3F8081923698B42B3D1C8EBF9
+S31508003B08C80304EB8303596C9A6C0A449A64B8F19F
+S31508003B18000FA8D1C8EBC80304EB83031B6D002B61
+S31508003B28A1D104F5717201212068FFF7D5F99AE742
+S31508003B3841462046FFF767FCBCE7D5F8043823F06A
+S31508003B480103C5F8043894F8F433012B08D0204645
+S31508003B5800F0FEFD2268536903F00043536199E6B5
+S31508003B68002184F8F4132046FFF74CFCF2E72046B8
+S31508003B7800F0D4FD9AE6204600F0D0FDB7E605F534
+S31508003B8800677B6823F001037B6010212068FEF735
+S31508003B9851FD20E005EB46134FF67F31C3F80819A7
+S31508003BA8D3F8002922F40012C3F80029D3F800290B
+S31508003BB842F00062C3F80029C3F8081BD3F8002BA3
+S31508003BC822F40012C3F8002BD3F8002B42F0006247
+S31508003BD8C3F8002B01366368B342DBD8FB6943F0A8
+S31508003BE80113FB61236BDBB1D7F8843043F00B0371
+S31508003BF8C7F884307B6C43F00B037B64D5F8003830
+S31508003C0823F4FE63C5F8003804F57172217C206830
+S31508003C18FFF762F92268536903F4805353616DE626
+S31508003C287A6942F22B0313437B613B6943F00B0322
+S31508003C383B61E3E72068FFF73FF92068FEF7ECFDEC
+S31508003C48E0602568FFF772FA0146227B2846FEF7E8
+S31508003C585BFC204600F048FD2268536903F40053CC
+S31508003C68536152E6204600F038FD2268536903F08E
+S31508003C780803536150E60021204600F078FD2268C3
+S31508003C88536903F4801353614DE60021204600F07A
+S31508003C9868FD2268536903F4001353614AE620460F
+S31508003CA800F06BFD2268536903F08043536148E6C8
+S31508003CB8204600F06CFD51E6026890F8BC33012BEB
+S31508003CC816D010B50446012380F8BC33836A012B45
+S31508003CD806D02068FFF7A2F8002084F8BC0310BDB8
+S31508003CE88369012BF5D0936B43F480339363F0E72C
+S31508003CF80220704790F8BC33012B0BD010B5044648
+S31508003D08012380F8BC330068FFF794F8002084F88C
+S31508003D18BC0310BD0220704790F8BC33012B0DD0A8
+S31508003D2810B50446012380F8BC3380F838100068BB
+S31508003D38FFF764F8002084F8BC0310BD022070471A
+S31508003D4838B505468C4611F0800F29D101F00F0EBB
+S31508003D58CEEBCE04A40004F5FC740444211DCEEB76
+S31508003D68CE0E00EB8E0E00208EF8FD010CF00F0C1F
+S31508003D7881F800C08A60CB704A780AB1A1F806C0F3
+S31508003D88022B1DD095F8BC33012B1CD0012385F8CE
+S31508003D98BC332868FEF750FD002085F8BC0338BDFB
+S31508003DA801F00F00C0EBC0018900383129440431FD
+S31508003DB8C0EBC00005EB8000012480F83D40D5E73C
+S31508003DC800230B71DEE70220E9E710B504460A4628
+S31508003DD811F0800F20D101F00F00C0EBC0039B0043
+S31508003DE803F5FC732344191DC0EBC00004EB8000DF
+S31508003DF8002380F8FD3102F00F020A7094F8BC33EC
+S31508003E08012B19D0012384F8BC332068FEF762FD1C
+S31508003E18002084F8BC0310BD01F00F00C0EBC003F6
+S31508003E289B0038332344191DC0EBC00004EB8000FF
+S31508003E38012380F83D30DEE70220ECE710B501F0F3
+S31508003E480F04C4EBC401890001F5FC71014404316F
+S31508003E58C4EBC40C00EB8C0CCCF80822CCF8103256
+S31508003E680023CCF814328CF8FD318CF8FC41036930
+S31508003E78012B06D064B9DAB20068FEF775FD002092
+S31508003E8810BDC4EBC40C00EB8C0CCCF80C22F1E783
+S31508003E98DAB20068FEF70EFEF1E701F00F01C1EB92
+S31508003EA8C10100EB8101D1F81402704710B501F081
+S31508003EB80F04C4EBC4018900383101440431C4EB4A
+S31508003EC8C40C00EB8C0CCCF84820CCF850300023F6
+S31508003ED8CCF8543001238CF83D308CF83C40036903
+S31508003EE8012B06D064B9DAB20068FEF73DFD00205A
+S31508003EF810BDC4EBC40C00EB8C0CCCF84C20F1E7D5
+S31508003F08DAB20068FEF7D6FDF1E738B501F00F0515
+S31508003F184268954239D804460B4611F0800F1FD1DE
+S31508003F28C1EBC101890001F5FC7101440431C3EBF9
+S31508003F38C30300EB8303002283F8FD2101238B705A
+S31508003F480D7094F8BC33012B21D0012384F8BC33B7
+S31508003F582068FEF7D8FE8DB1002084F8BC0338BD6A
+S31508003F68C5EBC5018900383101440431C5EBC503E1
+S31508003F7800EB8303012283F83D20DFE704F571721D
+S31508003F88217C2068FEF7A8FFE6E70120E7E702207C
+S31508003F98E5E701F00F034268934231D810B50446A5
+S31508003FA811F0800F1ED1C3EBC301890001F5FC711E
+S31508003FB801440431C3EBC30200EB8202002082F8F5
+S31508003FC8FD0100228A700B7094F8BC33012B19D0B6
+S31508003FD8012384F8BC332068FEF7C2FE002084F863
+S31508003FE8BC0310BDC3EBC301890038310144043151
+S31508003FF8C3EBC30200EB8202012082F83D00E0E72A
+S31508004008012070470220ECE712230B80004870470E
+S315080040185400002004230B800048704768000020DD
+S3150800402821230B8000487047300000200023934264
+S315080040381ED200B510E00CF1370C01F813C00001C8
+S315080040484FEA430C0CF1010C4FF0000E01F80CE096
+S315080040580133DBB2934209D24FEA107CB0F1204F04
+S31508004068E9D20CF1300C01F813C0E8E75DF804FB57
+S315080040787047000038B50B4BD3F80008D3F8044846
+S31508004088D3F80838C01800D138BD074D0822A91C2E
+S31508004098FFF7CCFF042205F112012046FFF7C6FFF9
+S315080040A8F2E700BF00E0F11F6C00002008B51A23EC
+S315080040B80B80FFF7DFFF014808BD00BF6C00002032
+S315080040C808B50A4628B905490548FCF789FC03488E
+S315080040D808BD02490248FCF783FCF8E7C801002036
+S315080040E8605D000810B50A46034C21460348FCF7EC
+S315080040F877FC204610BD00BFC8010020745D000883
+S3150800410808B50A4628B905490548FCF769FC03486D
+S3150800411808BD02490248FCF763FCF8E7C801002015
+S31508004128845D000808B50A4628B905490548FCF714
+S3150800413857FC034808BD02490248FCF751FCF8E752
+S31508004148C80100208C5D0008014B1880704700BF25
+S31508004158C803002008B500F04FFF0E4B1B689842AD
+S315080041680FD30D4B1B786BB90B4B01221A700B4BEF
+S3150800417880229A6100F040FF094B1B880344054AD0
+S31508004188136008BD044B00221A70044B4FF4000252
+S315080041989A61EFE7CC030020CA03002000040258FE
+S315080041A8C8030020024B4FF400029A61704700BF0B
+S315080041B80004025808B5054B1B6913F4005F03D1C0
+S315080041C8FFF7F0FF012008BD0020FCE700080258A9
+S315080041D808B56420FFF7B8FF08BD08B5FFF7BAFFAA
+S315080041E808BD70477047704708B5584A136823F0E2
+S315080041F80F0343F004031360136803F00F03042B3B
+S3150800420840F09E80524AD36823F0070343F002031E
+S31508004218D360936943F4404393614E4B1A6842F45A
+S3150800422880221A601A6842F480321A60494B1B6861
+S3150800423813F4003FFAD0474B9A6A22F0030242F079
+S3150800424802029A62DA6A42F48032DA62DA6A42F476
+S315080042580032DA62DA6A22F00C0242F00402DA6202
+S31508004268DA6A22F00202DA629A6A22F47C7242F068
+S3150800427840029A621A6B3849114040F2DF120A4323
+S315080042881A631A6B22F47E4242F400721A631A6B96
+S3150800429822F4FE0242F498121A631A6B22F0FE42BE
+S315080042A842F080721A631A6842F080721A60294BC3
+S315080042B81B6813F0007FFAD0264B9A6922F00F0282
+S315080042C842F008029A611A6922F0070242F00302CC
+S315080042D81A619A6922F470629A619A6922F00F0241
+S315080042E842F008029A61DA6922F0700242F0400246
+S315080042F8DA61DA6922F4E06242F48062DA619A697C
+S3150800430822F0700242F040029A611A6A22F070029C
+S3150800431842F040021A621149D1F8542422F00702E1
+S31508004328C1F854241A6D22F040521A655A6D22F4BF
+S31508004338401242F480125A650948FEF719FF08BD6B
+S315080043486721084800F0E4FA5CE700BF002000523D
+S31508004358004802580044025800FEFFFF0040025871
+S3150800436800389C1CA45D000808B5FCF76FFDFFF72C
+S315080043783BFF08BD08B5FFF7F7FF00F0D5FA00F0D0
+S31508004388E1FAFCE72DE9F0418EB0514CD4F8F43047
+S3150800439843F00203C4F8F430D4F8F43003F0020307
+S315080043A80793079BD4F8E03043F00103C4F8E030DC
+S315080043B8D4F8E03003F001030693069BD4F8E030FE
+S315080043C843F00203C4F8E030D4F8E03003F00203FF
+S315080043D80593059BD4F8E03043F00403C4F8E030AD
+S315080043E8D4F8E03003F004030493049BD4F8E030CF
+S315080043F843F00803C4F8E030D4F8E03003F00803C3
+S315080044080393039BD4F8E83043F48023C4F8E830D0
+S31508004418D4F8E83003F480230293029BD4F8EC30EE
+S3150800442843F48073C4F8EC30D4F8EC3003F48073A2
+S315080044380193019B802308930123099300250A9574
+S315080044480B950C95234F08A93846FDF759FE4FF4E6
+S315080044580053089309950C9508A91F48FDF750FEBF
+S315080044684FF44078CDF82080022609960A950B95D0
+S315080044780C9507230D9308A91848FDF741FECDF8B2
+S31508004488208009960A960B950C9509230D9308A979
+S315080044983846FDF735FE4FF4C053089309960323AB
+S315080044A80A930B950C950A230D9308A90C48FDF752
+S315080044B827FED4F8D83043F00063C4F8D830D4F8C7
+S315080044C8D83003F000630093009B0EB0BDE8F08176
+S315080044D8004402580004025800080258000C025802
+S315080044E80000025810B5FCF7F3FC214C4FF4000302
+S315080044F8A3612048FDF718FD1F48FDF715FD20465E
+S31508004508FDF712FD1D48FDF70FFD1D4BD3F8D82002
+S3150800451822F00062C3F8D820D3F8EC2022F480727F
+S31508004528C3F8EC20D3F8E82022F48022C3F8E82060
+S31508004538D3F8E02022F00802C3F8E020D3F8E020F8
+S3150800454822F00402C3F8E020D3F8E02022F00202A1
+S31508004558C3F8E020D3F8E02022F00102C3F8E020EF
+S31508004568D3F8F42022F00202C3F8F42010BD00BFE5
+S3150800457800040258000C02580008025800000258A5
+S3150800458800440258704700002023038000487047FB
+S31508004598C00000200A23038000487047E000002076
+S315080045A808B590F89C32032B01D0002008BD01F00D
+S315080045B8BFFAFAE708B501F0BBFA002008BD08B546
+S315080045C8084601F0E9FA002008BD000008B50B788E
+S315080045D813F060030CD0402B11D14B78012B0ED168
+S315080045E88B88072B0BD19E221449FBF79AFE06E007
+S315080045F84B780A2B14D00B2B17D0062B01D000208A
+S3150800460808BD4B881B0A212B04D00D491722FBF736
+S3150800461888FEF4E7CA88172A28BF17220949F6E741
+S3150800462801220949FBF77DFEE9E78B7813B9064AA3
+S315080046381360E4E7FBF7D0FEE1E700BFEC000020D3
+S31508004648C9000020D20000201004002010B5044636
+S31508004658812100F02DF90121204600F029F90020D2
+S3150800466810BD000010B5044640230222812100F03F
+S3150800467814F9402302220121204600F00EF94023AE
+S31508004688034A0121204600F03BF9002010BD00BF6F
+S31508004698D003002000487047D003002008B500F56D
+S315080046A87171D0F80404FCF700FA08BD08B5C1EB27
+S315080046B8C10300EB8303D3F80822D0F80404FCF7F7
+S315080046C821FA08BD08B5C1EBC10300EB83039A6C50
+S315080046D8D0F80404FCF75CFA08BD08B5D0F8040459
+S315080046E8FCF7FEFA08BD000010B50446C3684BB1CE
+S315080046F8022B01D1012106E09121074800F008F9AB
+S31508004708012100E00021D4F80404FCF7D2FAD4F811
+S315080047180404FCF7A6FA10BDAC5D000810B50446FB
+S31508004728D0F80404FCF7C8FA2268D2F8003E43F029
+S315080047380103C2F8003E236A23B1044A136943F009
+S3150800474806031361FFF74EFD10BD00BF00ED00E03C
+S3150800475810B50446FFF747FDD4F80404FCF7B5FA84
+S3150800476810BD08B5D0F80404FCF7CAFA08BD08B5A0
+S31508004778D0F80404FCF7C2FA08BD10B504460120AF
+S31508004788FFF72FFDD4F80404FCF7BCFA10BD10B5E2
+S3150800479804460020FFF725FDD4F80404FCF7B4FA0C
+S315080047A810BD000002780AB10020704710B503460C
+S315080047B81748C0F80434C3F8C002164B0360092327
+S315080047C843600222C2600023036182610122C2613A
+S315080047D8036243628362C3620363FEF77DFE80B9A0
+S315080047E80B4C80212046FEF7F5FD40220021204685
+S315080047F8FEF7CAFD802201212046FEF7C5FD0020E6
+S3150800480810BD4FF49371044800F082F8E8E700BF3A
+S315080048181404002000000840AC5D0008D0F8C03237
+S3150800482811F0800F08D101F07F01C1EBC10103EB3C
+S31508004838810191F8FE01704701F07F01C1EBC101C2
+S3150800484803EB810191F83E00704708B5D0F8C0021D
+S31508004858FFF723FB08BD022805D8DFE800F00504A2
+S315080048680200012070470220704708B5D0F8C00238
+S31508004878FEF712FFFFF7EFFF08BD08B5D0F8C0022C
+S31508004888FEF7C9FEFFF7E7FF08BD08B5D0F8C0026E
+S31508004898FEF7E2FEFFF7DFFF08BD08B594461A469D
+S315080048A86346D0F8C002FFF74BFAFFF7D4FF08BDF6
+S315080048B808B5D0F8C002FFF788FAFFF7CCFF08BD9D
+S315080048C808B5D0F8C002FFF720FBFFF7C4FF08BDFC
+S315080048D808B5D0F8C002FFF75CFBFFF7BCFF08BDB8
+S315080048E808B5D0F8C002FFF717FAFFF7B4FF08BDF6
+S315080048F808B5D0F8C002FFF7D9FAFFF7ACFF08BD2C
+S3150800490808B5D0F8C002FFF799FAFFF7A4FF08BD63
+S3150800491808B500F005F8FCE708B5FFF759FC08BD27
+S3150800492808B5FFF75AFC08BD08B500F03BFFFFF7C6
+S31508004938F3FF00F041FB01F05BF900F057F800F0CF
+S3150800494849F808BD08B5FFF7EBFF00F047FB00F08C
+S3150800495861F800F001F808BD08B500F0DFF801288D
+S3150800496803D00B4B1B78012B00D008BD00F044FB85
+S31508004978084B1B68084A1268134403F5FA739842E9
+S31508004988F3D3034B00221A7000F010FFEDE700BFBF
+S31508004998200800201C08002024080020014B186065
+S315080049A8704700BF1C080020014B1868704700BFF5
+S315080049B81C08002008B5054B1B78012B00D008BD3C
+S315080049C800F01AFB024B1860F9E700BF2008002020
+S315080049D82408002008B5044B01221A70FFF7EAFFDD
+S315080049E8FFF7BAFF08BD00BF2008002010B500F081
+S315080049F847FA00F0F7FB064C0123237000F02CFB5E
+S31508004A080023237000F0C8FF0223237010BD00BFDF
+S31508004A188A01002000B583B00DF10701184800F097
+S31508004A2875FC012810D00DF10701154800F050FB58
+S31508004A38012812D00DF10701114801F02DF80128B7
+S31508004A4814D003B05DF804FB0E4B01221A709DF8CA
+S31508004A5807100B4800F036FAE5E70A4B00221A70E9
+S31508004A689DF80710064800F02DFAE3E7054B0222E1
+S31508004A781A709DF80710024800F024FAE1E700BF0B
+S31508004A88280800208A01002008B500F0CBFF08BDD9
+S31508004A9838B504460D460E4B1B78012B09D00C4B2E
+S31508004AA81B7853B10A4B1B78022B0BD000F002FA7D
+S31508004AB838BDC9B200F0F8FBF1E7E9B2204600F0C4
+S31508004AC8EBFAEFE7E9B2204600F0BCFFEEE700BFD5
+S31508004AD88A010020074B1B78022B07D0032B07D027
+S31508004AE8012B01D081207047082070473F20704766
+S31508004AF8002070478A010020074B1B78022B07D035
+S31508004B08032B07D0012B01D0812070470820704756
+S31508004B183F207047002070478A01002008B500F03A
+S31508004B28C1F900B1012008BD024B002283F8822092
+S31508004B38704700BFAC080020034BFE221A70587055
+S31508004B480222A3F886207047AC080020037842782A
+S31508004B5843EA0223827843EA0243C07843EA0060BC
+S31508004B6870470870C0F307234B70C0F307438B7070
+S31508004B78000EC8707047000010B5064C002384F86C
+S31508004B888130FFF7D1FFFF2323700123A4F886306D
+S31508004B9810BD00BFAC080020074BFF221A70002280
+S31508004BA85A7093F882109970DA701A715A71062237
+S31508004BB8A3F88620704700BFAC08002008B5002077
+S31508004BC8FFF7BAFF08BD000010B5094CFF2323708C
+S31508004BD8084BC4F8883000236370A370E370211D5E
+S31508004BE80720FFF7BEFF0823A4F8863010BD00BFCC
+S31508004BF8AC080020B85D000810B5064CFF232370E2
+S31508004C080430FFF7A3FFC4F888000123A4F8863008
+S31508004C1810BD00BFAC08002008B53120FFF78CFF8F
+S31508004C2808BD000038B5084CFF23237000256570B9
+S31508004C38A570FFF74FFFE07025716571A571072309
+S31508004C48A4F8863038BD00BFAC08002038B5FFF791
+S31508004C586BFF0F4C012584F88150FF23237000232E
+S31508004C68637010226270A370FFF734FFE070FFF7D5
+S31508004C7843FF2071FFF740FFC0F307206071A57155
+S31508004C88E5710823A4F8863000F0B2FF38BD00BFE6
+S31508004C98AC08002038B50446FFF71CFF6278904236
+S31508004CA812D90B4DD5F88810681C00F09FFDFF2314
+S31508004CB82B706278D5F888301344C5F8883063783D
+S31508004CC80133A5F8863038BD2220FFF735FFFAE705
+S31508004CD8AC08002038B50446FFF7FCFE637898420E
+S31508004CE817D9201DFFF732FF01460C4DC5F8880075
+S31508004CF86278681C00F07AFDFF232B706278D5F875
+S31508004D0888301344C5F8883063780133A5F88630A7
+S31508004D1838BD2220FFF710FFFAE700BFAC080020CD
+S31508004D28F8B505461746002406E015F8013B1C4465
+S31508004D38E4B2FFF7F5FD31464E1E0029F5D13C6071
+S31508004D480120F8BD30B583B0002501950B4CFF232B
+S31508004D5823700430FFF7FAFE014601AAD4F8880042
+S31508004D68FFF7DEFF6070211D0198FFF7FAFEA570B0
+S31508004D78E5700823A4F8863003B030BDAC080020D7
+S31508004D8838B504460E4BD3F88850FFF7A3FE621CC5
+S31508004D98411E284600F030FF70B1094CFF232370E6
+S31508004DA8FFF798FE0138D4F888300344C4F88830E9
+S31508004DB80123A4F8863038BD3120FFF7BDFEFAE78F
+S31508004DC8AC08002010B50446FFF784FE013863785E
+S31508004DD8984216DD134BFF221A700122A3F8862083
+S31508004DE8617891B1A21C0F4BD3F8880000F004FF34
+S31508004DF898B161780B4AD2F888300B44C2F88830E3
+S31508004E0810BD2220FFF798FEFAE700F005FF0028F4
+S31508004E18F6D13120FFF790FEF2E73120FFF78CFE36
+S31508004E28EEE700BFAC08002010B50B4BD3F8884056
+S31508004E380430FFF78BFE0146204600F0E1FE30B14C
+S31508004E48054BFF221A700122A3F8862010BD3120CF
+S31508004E58FFF772FEFAE700BFAC08002008B500F0B5
+S31508004E68A5FC034BFF221A700122A3F8862008BD69
+S31508004E78AC08002008B589B2FFF70AFE08BD00008D
+S31508004E88074B002283F88120C3F8882083F88420FA
+S31508004E98A3F8862083F8832083F88220704700BF0A
+S31508004EA8AC080020024B93F8810000B10120704736
+S31508004EB8AC080020024B002283F88420704700BF04
+S31508004EC8AC08002008B50378FF2B24D0354A92F899
+S31508004ED88120012A2BD1C93B352B53D8DFE803F0AB
+S31508004EE84052524F52524C434946525252525252CB
+S31508004EF8525252525252525252525252525252527C
+S31508004F0852525252525252525252312B282E525201
+S31508004F18523452373A3DFFF799FE224B93F88430BC
+S31508004F28012B33D01F4BB3F98610002932DC08BD94
+S31508004F38FFF7B0FEF1E7FFF7CDFEEEE7FFF75CFEF9
+S31508004F48EBE7FFF7FFFEE8E7FFF73EFEE5E7FFF7C3
+S31508004F5835FEE2E7FFF720FEDFE7FFF70DFEDCE7A1
+S31508004F68FFF70EFFD9E7FFF72DFFD6E7FFF75AFE3B
+S31508004F78D3E7FFF759FFD0E7FFF770FFCDE7FFF74D
+S31508004F884BFECAE72020FFF7D7FDC6E71020FFF734
+S31508004F98D3FDC7E71846012380F88430FFF76AFF70
+S31508004FA8C5E700BFAC0800204FF0E02300221A61CD
+S31508004FB85A619A617047000008B5FFF7F5FF4FF088
+S31508004FC8E023044A5A6100229A6105211961024BB5
+S31508004FD81A6008BDFF520700380900204FF0E02381
+S31508004FE81B6913F4803F03D0024A13680133136020
+S31508004FF8704700BF3809002008B5FFF7EFFF014BD7
+S31508005008186808BD3809002008B5FFF7F5FF08BD78
+S31508005018054BDB6913F0200F04D0034B5B6A03705A
+S3150800502801207047002070470048004010B5094B1A
+S315080050389862FFF7E1FF00F10A04064BDB6913F0F3
+S31508005048800F05D1FFF76CFCFFF7D6FFA042F4D90D
+S3150800505810BD00BF0048004010B588B00D4C236845
+S3150800506823F001032360002300934FF46142019261
+S315080050780293039304930C220592069307936946B1
+S315080050882046FEF77BF8236843F00103236008B03F
+S3150800509810BD00BF0048004070B506460D46812978
+S315080050A804D82846FFF7C2FF00240BE084210748E6
+S315080050B8FFF72EFCF5E7FFF733FC305DFFF7B6FF81
+S315080050C80134A4B2ABB2A342F5D870BDC05D0008DE
+S315080050D870B5254B1C78BCB92448FFF799FF0128F9
+S315080050E801D0204670BD214B1B78013BDBB2802BD3
+S315080050F8F7D8FFF781FF1E4B18601E4B00221A705F
+S31508005108194B01221A70ECE706460D46194B1B780F
+S31508005118013316481844FFF77BFF0446012815D1C2
+S31508005128144B1A780132D2B21A70104B1B789A426D
+S3150800513801D00024D5E71049304600F057FB0A4B42
+S3150800514800221A700B4B1B782B70CAE7FFF754FF1F
+S31508005158074B1B68C833984203D90024024B1C70B6
+S31508005168BFE70024BDE700BFBE0900203C090020B0
+S31508005178C0090020BF0900203D09002070B5174D59
+S315080051882C6D24F040542C654FF0000C03E00CF10C
+S31508005198010C5FFA8CFCBCF1110F1DD8104C14F8E1
+S315080051A81C5004EB4C046678AC1904FB00044FF455
+S315080051B8FA5EBEFBF4FE04FB0EFEBEF5FA5FE6D108
+S315080051C8BEFBF4F40C80013CA4B2B4F5007FDED231
+S315080051D815701E70012000E0002070BD00440258BA
+S315080051E8105E000870B58CB00023ADF82E308DF827
+S315080051F82D308DF82C300BAB0DF12D020DF12E014B
+S315080052084FF4FA70FFF7BAFF002842D0234C244B14
+S3150800521823600025A560E560012626746574A574D3
+S31508005228BDF82E306361A6619DF82D30E3619DF8BF
+S315080052382C3023626662A662E66226636563A66305
+S31508005248E563266404236364A564E36425656365E6
+S31508005258A565E66525666566A3662046FCF762FACF
+S31508005268039504950596069640F26763079308938F
+S31508005278099503A92046FCF79FFB009633460222A8
+S3150800528811462046FCF7DCFB2046FCF7F4FB0CB07D
+S3150800529870BDB8210348FFF73BFBB7E7C4090020F0
+S315080052A800A00040E85D000810B58AB0024640F242
+S315080052B8E173019300230293039309040491059368
+S315080052C806930793089352230993012301A90E48C5
+S315080052D8FCF7EBFB08B10AB010BD01210A48FCF738
+S315080052E81DFC0028F7D1FFF787FE00F132040121DB
+S315080052F80548FCF7FFFC0028EDD0FFF711FBFFF780
+S315080053087BFEA042F3D9E6E7C409002030B58BB086
+S3150800531804460D4640210E48FCF7F3FC10B9002058
+S315080053280BB030BD23466A4640210948FCF708FCFD
+S3150800533860B9009A40F267639A42F1D1019B002B43
+S31508005348EED19DF80E302B700120E9E70020E7E73B
+S31508005358C409002038B50546002401E00134E4B242
+S315080053680E2C12D8FFF7DCFA04EB4403084A52F865
+S315080053782330AB42F2D804EB4402054901EB82021A
+S3150800538852681344AB42E9D900E0FF24204638BDE9
+S315080053985C5E000808B5C1F3090363B903688B4264
+S315080053A801D1012008E040F8041B4FF4806200F0A0
+S315080053B81DFA012000E0002008BD2DE9F041074646
+S315080053C80068FFF7C7FFFF2804D14FF000084046DA
+S315080053D8BDE8F081FCF712FF00264FF0010804E04B
+S315080053E8E046B8F1000F1ED001361F2E1BD83C68C0
+S315080053F804EB461407EB46150435FFF791FA2A46D7
+S3150800540821460120FCF7C2FF844650B903461F2BE4
+S31508005418E7D8195DEA5CD2B29142E1D10133DBB231
+S31508005428F5E74FF00008FCF717FFD0E770B50D460B
+S315080054380E4B984212D004460D4B994209D10B4E91
+S31508005448344626B129462046FFF7A4FF58B1304608
+S3150800545870BDFFF7B2FF20B12646F2E7054E34467F
+S31508005468EFE70026EDE70026F1E700BF680E002003
+S3150800547800000208640A00202DE9F84306460C468F
+S3150800548817461D46DFF8848001EA08080368B3F161
+S31508005498FF3F0AD0336843450ED14FF00109B9F1E9
+S315080054A8010F12D04846BDE8F8834146FFF772FF58
+S315080054B881460028F3D0EDE741463046FFF7B6FFA8
+S315080054C80646E8B14FF00109E9E73168641A344439
+S315080054D8043405E017F8013B04F8013B013DE1D027
+S315080054E8FFF71EFA311D611AB1F5806FF2D308F578
+S315080054F880613046FFF79AFF064620B1041DE9E7A2
+S315080055084FF00009CEE74FF00009CBE700FCFFFF94
+S3150800551870B5144B00EB400253F8225003EB820097
+S31508005528466815F0030F02D116F0030F04D040F2AF
+S315080055382B310D48FFF7ECF9002405E02B68B3F189
+S31508005548FF3F0CD104350134B4EB960F05D214F09D
+S31508005558FF0FF3D1FFF7E4F9F0E7012070BD00204B
+S31508005568FCE700BF5C5E0008345E0008F0B587B04B
+S3150800557804460D4600230093884203D80E2939D8D5
+S31508005588012600E00026012E02D0304607B0F0BDFD
+S31508005598FCF734FE01E00134E4B2AC4227D82046D1
+S315080055A8FFF7B6FF07460028F5D1FFF7B9F9124BFA
+S315080055B804EB440203EB820153F822204B68002BC4
+S315080055C818BFB2F1FF3F11D000230193202305939A
+S315080055D84A7A02920B7A039301230493694601A82F
+S315080055E8FCF70CFC0028D6D03E4600E03E46FCF701
+S315080055F833FECAE70026C8E75C5E00084FF0FF33AB
+S31508005608024A1360024A1360704700BF640A002002
+S31508005618680E002070B504460D4616460139154B26
+S315080056281B1A994203D9002001280ED070BDFFF72E
+S3150800563891FEFF2801D10020F8E728190138FFF75D
+S3150800564889FEFF2814D00120EEE70B4B23400B4AAE
+S31508005658934206D02B46324621460948FFF70CFFE7
+S31508005668E4E72B46324621460648FFF705FFDDE7FD
+S315080056780020DBE7FFFF1F0800FCFFFF0000020809
+S31508005688640A0020680E002070B54A1E0F4B1B1AC4
+S315080056989A4205D9FF210E460020012812D070BD6E
+S315080056A805460C46FFF756FE06462C44601EFFF7CD
+S315080056B851FE0146FF2818BFFF2E01D00120ECE74E
+S315080056C80020EAE73046FFF751FFE8E7FFFF1F0823
+S315080056D800B583B000230193134B1B68B3F1FF3F52
+S315080056E803D1012003B05DF804FB0F4A5368019300
+S315080056F891680B440193D1680B44019311690B44D3
+S31508005708019351690B44019391690B440193D2693A
+S3150800571813440193DB4301930133019301AA04213E
+S315080057280248FFF777FFDDE7680E002098020208AF
+S315080057380A4B1A68596811449A681144DA68114478
+S315080057481A6911445A6911449A690A44D3F898326D
+S31508005758D34201D101207047002070470000020893
+S3150800576808B50C4B1B68B3F1FF3F06D10A4B1B68FB
+S31508005778B3F1FF3F07D1012008BD0648FFF71DFE14
+S315080057880028F9D0F2E70448FFF717FE0028F3D0F7
+S315080057980120F1E7680E0020640A002000487047D7
+S315080057A80000020808B500F03FFA08BD10B500F079
+S315080057B82BFA00B910BDFEF7FDFC0028FAD0FFF752
+S315080057C863F9FBF7EBFAFFF7EFFB00F021FA054B55
+S315080057D80340054A936000F01BFA446800F026FA6D
+S315080057E8A047E7E780FFFF1F00ED00E070B50D460C
+S315080057F8044606E015F8013B04F8013BFFF790F864
+S315080058083246531E9EB2002AF4D170BD094B03F1E5
+S315080058181801002232B19A7400225A61064B054AC9
+S315080058281A6070479A745961183318310132D2B21E
+S31508005838F0E700BFAC120020DC1200200A4B1B68F8
+S3150800584883B110B4084A5C69146019749860D86002
+S3150800585800225A741860013908445860987C5DF823
+S31508005868044B7047FF207047DC12002038B5044601
+S315080058780D46012824D804EB4403164A02EBC30351
+S315080058885A7C1B7C9A4221D004EB4403114A02EB4A
+S31508005898C303DA6815705A7C01325A74DA68013219
+S315080058A8DA605B689A4213D90A4B04EB440253F848
+S315080058B8322004EB440403EBC404E260012008E048
+S315080058C84FF4E1710448FFF723F8D4E7002000E015
+S315080058D8012038BDAC120020105F000808B5014643
+S315080058E8024B1878FFF7C2FF08BD00BFE012002078
+S315080058F838B504460D46012822D804EB4403144A51
+S3150800590802EBC303587C10B304EB440302EBC3034E
+S315080059189A6812782A705A7C013A5A749A68013237
+S315080059289A605B689A4211D9094B04EB440253F80A
+S31508005938322004EB440403EBC404A260012006E009
+S315080059484FF4F2710348FEF7E3FFD6E7012038BDA6
+S31508005958AC120020105F000808B50146024B1878FB
+S31508005968FFF7C6FF08BD00BF2413002010B504467C
+S31508005978012806D804EB4404054800EBC404607CF7
+S3150800598810BD4FF401710348FEF7C2FFF2E700BFE6
+S31508005998AC120020105F000838B5FFF737FF1B4C1C
+S315080059A84021601CFFF74AFF2070194D4021681CEA
+S315080059B8FFF744FF28702378FF2B1DD0FF281BD03C
+S315080059C8144C002214492046FBF727F813492046A9
+S315080059D8FBF74CF80120FEF704FC2046FBF74DF8C8
+S315080059E8FCF704FCD4F8C002FEF766F9FEF7DCFFFC
+S315080059F8B0F5FA6F05D338BD84210948FEF788FF44
+S31508005A08DEE74FF4FA60FEF7C9FFF4E7E012002074
+S31508005A1824130020681300201000002088000020A6
+S31508005A28105F000810B5064CD4F8C002FEF762F9F4
+S31508005A382046FBF709F80020FEF7D3FB10BD00BF88
+S31508005A486813002070B506460D463F2906D828462D
+S31508005A58FFF744FF012806D100240BE0BB210D48B7
+S31508005A68FEF756FFF3E7BF210A48FEF751FFF3E7AB
+S31508005A780134A4B2ABB2A3420BD9FEF751FF305D8D
+S31508005A88FFF72CFF0128F3D0C8210248FEF740FF8C
+S31508005A98EEE770BD105F000870B506460D461F4B49
+S31508005AA8D3F8C002FDF7ACFE1D4B1C789CB91D48FF
+S31508005AB8FFF752FF012801D0204670BD194B1B7805
+S31508005AC8013BDBB23E2BF7D8154B01221A70164B51
+S31508005AD800221A70F0E7144B1B7801331148184452
+S31508005AE8FFF73AFF0446012801D00024E4E70E4BE5
+S31508005AF81A780132D2B21A700A4B1B789A4201D028
+S31508005B080024D9E709493046FFF770FE044B0022FE
+S31508005B181A70054B1B782B70CEE700BF6813002058
+S31508005B286C1600202C1600206D1600202D16002055
+S31508005B3830B583B0144B1878FFF718FF08B3054635
+S31508005B48402800D94025002405E09DF807200F4B7A
+S31508005B581A550134E4B2A5420DD90DF107010A4BCD
+S31508005B681878FFF7C5FE0128EFD04FF4A471084846
+S31508005B78FEF7CEFEE9E7ABB2044A81210548FEF7EF
+S31508005B88B7FE03B030BD00BFE01200206C1200203B
+S31508005B98105F00086813002070B50446FEF77AFD02
+S31508005BA8064621460F48FEF750FE85B2002401E056
+S31508005BB80134A4B2AC420CD2315D0B4B1878FFF70E
+S31508005BC855FE0128F4D04FF4B5710848FEF7A0FE33
+S31508005BD8EEE7FEF75FFD0246402301210148FEF77E
+S31508005BE88FFE70BD6813002024130020105F00087C
+S31508005BF808B5FFF703FD08BD08B5FFF70BFD08BD97
+S31508005C0808B5FFF741FD08BD08B5FFF791FD08BDC2
+S31508005C1808B5FFF7C3FD08BD08B5FFF759FD00B974
+S31508005C2808BDFFF79DFDFBE772B6704762B6704779
+S31508005C3870B50D4D0D4C641BA4100026A64209D15B
+S31508005C480B4D0C4C00F026F8641BA4100026A6423F
+S31508005C5805D170BD55F8043B98470136EEE755F867
+S31508005C68043B98470136F2E7385F0008385F0008B2
+S31508005C78385F00083C5F00080A44914200F1FF3388
+S31508005C8800D1704710B511F8014B03F8014F91423E
+S31508005C98F9D110BDF8B500BFF8BC08BC9E467047D8
+S31108005CA8F8B500BFF8BC08BC9E46704763
+S31508005CB400000000000000000000000000000000D2
+S31508005CC400000000010000000200000003000000BC
+S31508005CD404000000000000000500000000000000A9
+S31508005CE4000000000000000006000000000000009C
+S31508005CF4000000000000000007000000000000008B
+S31508005D04010203040102030406070809000000004F
+S31508005D140102030401020304060708090001020339
+S31508005D2404050607080C101418203040010000006A
+S31508005D34020000000400000006000000080000003D
+S31508005D440A0000000C0000001000000020000000FB
+S31508005D5440000000800000000001000057696E55ED
+S31508005D6453422042756C6B2044657669636500006E
+S31508005D744F70656E424C54205573657200000000DE
+S31508005D8444656661756C740057696E5553422042C2
+S31508005D94756C6B20496E74657266616365000000F4
+S31508005DA46D61696E2E630000757362645F636F6E5E
+S31508005DB4662E63004F70656E424C54002E2E2F2EAD
+S31508005DC42E2F2E2E2F536F757263652F41524D4316
+S31508005DD44D375F53544D333248372F72733233324B
+S31508005DE42E6300002E2E2F2E2E2F2E2E2F536F7538
+S31508005DF47263652F41524D434D375F53544D3332C9
+S31508005E0448372F63616E2E63000000000502060200
+S31508005E14060307030803090309040A040B040C040C
+S31508005E240C050D050E050F050F06100610071008BC
+S31508005E342E2E2F2E2E2F2E2E2F536F757263652F0F
+S31508005E4441524D434D375F53544D333248372F66CD
+S31508005E546C6173682E6300000000020800000200EB
+S31508005E64010100000000040800000200020100000D
+S31508005E7400000608000002000301000000000808EC
+S31508005E84000002000401000000000A0800000200E5
+S31508005E940501000000000C080000020006010000CD
+S31508005EA400000E08000002000701000000001008A8
+S31508005EB400000200000200000000120800000200B0
+S31508005EC4010200000000140800000200020200009B
+S31508005ED4000016080000020003020000000018086B
+S31508005EE4000002000402000000001A080000020074
+S31508005EF40502000000001C0800000200060200005B
+S31508005F0400001E0800000200070200002E2E2F2E95
+S31508005F142E2F2E2E2F536F757263652F41524D43C4
+S31508005F244D375F53544D333248372F7573622E639A
+S30908005F34000000005B
+S30908005F38BD02000890
+S30908005F3C99020008B0
+S31508005F400090D0030090D00301000000100000006C
+S31508005F50114000081D400008ED400008C94000082F
+S31508005F60B5400008094100082D41000829400008ED
+S31508005F70050F2100011C100500DF60DDD88945C723
+S31508005F804C9CD2659D9E648A9F000003069E000174
+S31508005F90000000001201010200000040501DAC6024
+S31508005FA00001010203010000040309041A030000AA
+S31508005FB000000000000000000000000000000000D3
+S31508005FC000000000000000006D4600085546000865
+S31508005FD0D54500080000000000000000BD45000887
+S31508005FE0C7450008A9450008000000000000000099
+S31508005FF00000000091450008000000009D450008CB
+S3150800600009022000010100C0320904000002FF0055
+S315080060100000070581024000FF070501024000FF56
+S315080060200A06100100000040010000000A000000F6
+S31508006030000003069E001400030057494E555342BC
+S3150800604000000000000000000000800004000100BD
+S315080060502800440065007600690063006500490071
+S315080060606E007400650072006600610063006500DA
+S31508006070470055004900440000004E007B003800E8
+S3150800608030003700390039003900430033002D004D
+S3150800609045003400450030002D003400300045002E
+S315080060A041002D0038003100380038002D0034003A
+S315080060B0380045003800350032004200350034000B
+S311080060C04600320042007D00000004008B
+S705080002D917
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_conf.h
index cee15fdcd..7a48424b8 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.c
index 464ac5cc0..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,9 +69,12 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
+#define USB_SIZ_BOS_DESC 0x21
+
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
@@ -121,6 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#if (USBD_WINUSB_ENABLED == 1)
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#endif
/**
* @}
@@ -140,6 +147,9 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
+#if (USBD_WINUSB_ENABLED == 1)
+, USBD_FS_USR_BOSDescriptor
+#endif /* (USBD_LPM_ENABLED == 1) */
};
#if defined ( __ICCARM__ ) /* IAR Compiler */
@@ -150,7 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
+#else
0x00, /*bcdUSB */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -160,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -169,6 +184,37 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
};
/* USB_DeviceDescriptor */
+/** BOS descriptor. */
+#if (USBD_WINUSB_ENABLED == 1)
+#if defined ( __ICCARM__ ) /* IAR Compiler */
+ #pragma data_alignment=4
+#endif /* defined ( __ICCARM__ ) */
+__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
+{
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -331,6 +377,21 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
+#if (USBD_WINUSB_ENABLED == 1)
+/**
+ * @brief Return the BOS descriptor
+ * @param speed : Current device speed
+ * @param length : Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ UNUSED(speed);
+ *length = sizeof(USBD_FS_BOSDesc);
+ return (uint8_t*)USBD_FS_BOSDesc;
+}
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
/**
* @brief Create the serial number string descriptor
* @param None
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_GCC/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/bin/openblt_stm32h743.srec b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/bin/openblt_stm32h743.srec
index 69951cbf7..dd21b0907 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/bin/openblt_stm32h743.srec
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/bin/openblt_stm32h743.srec
@@ -1,46 +1,46 @@
S01900006F70656E626C745F73746D3332683734332E73726563F9
-S31508000000C8180020C9720008E9720008ED720008D5
-S31508000010F1720008F5720008F97200080000000085
-S31508000020000000000000000000000000FD7200084B
-S315080000300173000800000000057300080973000832
-S315080000400D7300081173000815730008197300086A
-S315080000501D7300082173000825730008297300081A
-S315080000602D730008317300083573000839730008CA
-S315080000703D7300084173000845730008497300087A
-S315080000804D7300085173000855730008597300082A
-S315080000905D730008617300086573000869730008DA
-S315080000A06D7300087173000875730008797300088A
-S315080000B07D7300088173000885730008897300083A
-S315080000C08D730008917300089573000899730008EA
-S315080000D09D730008A1730008A5730008A97300089A
-S315080000E0AD730008B173000800000000B57300087E
-S315080000F0B9730008BD730008C1730008C57300080A
-S31508000100C9730008CD730008D1730008D5730008B9
-S31508000110D9730008DD730008E1730008E573000869
-S31508000120E9730008ED730008F1730008F573000819
-S31508000130F9730008FD7300080174000805740008C7
+S31508000000501A0020E57400080575000809750008EF
+S315080000100D75000811750008157500080000000028
+S31508000020000000000000000000000000197500082C
+S315080000301D7500080000000021750008BD6700084E
+S3150800004025750008297500082D7500083175000802
+S3150800005035750008397500083D75000841750008B2
+S3150800006045750008497500084D7500085175000862
+S3150800007055750008597500085D7500086175000812
+S3150800008065750008697500086D75000871750008C2
+S3150800009075750008797500087D7500088175000872
+S315080000A085750008897500088D7500089175000822
+S315080000B095750008997500089D750008A1750008D2
+S315080000C0A5750008A9750008AD750008B175000882
+S315080000D0B5750008B9750008BD750008C175000832
+S315080000E0C5750008C975000800000000CD75000830
+S315080000F0D1750008D5750008D9750008DD750008A2
+S31508000100E1750008E5750008E9750008ED75000851
+S31508000110F1750008F5750008F9750008FD75000801
+S315080001200176000805760008097600080D760008AD
+S315080001301176000815760008197600081D7600085D
S3150800014000000000000000000000000000000000A1
-S31508000150097400080D740008117400081574000865
-S31508000160197400081D740008217400082574000815
-S31508000170297400082D740008317400080000000076
-S3150800018035740008397400083D7400084174000885
-S3150800019045740008497400084D7400085174000835
-S315080001A055740008597400085D74000861740008E5
-S315080001B065740008697400086D7400087174000895
-S315080001C075740008797400087D7400088174000845
-S315080001D085740008897400088D74000891740008F5
-S315080001E095740008997400089D740008A1740008A5
-S315080001F0A5740008A9740008AD740008B174000855
-S31508000200B5740008B9740008BD740008C174000804
-S31508000210C5740008C9740008CD740008D1740008B4
-S31508000220D5740008D9740008DD74000800000000C1
-S31508000230E1740008E574000800000000E97400088D
-S31508000240ED740008F1740008F5740008F9740008E4
-S31508000250FD74000801750008057500080975000891
-S315080002600D75000811750008157500081975000840
-S315080002701D75000821750008257500080000000096
-S31508000280297500082D750008317500080000000062
-S3150800029000000000357500080EB418B5040008986B
+S315080001502176000825760008297600082D760008FD
+S315080001603176000835760008397600083D760008AD
+S315080001704176000845760008497600080000000028
+S315080001804D7600085176000855760008597600081D
+S315080001905D760008617600086576000869760008CD
+S315080001A06D7600087176000875760008797600087D
+S315080001B07D7600088176000885760008897600082D
+S315080001C08D760008917600089576000899760008DD
+S315080001D09D760008A1760008A5760008A97600088D
+S315080001E0AD760008B1760008B5760008B97600083D
+S315080001F0BD760008C1760008C5760008C9760008ED
+S31508000200CD760008D1760008D5760008D97600089C
+S31508000210DD760008E1760008E5760008E97600084C
+S31508000220ED760008F1760008F57600080000000073
+S31508000230F9760008FD76000800000000017700083E
+S3150800024005770008097700080D7700081177000878
+S3150800025015770008197700081D7700082177000828
+S3150800026025770008297700082D77000831770008D8
+S3150800027035770008397700083D7700080000000048
+S315080002804177000845770008497700080000000014
+S31508000290000000004D7700080EB418B50400089851
S315080002A0012817D1A06B30F48030A063E168DFF82D
S315080002B0A4080140E160E06830F44010E0600F985F
S315080002C0012803D1E06850F48010E060200000F0B7
@@ -276,13 +276,13 @@ S31508001110032000E00020704700383C80410D0300A2
S31508001120007833EC0078F3EF0000F81F0B30544FCB
S3150800113038B5040000F044F8050014F1010F02D098
S3150800114004480078241800F03BF8401BA042FAD364
-S3150800115031BD00BFC100002080B500F00DF813486E
+S3150800115031BD00BF8901002080B500F00DF81348A5
S3150800116013490860002013490860052012490860E1
S3150800117000201249086001BD00200F4908600020C0
S315080011800B49086000200B49086070470A48006848
S31508001190C00304D509480068401C08490860704720
S315080011A080B5FFF7F3FF0548006802BDFF52070048
-S315080011B014E000E018E000E010E000E0AC140020C5
+S315080011B014E000E018E000E010E000E03816002037
S315080011C080B5FFF7EDFF02BD38B58AB00400002CE4
S315080011D001D10120CCE0256894F8BD03002805D18B
S315080011E0002084F8BC03200000F082FE032084F867
@@ -542,7 +542,7 @@ S315080021B01149C8620020104908630F48FFF704F860
S315080021C0002804D04FF49371094800F0D6FB80210B
S315080021D00948FFF71FFF402200210748FFF7EAFEDC
S315080021E0802201210448FFF7E5FE002002BD000019
-S315080021F0506F000810ED00E0C40000200000084001
+S315080021F0B470000810ED00E08C01002000000840D3
S3150800220080B500210021D0F8C002FFF7B3F8C0B2AC
S3150800221000F09BF8C0B202BD80B500210021D0F8BD
S31508002220C002FFF7BBF8C0B200F08FF8C0B202BD1B
@@ -605,7 +605,7 @@ S315080025A00A60094908600948006802BD000000463B
S315080025B00024744C0024744A0024F44A0044025847
S315080025C0104402580090D0030400002008000020A0
S315080025D018440258284402582C44025830440258D9
-S315080025E034440258A872000800093D0000127A0017
+S315080025E034440258C474000800093D0000127A00F9
S315080025F080B5002801D1022011E0D0F8B432002BB2
S3150800260002D00023C0F8B432002901D0C0F8B012B5
S31508002610012180F89C120270FFF7A4FD002002BD7C
@@ -617,7 +617,7 @@ S31508002660DBFD002002BD0020704710B50224D0F81B
S31508002670B422002A07D0C9B2D0F8B422126890470B
S31508002680002800D100242000C0B210BD80B5C9B210
S31508002690D0F8B42252689047002002BD10B5040055
-S315080026A014F52A7000F022FD0120C4F89402B4F84B
+S315080026A014F52A7000F038FD0120C4F89402B4F835
S315080026B0AE02C4F8980294F8A80210F01F00002889
S315080026C003D002280DD006D311E014F52A71200094
S315080026D000F07CF912E014F52A71200000F0B3F935
@@ -627,24 +627,24 @@ S3150800270010B5040010000A00D2B2002A39D114F517
S31508002710AA72D4F89412032927D11169D368994269
S3150800272011D2D36811695B1AD360D16813699942CB
S3150800273001D2D26800E0126992B20100200000F0CE
-S3150800274040FD002010BDD4F8B4020069002808D066
+S3150800274056FD002010BDD4F8B4020069002808D050
S3150800275094F89C02032804D12000D4F8B41209691D
-S315080027608847200000F036FDEBE7D4F894020528E8
+S315080027608847200000F04CFDEBE7D4F894020528D2
S31508002770E7D10020C4F8940200212000FFF783FD6A
S31508002780DFE7D4F8B402806900280AD094F89C02DE
S31508002790032806D1C9B22000D4F8B422926990471A
S315080027A0CFE70220CEE710B5040010000A00D2B227
S315080027B0002A68D114F11402D4F8941202294AD1D5
S315080027C01169D368994210D2D36811695B1AD3602C
-S315080027D0D26892B20100200000F0EAFC0023002231
+S315080027D0D26892B20100200000F000FD002300221A
S315080027E000212000FFF79CFD41E090681169B0FBCD
S315080027F0F1F301FB1300002817D19068116988428C
S3150800280013D39068D4F8981288420ED20022002179
-S31508002810200000F0CDFC0020C4F898020023002216
+S31508002810200000F0E3FC0020C4F898020023002200
S3150800282000212000FFF77CFD21E0D4F8B402C0683F
S31508002830002808D094F89C02032804D12000D4F874
S31508002840B412C968884780212000FFF71CFD2000C4
-S3150800285000F0CBFC0BE0D4F89402042803D0D4F89B
+S3150800285000F0E1FC0BE0D4F89402042803D0D4F885
S315080028609402002803D180212000FFF70CFD94F87C
S31508002870A002012805D12000FFF7F5FE002084F804
S31508002880A002002010BDD4F8B402406900280AD07E
@@ -662,26 +662,26 @@ S315080029309C120020704780B590F89C12032908D194
S31508002940D0F8B412C969002903D0D0F8B412C969FD
S315080029508847002002BD00207047002070470020ED
S31508002960704780B5012180F89C124168C9B2D0F839
-S31508002970B42252689047002002BD80B500F044FC9E
+S31508002970B42252689047002002BD80B500F05AFC88
S31508002980FCE7000000690840884201D1012000E008
S315080029900020704780B54FF400510548FFF7F2FF55
-S315080029A0002801D0002002E000F05CFC012002BDF6
-S315080029B00008025880B5642000F02FFC01BD80B5E0
-S315080029C000F02EFC01BD70477047704710B5002413
+S315080029A0002801D0002002E000F072FC012002BDE0
+S315080029B00008025880B5642000F045FC01BD80B5CA
+S315080029C000F044FC01BD70477047704710B50024FD
S315080029D00A7812F06002002A08D0202A01D0402A7C
S315080029E02CD1D0F8B4229268904729E04A78002A78
S315080029F018D0012A1CD0032A17D0052A09D0062A7E
S31508002A0004D0082A0BD0092A06D014E000F071F980
-S31508002A1013E000F06EFA10E000F09AFA0DE000F00C
-S31508002A200BFB0AE000F027FB07E000F043FB04E09D
-S31508002A3000F04AFB01E000F06DFB01E000F06AFBE4
+S31508002A1013E000F083FA10E000F0AFFA0DE000F0E2
+S31508002A2021FB0AE000F03DFB07E000F059FB04E05B
+S31508002A3000F060FB01E000F083FB01E000F080FBA2
S31508002A402000C0B210BD38B504000D00002028785B
S31508002A5010F06000002803D0202801D0402822D199
S31508002A6094F89C02401E022818D82879022810D209
S31508002A7029002000D4F8B422926890470100E8881B
-S31508002A8000280AD1C9B2002907D1200000F0A2FB0C
-S31508002A9003E02900200000F03DFB03E029002000A8
-S31508002AA000F038FB03E02900200000F033FB00208B
+S31508002A8000280AD1C9B2002907D1200000F0B8FBF6
+S31508002A9003E02900200000F053FB03E02900200092
+S31508002AA000F04EFB03E02900200000F049FB00205F
S31508002AB032BD70B50500002488880A7812F06002D5
S31508002AC0002A0AD0202A02D0402A40F00C81280089
S31508002AD0D5F8B4229268904708E10A7812F06002A5
@@ -690,1199 +690,1244 @@ S31508002AF0FEE04A78002A6CD0012A3AD0032A40F030
S31508002B00EE8095F89C22022A02D0032A16D02CE0E1
S31508002B100200D2B2002A0DD00200D2B2802A09D011
S31508002B200100C9B22800FFF7AEFB80212800FFF795
-S31508002B30AAFB02E0280000F0EDFA19E04A88002A0C
+S31508002B30AAFB02E0280000F003FB19E04A88002AF5
S31508002B400FD10200D2B2002A0BD00200D2B2802ADC
S31508002B5007D0C988002904D10100C9B22800FFF7A7
-S31508002B6092FB280000F036FB02E0280000F0D2FABB
+S31508002B6092FB280000F04CFB02E0280000F0E8FA8F
S31508002B70B8E095F89C22022A02D0032A16D024E04F
S31508002B800200D2B2002A0DD00200D2B2802A09D0A1
S31508002B900100C9B22800FFF776FB80212800FFF75D
-S31508002BA072FB02E0280000F0B5FA11E04988002916
+S31508002BA072FB02E0280000F0CBFA11E04988002900
S31508002BB00AD110F07F0F04D00100C9B22800FFF730
-S31508002BC06FFB280000F006FB02E0280000F0A2FADE
+S31508002BC06FFB280000F01CFB02E0280000F0B8FAB2
S31508002BD088E095F89C22022A02D0032A26D07AE0B9
S31508002BE00200D2B2002A07D00200D2B2802A03D04D
-S31508002BF0280000F08FFA71E0010608D5C0B210F07F
+S31508002BF0280000F0A5FA71E0010608D5C0B210F069
S31508002C007F0014214843284410F1140107E0C0B29C
S31508002C1010F07F0014214843284410F5AA710020BB
-S31508002C2008600222280000F0B1FA57E002060ED525
+S31508002C2008600222280000F0C7FA57E002060ED50F
S31508002C300300DBB213F00F031422534305EB030220
-S31508002C409269002A13D1280000F064FA46E00300CE
+S31508002C409269002A13D1280000F07AFA46E00300B8
S31508002C50DBB213F00F031422534305EB0302D2F839
-S31508002C605821002A03D1280000F054FA36E001065C
+S31508002C605821002A03D1280000F06AFA36E0010646
S31508002C700AD50200D2B212F07F0214214A4305EBAC
S31508002C80020111F1140609E00200D2B212F07F0225
S31508002C9014214A4305EB020111F5AA760100C9B2CF
S31508002CA0002903D00100C9B2802902D10020306072
S31508002CB00BE00100C9B22800FFF7FFFA002802D08E
S31508002CC00120306001E00020306002223100280037
-S31508002CD000F05CFA02E0280000F01CFA02E0280086
-S31508002CE000F018FA02E0280000F014FA2000C0B23A
+S31508002CD000F072FA02E0280000F032FA02E028005A
+S31508002CE000F02EFA02E0280000F02AFA2000C0B20E
S31508002CF070BDF8B504000D000020ADF800000026F0
-S31508002D000027688880B2000AC0B201280AD00228C3
-S31508002D1010D0032823D0062800F0A580072800F045
-S31508002D20B280C2E06946207CD4F8B0221268904787
-S31508002D300600BFE0207C002808D16846D4F8B41203
-S31508002D40896A884706000220707007E06846D4F84A
-S31508002D50B412C96A8847060002207070AAE0A878EB
-S31508002D60002808D002282CD018D304284FD03BD3EB
-S31508002D7005285FD071E0D4F8B0024068002807D073
-S31508002D806946207CD4F8B02252689047060004E0D1
-S31508002D902900200000F0BEF97F1C63E0D4F8B002D9
-S31508002DA08068002807D06946207CD4F8B02292684B
-S31508002DB09047060004E02900200000F0ABF97F1CCC
-S31508002DC050E0D4F8B002C068002807D06946207CD5
-S31508002DD0D4F8B022D2689047060004E02900200003
-S31508002DE000F098F97F1C3DE0D4F8B002006900288D
-S31508002DF007D06946207CD4F8B022126990470600AD
-S31508002E0004E02900200000F085F97F1C2AE0D4F8A8
-S31508002E10B0024069002807D06946207CD4F8B02261
-S31508002E2052699047060004E02900200000F072F974
-S31508002E307F1C17E0D4F8B0028069002807D06946DD
-S31508002E40207CD4F8B02292699047060004E0290055
-S31508002E50200000F05FF97F1C04E02900200000F044
-S31508002E6059F97F1C26E0207C002806D16846D4F84C
-S31508002E70B412496B8847060004E02900200000F0D8
-S31508002E8049F97F1C16E0207C002808D16846D4F84A
-S31508002E90B412096B884706000720707004E0290001
-S31508002EA0200000F037F97F1C04E02900200000F01C
-S31508002EB031F97F1CFFB2002F1AD1BDF80000002897
-S31508002EC010D0E88800280DD0BDF80000E9888842AF
-S31508002ED002D3E888ADF80000BDF8002031002000D4
-S31508002EE000F054F9E888002802D1200000F072F9B1
-S31508002EF0F1BD38B504008888002825D1C88800287F
-S31508002F0022D1488880281FD28D7815F07F0594F83D
-S31508002F109C02032803D1200000F0FCF817E084F88F
-S31508002F209E522900C9B22000FFF7DFF9200000F001
-S31508002F3051F9EDB2002D03D0022084F89C0206E078
-S31508002F40012084F89C0202E0200000F0E3F831BD7D
-S31508002F5038B504000D006888364908703548007889
-S31508002F60022804D32900200000F0D4F861E094F880
-S31508002F709C02022802D003281ED051E02D48007872
-S31508002F80002815D02B4800786060032084F89C023E
-S31508002F90284801782000FFF768FB022804D1290099
-S31508002FA0200000F0B7F844E0200000F013F902E032
-S31508002FB0200000F00FF93CE01E48007800280ED1EA
-S31508002FC0022084F89C021B48007860601948017842
-S31508002FD02000FFF75BFB200000F0FCF81FE0154817
-S31508002FE000786168884217D06168C9B22000FFF787
-S31508002FF04DFB1048007860600E4801782000FFF706
-S3150800300034FB022804D12900200000F083F810E0E0
-S31508003010200000F0DFF802E0200000F0DBF808E00E
-S315080030202900200000F076F8024801782000FFF712
-S315080030302DFB31BDC014002080B5CA88012A02D0F4
-S3150800304000F068F816E090F89C22521E012A02D970
-S31508003050921E08D00CE000218160012210F10801BF
-S3150800306000F094F806E00122011D00F08FF801E057
-S3150800307000F050F801BD80B590F89C22521E022A35
-S3150800308015D8CA88022A02D000F044F811E00121B6
-S31508003090C160D0F8A412002903D0C16851F002011A
-S315080030A0C160022210F10C0100F070F801E000F096
-S315080030B031F801BD80B54988012904D10121C0F83C
-S315080030C0A41200F087F801BD80B590F89C22521E24
-S315080030D0022A08D84988012904D10021C0F8A41277
-S315080030E000F078F801E000F015F801BD0A780270E2
-S315080030F04A7842708A78CB781B029A1842800A79F5
-S315080031004B791B029A1882808A79C979090289182B
-S31508003110C180704710B5040080212000FFF7B3F87E
-S3150800312000212000FFF7AFF810BDF8B504000D0028
-S3150800313017000026002C1ED0200000F01DF84000C5
-S31508003140801C388038783100C9B26854761C032050
-S315080031503100C9B26854761C0AE020783100C9B239
-S315080031606854641C761C00203100C9B26854761C69
-S3150800317020780028F1D1F1BD0200002001E0401CB2
-S31508003180521C11780029FAD1C0B2704780B51300D5
-S315080031900222C0F894221A0092B2C2611A0092B2B0
-S315080031A002629BB20A000021FFF7ACF8002002BDBC
-S315080031B080B513009BB20A000021FFF7A3F8002090
-S315080031C002BD80B513009BB20A000021FFF7A8F8DC
-S315080031D0002002BD80B50421C0F894120023002205
-S315080031E00021FFF78FF8002002BD80B50521C0F841
-S315080031F09412002300220021FFF792F8002002BD56
-S3150800320080B5FFF7D7FB01BD80B5FFF7D8FB01BD39
-S3150800321081617047090481617047154908807047C4
-S3150800322080B5FDF7BDFF13490968884219D31248CE
-S315080032300078002807D101200F49087080210F481F
-S31508003240FFF7E6FF06E000200B49087080210B48CF
-S31508003250FFF7E0FFFDF7A4FF05490988401805496F
-S31508003260086001BD80B580210448FFF7D3FF01BD82
-S31508003270B8140020A4140020BB140020000402582F
-S3150800328030B593B004006846DFF818164C22FEF7EE
-S315080032904DFE002C01D101205CE12068DFF80816FC
-S315080032A0884203D1206810F580706060A068B0F588
-S315080032B0407F206C0028A06C0028206D0028206E16
-S315080032C00028E06D216E0818002894F89800002858
-S315080032D005D1002084F89900200000F04DFC2068F4
-S315080032E0806930F0100021688861FDF769FF0500E4
-S315080032F02068806900070FD5FDF762FF401B0B2881
-S31508003300F6D3D4F89C0050F00100C4F89C000320C2
-S3150800331084F8980001201DE12068806950F00100BA
-S3150800332021688861FDF74CFF050020688069C007A1
-S315080033300FD4FDF745FF401B0B28F6D3D4F89C00A5
-S3150800334050F00100C4F89C00032084F8980001207E
-S3150800335000E12068806950F0020021688861207CBD
-S31508003360012806D12068806930F04000216888610C
-S3150800337005E02068806950F0400021688861607C1B
-S31508003380012806D12068806950F480402168886148
-S3150800339005E02068806930F4804021688861A07C57
-S315080033A0012806D12068806930F480502168886138
-S315080033B005E02068806950F480502168886120689B
-S315080033C0816931F44071A0680143206881612068F1
-S315080033D0806930F0A400216888612068006930F0AF
-S315080033E0100021680861E068012806D12068806914
-S315080033F050F004002168886121E0E06800281ED0AA
-S31508003400E068022815D02068806950F0800021689D
-S3150800341088612068006950F0100021680861E0683A
-S3150800342003280CD12068806950F020002168886143
-S3150800343005E02068806950F0200021688861A0694D
-S31508003440401EE169491E090251EA4061206A401E90
-S3150800345001436069401E51EA00412068C161A068C5
-S31508003460B0F5407F0FD1A06A401EE16A491E50EAB6
-S315080034700120216B491E50EA0110616A491E50EA73
-S3150800348001402168C860206E002807D02068D0F85F
-S31508003490C010606E01432068C0F8C010E06D216E50
-S315080034A0081800280CD02068D0F8C810C908C90028
-S315080034B06846A26E50F8220001432068C0F8C8107A
-S315080034C0206C00280CD02068D0F8BC10C908C900A8
-S315080034D06846626C50F8220001432068C0F8BC10A8
-S315080034E0A06C00280DD02068D0F8BC0030F0700021
-S315080034F06946E26C51F8221050EA01102168C1F8B9
-S31508003500BC00206D00280DD02068D0F8BC0030F42F
-S31508003510E0606946626D51F8221050EA0120216880
-S31508003520C1F8BC002068DFF88013884205D16068BE
-S31508003530806880088000616888600020C4F894006C
-S315080035400020C4F89C00012084F89800200000F0B0
-S31508003550C7F9C0B213B030BD10B490F89820130064
-S31508003560DBB2012B02D0D2B2022A3BD1CA68072AA3
-S315080035700A68002A1ED1CA68072ACA68072A09D112
-S315080035800A69CB691B0253EA02438A69134353F05B
-S31508003590605309E08A68CB68DB0653EA82730A69D6
-S315080035A053EA02434A691343C06E496810EB810027
-S315080035B0036015E0CA68072ACB680A6952EA4372AB
-S315080035C0CB68072B01D18B6903E08C684B6953EAFA
-S315080035D08473006F496810EBC1000260001D036028
-S315080035E0002006E0D0F89C1051F00201C0F89C10AB
-S315080035F0012010BC704710B490F89840012C0BD1EC
-S31508003600019C920052EA011252EA430222430068E0
-S31508003610C0F88020002006E0D0F89C1051F0040184
-S31508003620C0F89C10012010BC704790F8981001292A
-S315080036300DD1022180F89810016889694908490066
-S31508003640026891610021C0F89C10002006E0D0F8BD
-S315080036509C1051F00401C0F89C100120704738B541
-S3150800366090F898504C68002CFFD02C00E4B2012C3E
-S3150800367002D0EDB2022D27D193FAA3F4B4FA84F45A
-S315080036800568D5F8C050C5F30545AC4207D3D0F850
-S315080036909C1051F02001C0F89C1001201BE0046822
-S315080036A0D4F8CC401C4207D0D0F89C1051F0400109
-S315080036B0C0F89C1001200EE093FAA3F3B3FA83F343
-S315080036C000F00FFA002006E0D0F89C1051F0020135
-S315080036D0C0F89C10012032BD90F89820022A04D127
-S315080036E00068C0F8D010002006E0D0F89C1051F011
-S315080036F00801C0F89C1001207047F0B4002590F826
-S315080037009840E4B2022C40F0C380402927D10468CF
-S31508003710D4F8A04014F4FE0F07D1D0F89C1051F04D
-S315080037202001C0F89C100120B9E00468D4F8A44030
-S3150800373014F07F0F07D1D0F89C1051F48071C0F8AF
-S315080037409C100120ABE00468D4F8A440C4F3052516
-S31508003750466F446C04FB05F416EB84063AE04129EF
-S3150800376027D10468D4F8B04014F4FE0F07D1D0F876
-S315080037709C1051F02001C0F89C1001208FE00468CD
-S31508003780D4F8B44014F07F0F07D1D0F89C1051F448
-S315080037908071C0F89C10012081E00468D4F8B44018
-S315080037A0C4F30525866FC46C04FB05F416EB840682
-S315080037B010E0046DA14207D3D0F89C1051F0200107
-S315080037C0C0F89C1001206AE0C66F446D04FB01F442
-S315080037D016EB8406346814F0804454605468002C50
-S315080037E004D13468C4F38A44146003E0346824F0CE
-S315080037F060441460346814F000549460346814F01B
-S3150800380000441461341D2668B6B2D661266816F4DB
-S315080038107026D660266816F480165661266816F451
-S31508003820001696612668C6F3066616622668F60FBF
-S315080038305662241D002602E0A75D9F55761CDFF818
-S315080038409C70D2F80CC05FEA1C4C17F80C70BE428C
-S31508003850F2D3402903D10068C0F8A85016E04129E0
-S3150800386003D10068C0F8B85010E0202906D201221A
-S3150800387012FA01F10068C0F8981007E0012211F069
-S315080038801F0112FA01F10068C0F89C10002006E03A
-S31508003890D0F89C1051F00801C0F89C100120F0BC2B
-S315080038A070470000FC6F000800A000400068D0F8D0
-S315080038B0CC00084201D1002000E0012070474029D1
-S315080038C005D10068D0F8A40010F07F0004E0006875
-S315080038D0D0F8B40010F07F00704700008872000826
-S315080038E0426B0168D1F884106FF38F0151EA8201A7
-S315080038F00368C3F884100168D1F8841031F47F0195
-S31508003900836B51EA03410368C3F88410816B8A18F4
-S315080039100168D1F888106FF38F0151EA82010368B4
-S31508003920C3F888100168D1F8881031F4FE01C36B1A
-S3150800393051EA03410368C3F88810C16B12EB4102D0
-S315080039400168D1F8A0106FF38F0151EA820103686C
-S31508003950C3F8A0100168D1F8A01031F4FE01036C79
-S3150800396051EA03410368C3F8A010036C416C01FBDC
-S3150800397003220168D1F8B0106FF38F0151EA820172
-S315080039800368C3F8B0100168D1F8B01031F4FE012D
-S31508003990836C51EA03410368C3F8B010836CC16CA9
-S315080039A001FB03220168D1F8AC106FF38F0151EACD
-S315080039B082010368C3F8AC10036D416D01FB032255
-S315080039C00168D1F8F0106FF38F0151EA820103689C
-S315080039D0C3F8F0100168D1F8F01031F47C11836D4A
-S315080039E051EA03410368C3F8F010816D12EB4102F6
-S315080039F00168D1F8C0106FF38F0151EA820102689D
-S31508003A00C2F8C0100168D1F8C01031F47C11C26D3B
-S31508003A1051EA02410268C2F8C0100168D1F8C01024
-S31508003A2031F07C51026E51EA02610268C2F8C01098
-S31508003A30416B4E4A12EB8102C266C16E826B11EB74
-S31508003A4082010167016FC26B11EBC2014167426FC8
-S31508003A50036C416C4B4312EB83028267826F836C63
-S31508003A60C16C4B4312EB8302C267C26F036D416D93
-S31508003A704B4312EB8302C0F88020D0F88010826D89
-S31508003A8011EBC201C0F88410D0F88420C36D816E92
-S31508003A904B4312EB8302C0F88820D0F88820036EC7
-S31508003AA0816E4B4312EB8302C0F89020D0F8901039
-S31508003AB02F4A91420AD3D0F89C1051F02001C0F841
-S31508003AC09C10032180F89810012009E0C16E02E0DD
-S31508003AD000220A60091DD0F890209142F8D30020F0
-S31508003AE0704770B41C004B68002B06D10D698B68B3
-S31508003AF01D430B6855EA834506E00D698B681D432F
-S31508003B000B681D4355F080450B6ACE6956EA036675
-S31508003B108B691E434B691E43CB681E43D0F884301D
-S31508003B20806E444313EB84031D60181D0660031D55
-S31508003B30002412E002EB0400C07802EB0405AD781D
-S31508003B402D0455EA006502EB0400407855EA002585
-S31508003B50105D05431D601B1D241D0648CD682D0CF0
-S31508003B60405D8442E6D370BC7047000000AC00405C
-S31508003B70FDD300408872000870470000DFF8380758
-S31508003B800068400C10F001007047DFF82C07006849
-S31508003B90800810F001007047DFF81C07006810F075
-S31508003BA018007047DFF810070068000A10F00100D7
-S31508003BB07047DFF808070068400810F001007047F2
-S31508003BC0DFF8FC06006810F038007047DFF8F406E6
-S31508003BD0006810F470607047DFF8E806006810F0B7
-S31508003BE00F007047DFF8E006006810F070007047B5
-S31508003BF0DFF8D406006810F4E060704700F0FF02B2
-S31508003C00DFF8CC168A1811680200120E03001B0A88
-S31508003C1013F01F039A4011400200120A12F01F0205
-S31508003C20D14050EA0140704780B5FFF7E7FF02BD73
-S31508003C30DFF8A006006810F003007047DFF8980662
-S31508003C400068400E10F001007047DFF89006006823
-S31508003C50000C10F001007047DFF880060068400C81
-S31508003C6010F001007047DFF874060068800C10F049
-S31508003C7001007047DFF86406006810F0010070471D
-S31508003C80DFF85C060068C005C00D401C7047DFF809
-S31508003C9044060068C0F305107047DFF8440600685C
-S31508003CA0C0F34620401C7047DFF834060068C0F3AE
-S31508003CB00640401C7047DFF828060068C0F3066017
-S31508003CC0401C7047DFF81C060068C0F3CC0070473C
-S31508003CD0DFF804060068C00E10F001007047DFF830
-S31508003CE0FC050068C00C10F001007047DFF8EC0511
-S31508003CF00068000D10F001007047DFF8E005006865
-S31508003D00400D10F001007047DFF8D0050068000983
-S31508003D1010F001007047DFF8D0050068C005C00D37
-S31508003D20401C7047DFF8AC050068C0F305307047E3
-S31508003D30DFF8B4050068C0F34620401C7047DFF87A
-S31508003D40A8050068C0F30640401C7047DFF89805D0
-S31508003D500068C0F30660401C7047DFF8A0050068DD
-S31508003D60C0F3CC007047DFF870050068400F10F00C
-S31508003D7001007047DFF864050068800D10F0010047
-S31508003D807047DFF858050068C00D10F0010070474D
-S31508003D90DFF848050068000E10F001007047DFF8EC
-S31508003DA03C050068000A10F001007047DFF850056E
-S31508003DB00068C005C00D401C7047DFF8180500688C
-S31508003DC0C0F305507047DFF838050068C0F3462091
-S31508003DD0401C7047DFF828050068C0F30640401C01
-S31508003DE07047DFF81C050068C0F30660401C704782
-S31508003DF0DFF810050068C0F3CC00704780B5DFF81F
-S31508003E00B804006850F00100DFF8AC140860FFF74A
-S31508003E10BCFE0028FBD00020DFF8A4140860DFF8F9
-S31508003E2098040168DFF8C4040140DFF88C040160D7
-S31508003E30FFF704FF0028FBD1FFF74AFF0028FBD154
-S31508003E40FFF791FF0028FBD10020DFF878140860FF
-S31508003E500020DFF8741408600020DFF8701408608A
-S31508003E60DFF88C04DFF86C140860DFF88804DFF8E4
-S31508003E706C140860DFF88004DFF86414086000201A
-S31508003E80DFF860140860DFF87004DFF85C14086077
-S31508003E900020DFF868140860DFF85C04DFF86014B7
-S31508003EA008600020DFF85C140860DFF80C0400687E
-S31508003EB030F48020DFF8001408600020DFF848148A
-S31508003EC00860DFF84804016840F2FF700143DFF834
-S31508003ED03C040160DFF83804006850F48030DFF8ED
-S31508003EE03014086001BD2DE9FC41070000260025B5
-S31508003EF0FFF79EFE002803D0022813D00BD318E044
-S31508003F00FFF743FE002805D0DFF80864FFF744FEF4
-S31508003F10C008C6400DE0FFF745FE002801D0DFF8CF
-S31508003F20F86306E0FFF72AFE002801D0DFF8EC6305
-S31508003F30FFE700203860002078600020B860FFF7AF
-S31508003F40A6FE0400FFF79CFE8046FFF793FE0028B6
-S31508003F5002D0FFF7B7FE0500002C29D0FFF775FE43
-S31508003F60002809D0FFF799FE00902B004246210051
-S31508003F70300000F0EFF83860FFF76EFE002809D031
-S31508003F80FFF792FE00902B0042462100300000F019
-S31508003F90E1F87860FFF767FE002809D0FFF78BFE87
-S31508003FA000902B0042462100300000F0D3F8B8609C
-S31508003FB0BDE8F3812DE9FC41070000260025FFF73F
-S31508003FC037FE002803D0022813D00BD318E0FFF7DA
-S31508003FD0DCFD002805D0DFF83C63FFF7DDFDC008EF
-S31508003FE0C6400DE0FFF7DEFD002801D0DFF82863A4
-S31508003FF006E0FFF7C3FD002801D0DFF82063FFE7DE
-S3150800400000203860002078600020B860FFF78AFE3C
-S315080040100400FFF780FE8046FFF776FE002802D0F0
-S31508004020FFF79BFE0500002C29D0FFF758FE002855
-S3150800403009D0FFF77DFE00902B0042462100300094
-S3150800404000F088F83860FFF751FE002809D0FFF71E
-S3150800405076FE00902B0042462100300000F07AF8E8
-S315080040607860FFF74AFE002809D0FFF76FFE009038
-S315080040702B0042462100300000F06CF8B860BDE81D
-S31508004080F3812DE9FC41070000240026FFF7D0FD47
-S31508004090002803D0022813D00BD318E0FFF775FDCC
-S315080040A0002805D0DFF86C42FFF776FDC008C4404B
-S315080040B00DE0FFF777FD002801D0DFF85C4206E047
-S315080040C0FFF75CFD002801D0DFF85042FFE700202B
-S315080040D03860002078600020B860FFF76EFE0500A3
-S315080040E0FFF764FE8046FFF75AFE002802D0FFF766
-S315080040F07FFE0600002D2BD0002C29D0FFF73AFEB4
-S31508004100002809D0FFF75FFE0090330042462900D9
-S31508004110200000F01FF83860FFF733FE002809D0AA
-S31508004120FFF758FE0090330042462900200000F0B1
-S3150800413011F87860FFF72CFE002809D0FFF751FE2A
-S315080041400090330042462900200000F003F8B860CA
-S31508004150BDE8F38100EE100A00EE901A01EE102A6F
-S3150800416001EE903A9DED002AB8EE400AF8EE600A94
-S3150800417080EE200AF8EE410AB8EE611ADFED4D1A14
-S3150800418081EE211A70EE810A20EE200AF8EE420A24
-S3150800419080EE200ABCEEC00A10EE100A70471FB562
-S315080041A00024FFF741FDDFF87811884240D0DFF898
-S315080041B07411884228D0DFF8701188424CD0DFF895
-S315080041C06C11884248D0DFF8681188424DD0DFF874
-S315080041D06411884249D0DFF8601188424ED0DFF872
-S315080041E05C1188424AD0DFF85811884251D0DFF86E
-S315080041F0541188424DD0DFF85011884250D0DFF86C
-S315080042004C1188424CD052E000F0A4F80400FFF7A5
-S31508004210DDFCDFF83C11C0F30320085C10F01F003A
-S31508004220C440200000F0B5F800F0CEF804003EE0E7
-S3150800423000F090F80400FFF7C9FCDFF81411C0F38A
-S315080042400320085C10F01F00C440200000F0A1F80D
-S3150800425000F0ACF804002AE0FFF73AFD002803D086
-S315080042606846FFF7A7FE019C21E0FFF77CFD0028C2
-S3150800427003D06846FFF705FF019C18E0FFF785FCA9
-S31508004280002805D0DFF88C40FFF786FCC008C4403C
-S315080042900DE0FFF787FC002801D0DFF87C4006E038
-S315080042A0FFF787FC002801D04FF40044FFE7200001
-S315080042B004B010BD0000004600440258704402587D
-S315080042C010440258184402581C4402582044025804
-S315080042D04C44025828440258004402582C440258B8
-S315080042E030440258344402583844025845EDF6EA38
-S315080042F0000202020000FF01800201013C4402584C
-S3150800430040440258444402586044025868440258DB
-S31508004310D04402580090D00300093D0000127A00EC
-S31508004320080000070803000708000107080301073B
-S315080043300800020708030207080003070803030723
-S31508004340080004070803040708000507080305070B
-S31508004350987200081FB50024FFF732FC002806D023
-S3150800436008280AD010280AD018280AD00EE01E4CB1
-S31508004370FFF712FCC008C44008E01A4C06E01B4CC4
-S3150800438004E06846FFF7AFFD009CFFE7200004B095
-S3150800439010BD10B50400FFF71FFC154910F00F00FB
-S315080043A0085C10F01F00C440200010BD10B50400C2
-S315080043B0FFF718FC0E49C0F30210085C10F01F0046
-S315080043C0C440200010BD000010B50400FFF710FC23
-S315080043D00749C0F30220085C10F01F00C440200003
-S315080043E010BD000000093D000090D00300127A00BD
-S315080043F098720008DFF834150968C908C900084327
-S31508004400DFF8281508607047DFF82415096831F4C5
-S3150800441040410843DFF8181508607047DFF81405AF
-S31508004420006850F48020DFF80C1508607047DFF844
-S315080044300405006850F48030DFF8F8140860704707
-S31508004440DFF8F0040068400C10F001007047DFF850
-S31508004450E8140968C908C9000843DFF8DC140860CD
-S315080044607047DFF8D814096831F470610843DFF83B
-S31508004470CC1408607047DFF8C414096809090901F3
-S315080044800843DFF8B81408607047DFF8B414096801
-S3150800449031F070010843DFF8A81408607047DFF8A8
-S315080044A0A014096831F4E0610843DFF89414086041
-S315080044B07047DFF88814096831F070010843DFF89F
-S315080044C07C1408607047DFF87C14096831F07001C5
-S315080044D00843DFF870140860704710B400F0FF0254
-S315080044E0DFF864148A18116803001B0E0400240AF6
-S315080044F014F01F04A3409943C0F30743000A10F0C1
-S315080045001F0013FA00F00843106010BC704780B50E
-S31508004510FFF7E3FF01BDDFF83414096831F44011F1
-S315080045200843DFF8281408607047DFF82414096880
-S3150800453031F040510843DFF8181408607047DFF877
-S3150800454014140968890889000843DFF80814086004
-S315080045507047DFF8E003006850F08070DFF8D41386
-S3150800456008607047DFF8CC030068400E10F00100C1
-S315080045707047DFF8E403006850F48030DFF8D8139A
-S3150800458008607047DFF8D003006850F40030DFF8A1
-S31508004590C81308607047DFF8C013096831F00201D4
-S315080045A051EA4001DFF8B00301607047DFF8A8134D
-S315080045B0096831F00C0151EA8001DFF89C030160BB
-S315080045C07047DFF898130968490A4902401E0843EC
-S315080045D0DFF8881308607047DFF87813096831F444
-S315080045E07C7151EA0011DB4801607047DB490968B4
-S315080045F031F47E41401E51EA4021D8480160704797
-S31508004600D649096831F4FE01401E51EA0041D348F3
-S3150800461001607047D149096831F0FE41401E51EAF0
-S315080046200061CE4801607047CD490968090909014A
-S315080046300843CB4908607047C948006810F00F0066
-S31508004640704781B0C74909680143C64A1160C54920
-S31508004650096808400090009801B07047C149096888
-S3150800466031EA0000BF490860704781B0BE49096851
-S315080046700143BD4A1160BC4909680840009000988A
-S3150800468001B07047B849096831EA0000B6490860C0
-S31508004690704781B0B54909680143B44A1160B34906
-S315080046A0096808400090009801B07047AF4909684A
-S315080046B031EA0000AD490860704781B0AC49096825
-S315080046C00143AB4A1160AA4909680840009000985E
-S315080046D001B07047A649096831EA0000A449086094
-S315080046E0704781B0A34909680143A24A1160A149EC
-S315080046F0096808400090009801B070479D4909680C
-S3150800470031EA00009B4908607047090481617047D7
-S3150800471080B500F005F800F03DF900F049F9FCE72E
-S3150800472080B500F04FF900F001F801BD80B504200E
-S31508004730FFF77AFFFFF780FF042803D064218E482D
-S31508004740FEF71BF90220FFF755FE4FF44040FFF72E
-S315080047505BFEFFF763FEFFF76AFEFFF771FE0128AF
-S31508004760FBD10220FFF7EBFEFFF703FFFFF70AFF77
-S315080047700120FFF71BFF0020FFF70DFF0420FFF7BE
-S315080047802BFF4FF4F070FFF71CFF0220FFF72EFFF8
-S315080047901420FFF735FF0220FFF73CFFFFF7D9FE8D
-S315080047A0FFF7E0FE0128FBD10820FFF764FE03208F
-S315080047B0FFF74DFE0020FFF754FE0820FFF75BFECB
-S315080047C04020FFF762FE4FF48060FFF768FE402046
-S315080047D0FFF76FFE4020FFF776FE6848FFF797FE63
-S315080047E00020FFF7A2FE5FF48010FFF794FE6448EE
-S315080047F000F086F901BD80B586B00220FFF771FF8B
-S315080048000120FFF732FF0220FFF72FFF0420FFF7F2
-S315080048102CFF0820FFF729FF5FF48020FFF739FFF8
-S315080048204FF48070FFF749FF802000900120019027
-S315080048300020029000200390002004906946514809
-S3150800484000F064FA4FF40050009000200190002018
-S31508004850049069464C4800F059FA4FF440700090AD
-S31508004860022001900020029000200390002004906E
-S31508004870072005906946454800F048FA4FF440700D
-S315080048800090022001900220029000200390002050
-S3150800489004900920059069463A4800F037FA4FF423
-S315080048A0C05000900220019003200290002003903F
-S315080048B0002004900A2005906946354800F026FA3B
-S315080048C05FF00060FFF7BDFE07B000BD80B5FFF7DB
-S315080048D095FA80212B48FFF718FF2C4800F083F93A
-S315080048E0294800F080F9274800F07DF9284800F0AB
-S315080048F07AF95FF00060FFF7B1FE4FF48070FFF7BA
-S31508004900E9FE5FF48020FFF7D1FE0820FFF7BAFE24
-S315080049100420FFF7B7FE0220FFF7B4FE0120FFF7D9
-S31508004920B1FE0220FFF7EAFE01BD00000C4802585E
-S3150800493018480258004402581044025818440258AD
-S315080049401C440258204402584C4402585444025805
-S3150800495050440258284402582C44025830440258FD
-S3150800496000200052D8440258E0440258E84402584D
-S31508004970EC440258F4440258A86F000808000007DF
-S3150800498000389C1C0004025800080258000C025803
-S315080049900000025880B500F0FBF9FEF731FCFCF781
-S315080049A0DBFB00F02CFA00F049FA00F0E3FA01BD4F
-S315080049B080B5FEF729FCFCF7E9FB00F052FA00F097
-S315080049C0E2FA01BD80B5032000F06BFBFDF7D4FCCD
-S315080049D0DFF8F810DFF8F8201268C2F30322895CC2
-S315080049E011F01F01C840DFF8E410DFF8E420126870
-S315080049F012F00F02895C11F01F010200CA40DFF8AD
-S31508004A00D4100A60DFF8D0100860002000F070FBB0
-S31508004A10002801D0012002E0FFF7EDFE002002BDCC
-S31508004A2080B57FF00040DFF8B41008600020DFF89A
-S31508004A30AC1008605FF0FF30DFF8A41008600020B3
-S31508004A40DFF89C1008605FF0FF30DFF89810086008
-S31508004A500020DFF8901008605FF0FF30DFF888105C
-S31508004A6008600020DFF8801008605FF0FF30DFF88C
-S31508004A707C1008600020DFF8741008605FF0FF30D3
-S31508004A80DFF86C1008600020DFF8641008605FF03B
-S31508004A90FF30DFF8601008600020DFF85810086063
-S31508004AA05FF0FF30DFF8501008600020DFF848108C
-S31508004AB008605FF0FF30DFF8441008600020DFF878
-S31508004AC03C100860FFF702FF002002BDA87200082C
-S31508004AD01844025808000020040000207C440258AC
-S31508004AE08044025884440258884402588C44025828
-S31508004AF09044025894440258984402589C440258D8
-S31508004B00DFF80410086070470400002030B4046819
-S31508004B1001FB01F503235D43AC434943514321435C
-S31508004B20016030BC704743688B4351431943416069
-S31508004B30704730B4846801FB01F503235D43AC4339
-S31508004B40494351432143816030BC704730B4C4683F
-S31508004B5001FB01F503235D43AC434943514321431C
-S31508004B60C16030BC704730B4046A01FB01F54D439F
-S31508004B704D430F235D43AC4301FB01F34B4301FB5C
-S31508004B8003F151432143016230BC704730B4446A93
-S31508004B900D002D0A0B001B0A5D430B001B0A5D4323
-S31508004BA00B001B0A5D430F235D43AC430D002D0A22
-S31508004BB00B001B0A5D430B001B0A5D43090A01FB38
-S31508004BC005F151432143416230BC704743490968A6
-S31508004BD008434249086070474049096831EA0000BD
-S31508004BE03E490860704710B500243D49884206D101
-S31508004BF00120FFF7EBFF0120FFF7EEFF6AE03949D6
-S31508004C00884206D10220FFF7E1FF0220FFF7E4FF02
-S31508004C1060E03549884206D10420FFF7D7FF042013
-S31508004C20FFF7DAFF56E03149884206D10820FFF738
-S31508004C30CDFF0820FFF7D0FF4CE02D49884206D16A
-S31508004C401020FFF7C3FF1020FFF7C6FF42E02949EF
-S31508004C50884206D12020FFF7B9FF2020FFF7BCFFC6
-S31508004C6038E02549884206D14020FFF7AFFF4020AB
-S31508004C70FFF7B2FF2EE02149884206D18020FFF7D0
-S31508004C80A5FF8020FFF7A8FF24E01D49884208D128
-S31508004C904FF48070FFF79AFF4FF48070FFF79CFF80
-S31508004CA018E01849884208D14FF40070FFF78EFFC4
-S31508004CB04FF40070FFF790FF0CE01349884208D1C3
-S31508004CC04FF48060FFF782FF4FF48060FFF784FFA0
-S31508004CD000E001242000C0B210BD0000884402583C
-S31508004CE0000002580004025800080258000C025836
-S31508004CF0001002580014025800180258001C0258E6
-S31508004D00002002580024025800280258F8B5050069
-S31508004D100E00306890FAA0F0B0FA80F731E07269B8
-S31508004D2021002800FFF732FF25E034680120B8404B
-S31508004D300440002C24D07068012802D0706802282C
-S31508004D4009D1B26821002800FFF7F3FEF26831683E
-S31508004D502800FFF7E8FE326921002800FFF7F6FE73
-S31508004D607068022807D1B4F5807FD8D2726921000D
-S31508004D702800FFF7F8FE726821002800FFF7C6FE34
-S31508004D807F1C3068F8400028CFD10020F2BD000013
-S31508004D9080B500F0D9F901BD10B500F03CF800283F
-S31508004DA016D0FDF7F7FD002812D000F086F8FFF7B9
-S31508004DB037FEFCF7E1F900F032F8064908400649E3
-S31508004DC0086000F02CF8001D046800F0BFF9A04741
-S31508004DD010BD000080FFFF1F08ED00E070B504005D
-S31508004DE00D00160005E0287820706D1C641CFEF77F
-S31508004DF00BFA3000461E80B20028F4D170BD80B58B
-S31508004E0000F0A6F901BD80B500F0ADF902BD80B588
-S31508004E1000F0EFF902BD80B500F06DFA02BD80B56D
-S31508004E2000F0C0FA02BD80B500F01CFA002801D1D6
-S31508004E30002001E000F096FA02BD000080B500F0FF
-S31508004E4025FC00F0CFFE01204349087001F010F858
-S31508004E5000204149087001F0CDF802203E4908704B
-S31508004E6001BD80B569463D4800F0A1FF012807D17C
-S31508004E700120394908709DF80010384800F030FCC8
-S31508004E806946364801F034F8012807D1002032492E
-S31508004E9008709DF80010314800F022FC69462F483A
-S31508004EA001F031F9012807D102202B4908709DF835
-S31508004EB000102A4800F014FC01BD80B501F0E2F8A4
-S31508004EC001BD38B504000D0023480078012804D137
-S31508004ED02900C9B2200000F029FF1F4800780028E1
-S31508004EE004D12900C9B2200000F0E1FF1A48007871
-S31508004EF0022804D12900C9B2200001F0D2F800F036
-S31508004F00E9FB31BD14480078002805D0022807D0EF
-S31508004F1004D3032806D007E0402006E0082004E072
-S31508004F203F2002E0002000E0402080B270470A4897
-S31508004F300078002805D0022807D004D3032806D015
-S31508004F4007E0402006E0082004E03F2002E00020B9
-S31508004F5000E0402080B27047C000002050130020B7
-S31508004F6010B5002400F0ADFB002800D00124200075
-S31508004F70C0B210BD80B501201849087000F023F8AA
-S31508004F8000F001F801BD80B5FFF7EAFF012813D04C
-S31508004F901248007801280FD1FCF702F910490A686F
-S31508004FA0104909688A1812F5FA72904204D300204B
-S31508004FB00A490870FFF7F0FE01BD09490860704705
-S31508004FC007480068704780B504480078012803D16F
-S31508004FD0FCF7E6F80349086001BD0000BA14002092
-S31508004FE0A01400209C14002010F00700DFF8E4103D
-S31508004FF00A684FF6FF010A4052EA0022DFF8D80095
-S31508005000024334480260704732480068C0F3022001
-S315080050107047020012B2002A04D409012F4A00B2CE
-S31508005020115407E009012E4A00B210F00F0010448F
-S3150800503000F8041C704710B410F00700D0F10703FD
-S31508005040052B01D3042301E0D0F10703041D072C27
-S3150800505001D2002000E0C01E012414FA03F35B1EEF
-S3150800506019408140012313FA00F0401E10400843FE
-S3150800507010BC704780B5411EB1F1807F01D3012075
-S315080050800EE0401E174908600F215FF0FF30FFF75A
-S31508005090C0FF002014490860072014490860002052
-S315080050A002BD80B5FFF7A0FF01BD70B504000D0075
-S315080050B01600FFF7A9FF32002900FFF7BCFF010021
-S315080050C0200000B2FFF7A5FF70BD80B5FFF7D2FF3D
-S315080050D002BD00000CED00E00000FA0500E400E067
-S315080050E018ED00E014E000E018E000E010E000E051
-S315080050F010B5040011480078002801D101201CE0F1
-S315080051004FF47A700D490978B0FBF1F00C4909683B
-S31508005110B1FBF0F0FFF7D9FF002801D001200CE021
-S31508005120102C09D2002221005FF0FF30FFF7BDFFE7
-S3150800513004480460002000E0012010BDC1000020E2
-S31508005140040000200000002072B6704762B670475F
-S315080051505FF0FF30DFF8281508605FF0FF30DFF8F2
-S31508005160241508607047F8B504000D0016000127DD
-S31508005170DFF81405D0F8A810DFF80C05D0F8AC0055
-S315080051804118491E091B681E814200D200273800B3
-S31508005190C0B201280BD1200000F048FAFF2805D03C
-S315080051A02819401E00F042FAFF2800D100273800CF
-S315080051B0C0B201281AD12100890A4FF48060414300
-S315080051C0DFF8C4040068814208D12B0032002100B0
-S315080051D0DFF8B00400F023F9070007E02B003200DF
-S315080051E02100DFF89C0400F01AF907003800C0B265
-S315080051F0F2BDF8B504000D000126FF27FF20DFF8F1
-S315080052008814D1F8A820DFF88014D1F8AC108A18D1
-S31508005210521E121B691E8A4200D200263100C9B2EC
-S31508005220012911D1200000F001FA07002C19641E8B
-S31508005230200000F0FBF93900C9B2FF2903D00100AC
-S31508005240C9B2FF2900D100263100C9B2012906D109
-S315080052500100C9B23800C0B200F087F90600300074
-S31508005260C0B2F2BD80B5012000210091DFF8141408
-S31508005270096811F1010F3CD00100C9B2012938D1E2
-S315080052800099DFF800044068411800910099DFF89A
-S31508005290F4038068411800910099DFF8E803C068B4
-S315080052A0411800910099DFF8DC0300694118009164
-S315080052B00099DFF8D0034069411800910099DFF89A
-S315080052C0C4038069411800910099DFF8B803C069E2
-S315080052D0411800910098C04300900098401C009027
-S315080052E06A460421DFF8A003006810F52670FFF768
-S315080052F03AFFC0B202BD01200022DFF88C1309680C
-S3150800530009688A18DFF880130968091D09688A1868
-S31508005310DFF874130968083109688A18DFF8681312
-S3150800532009680C3109688A18DFF85C1309681031B6
-S3150800533009688A18DFF850130968143109688A1849
-S31508005340DFF844130968183109688A18DFF8381332
-S31508005350096811F5267109688A18002A00D0002004
-S31508005360C0B2704710B50124DFF81803006810F1C1
-S31508005370010F05D0C34800F0A6F8002800D1002484
-S315080053802000C0B201280AD1BD48006810F1010FFB
-S3150800539005D0BB4800F097F8002800D1002420006B
-S315080053A0C0B210BDB8480068704710B501248A0518
-S315080053B000D000242200D2B2012A08D102688A420B
-S315080053C005D001604FF48062001DFFF707FD20003D
-S315080053D0C0B210BD70B505000E000020A948854270
-S315080053E002D1A74D2C000FE0A7480068864204D1D9
-S315080053F0A44DA54806682C0006E02C00280000F0FD
-S3150800540062F8002800D10024002C06D031002800BC
-S31508005410FFF7CBFF002800D10024200070BD2DE93E
-S31508005420F8430400894690461D0001274E46B60AF1
-S315080054304FF480604643206810F1010F06D1310011
-S315080054402000FFF7B2FF002800D100273800C0B2BD
-S3150800545001280AD12068B04207D031002000FFF7A2
-S31508005460B9FF0400002C00D100273800C0B201287B
-S3150800547025D12068B9EB000904EB090010F10409ED
-S31508005480FDF7C2FE201DB9EB0000B0F5806F09D309
-S3150800549016F580612000FFF79DFF0400002C0DD053
-S315080054A014F1040998F8000089F8000019F10109B7
-S315080054B018F101086D1E002DE2D100E00027380022
-S315080054C0C0B2BDE8F2832DE9F84304000126202581
-S315080054D0206800F0ABF8FF2800D100263000C0B2E3
-S315080054E001283ED101F06CF8002700E07F1C4FF43C
-S315080054F080602900C9B290FBF1F087422FD220685C
-S31508005500A8465FFA88F808FB07082800C0B200FB1F
-S3150800551007F0204410F10409FDF776FE4A46414695
-S31508005520012000F0E7FF002801D1002002E0002654
-S3150800553015E0401C01002A00C9B2D2B291420AD233
-S315080055400100C9B218F801100200D2B219F80220F7
-S315080055509142EED000263000C0B20028C6D101F034
-S315080055605CF83000C0B2BDE8F28370B586B00600BC
-S315080055700C0001250020009020003100C0B2C9B2FD
-S31508005580884200D200252800C0B2012804D1200094
-S31508005590C0B20F2800D300252800C0B2012841D187
-S315080055A001F00EF81EE000200190202005903649F3
-S315080055B03200D2B20C20424301EB0200407A02903C
-S315080055C031493200D2B20C20424301EB0200007A84
-S315080055D0039001200490694601A801F0C1F800284B
-S315080055E01DD1761C20003100C0B2C9B2884217D33B
-S315080055F0FDF70AFE24493200D2B20C2042438958EC
-S31508005600214A3300DBB20C20434302EB0300406817
-S3150800561011F1010F01D00028C5D1002500E00025B1
-S3150800562000F0FBFF2800C0B206B070BD70B50400DC
-S31508005630FF25002600E0761C3000C0B20F281BD2DA
-S31508005640FDF7E2FD10493200D2B20C2042438858D9
-S315080056508442F0D30C493200D2B20C204243895816
-S31508005660094A3300DBB20C20434302EB03004068CF
-S3150800567041188C42DFD235002800C0B270BD000048
-S31508005680CC040020D00800209C6E00080020DFF81B
-S315080056906C1408700020DFF8641488640020DFF8B2
-S315080056A05C1481F843000020DFF85014A1F8440088
-S315080056B00020DFF8481488700020DFF8401448708E
-S315080056C07047DFF838040078002801D1002000E090
-S315080056D0012070470020DFF8241481F84300704742
-S315080056E080B50178FF291ED100F095F8DFF80C0483
-S315080056F090F84300012802D1102000F082F8DFF864
-S31508005700FC03B0F9440001280CDB0120DFF8EC1398
-S3150800571081F84300DFF8E403B0F94410DFF8E0034A
-S3150800572000F053F801BDDFF8D413097801294BD1ED
-S315080057300178C92932D0CC293FD0CF293AD0D029EF
-S315080057402FD0D12933D0D2292ED0F32917D0F42936
-S315080057500FD0F5290AD0F6290ED0FA2912D0FC293D
-S3150800576013D0FD2914D0FE2915D029E000F0D5F86C
-S31508005770BCE700F0F5F8B9E700F0C4F8B6E700F0C2
-S3150800578015F9B3E700F0A6F8B0E700F09EF8ADE724
-S3150800579000F083F8AAE700F072F8A7E700F039F9F5
-S315080057A0A4E700F059F9A1E700F017F99EE700F021
-S315080057B085F99BE700F096F998E700F0A9F995E7CF
-S315080057C0202000F01EF891E7ACE780B589B2FFF714
-S315080057D078FB01BDF8B504000D001600002704E0AB
-S315080057E02078C719641CFDF70FFD2800451E002800
-S315080057F0F6D1FFB237600120F2BD0020BF494870DC
-S315080058007047FE21BD4AD170BC4908710220BB49C8
-S31508005810A1F84400704780B5FFF7EFFF0120B749AC
-S315080058200870FF20B549C8700020B4490871B3480C
-S31508005830007950F01000B14908710020AF4948714D
-S31508005840AE484079AD494871FFF75CFBAB498871B2
-S31508005850FFF76DFBA949C871FFF769FB80B2000A1B
-S31508005860A64908720120A54948720120A3498872F1
-S315080058700820A249A1F84400FFF7C1FA01BD80B586
-S3150800588000209E490870FFF7B8FFFF209B49C870A3
-S3150800589001209A49A1F8440001BDFF209749C87024
-S315080058A00020964908719548407894494871002027
-S315080058B09249887100209149C87100208F49087261
-S315080058C006208E49A1F84400704780B50020FFF7EE
-S315080058D098FF01BDFF208949C8708A4887498864AE
-S315080058E000208649087100208449487100208349B0
-S315080058F0887107208149C1F8070008207F49A1F867
-S3150800590044007047FF217D4AD17040687B4988640E
-S3150800591001207A49A1F84400704710B50400FFF742
-S31508005920F1FA80B2401E6178884203DA2220FFF736
-S3150800593068FF14E06278744892B27049896CFFF780
-S315080059404DFAFF206D49C8706C48806C6178401824
-S315080059506A4988646078401C6849A1F8440010BD0B
-S3150800596010B50400FFF7CEFA80B2401E617888426F
-S3150800597003DA2220FFF745FF17E060685F4988646D
-S315080059806278614892B25D49896CFFF727FAFF2071
-S315080059905A49C8705948806C6178401857498864D4
-S315080059A06078401C5549A1F8440010BD80B5FF2118
-S315080059B0524AD170554A41685048806CFFF70AFF31
-S315080059C04E49087100204D49487100204B4988719D
-S315080059D008204A49A1F8440001BD80B5FF2047497F
-S315080059E0C870002045490871002044494871FFF7EE
-S315080059F089FA4249887100204049C87100203F4908
-S31508005A00087200203D49487207203C49A1F8440025
-S31508005A1001BD10B50400FFF775FA621C80B2401E7E
-S31508005A2001003648806CFFF7EEF9002803D13120D3
-S31508005A30FFF7E7FE0FE0FF203049C870FFF762FA6C
-S31508005A402E49896C80B2401E40182C498864012072
-S31508005A502A49A1F8440010BD10B50400FFF752FA10
-S31508005A6080B2801E6178884203DA2220FFF7C9FED9
-S31508005A7023E0FF202149C87001202049A1F84400ED
-S31508005A806078002807D1FFF7CEF9002802D1312027
-S31508005A90FFF7B7FE11E0A21C61781848806CFFF783
-S31508005AA0B2F9002803D13120FFF7ABFE05E0134811
-S31508005AB0806C617840181149886410BD80B54168CA
-S31508005AC00E48806CFFF7A3F9002803D13120FFF7B1
-S31508005AD098FE06E0FF200949C87001200749A1F889
-S31508005AE0440001BD80B5FFF757F9FF200349C87088
-S31508005AF001200249A1F8440001BD00003812002027
-S31508005B003B120020E07200083C1200203F120020E1
-S31508005B1080B53120FFF775FE01BD0000C24909684E
-S31508005B2031F040510843C04908607047F8B507008E
-S31508005B300C0015001E000020FFF7F0FF4FF4FA5185
-S31508005B40002200E0521C1000C0B2122848D23800C9
-S31508005B5080B2B64B94465FFA8CFC13F81C30DFF81B
-S31508005B60CCC296465FFA8EFE0CEB4E0C9CF801C032
-S31508005B701CEB03035B1C5843B1FBF0F300FB13104B
-S31508005B800028DFD1380080B2A84B94465FFA8CFC17
-S31508005B9013F81C30DFF894C296465FFA8EFE0CEBBB
-S31508005BA04E0C9CF801C01CEB03035B1C5843B1FB6D
-S31508005BB0F0F0208020880028C4D0208840F20123F5
-S31508005BC09842BFDA99481100C9B210F81100287036
-S31508005BD09648D2B200EB420040783070012000E0CF
-S31508005BE00020F2BD10B58AB00020ADF806000020EE
-S31508005BF08DF8050000208DF8040040F2676401ABBB
-S31508005C000DF105020DF106014FF4FA70FFF78EFF4C
-S31508005C10002803D1B8218648FCF7AFFE8548864997
-S31508005C20086000208449886000208349C8600120F4
-S31508005C308149087400208049487400207E49887488
-S31508005C40BDF806007C49486101207B4988619DF8BA
-S31508005C5005007949C8619DF8040077490862012062
-S31508005C607549486201207449886201207249C862F0
-S31508005C7001207149086300206F494863002C06D447
-S31508005C8001206D49886300206B49C86305E0002040
-S31508005C906949886301206849C86301206649086420
-S31508005CA004206549486400206349886404206249E1
-S31508005CB0C86400206049086504205F4948650020DB
-S31508005CC05D49886501205C49C86500205A4908660F
-S31508005CD00020594948660420574988665648FDF702
-S31508005CE0CFFA002C02D40020029004E05FF0804036
-S31508005CF0029024F000440020039001200490012023
-S31508005D000590069407940020089002A94A48FDF7D2
-S31508005D1023FC012000900123022202214648FDF7B8
-S31508005D206AFC4548FDF781FC0AB010BD18B589B074
-S31508005D30020040F2E170002803D400900020019090
-S31508005D4005E020F0004000905FF0804001900020C0
-S31508005D500290C9B20904039100200490002005901E
-S31508005D6000200690002007905220089001236946DB
-S31508005D703148FDF774FCC0B2002816D101212E481F
-S31508005D80FDF7AAFCC0B200280FD1FBF709FA0400F8
-S31508005D90323401212848FDF789FD002805D0FDF792
-S31508005DA033FAFBF7FDF98442F3D20AB010BD2DE9A8
-S31508005DB0F0418AB006000C00002540F267675FF0E4
-S31508005DC0010840211C48FDF77AFD002806D033005B
-S31508005DD06A4640211848FDF790FC80465FFA88F825
-S31508005DE0B8F1000F1AD1002F07D40098B8420ED187
-S31508005DF0019800280BD1012509E027F000470098F3
-S31508005E00B84204D10198B0F1804F00D1012528008D
-S31508005E10C0B2012802D10398000C20702800C0B235
-S31508005E200AB0BDE8F081000050440258907100089D
-S31508005E308870000800A0004098110020016851F001
-S31508005E40010101607047016849084900016070470F
-S31508005E50C069400910F001007047C069C00910F018
-S31508005E6001007047406AC0B27047C9B28162704784
-S31508005E7080B588B05848FFF7E6FF002000904FF439
-S31508005E8061400190002002900020039000200490B9
-S31508005E900C200590002006900020079069464E4881
-S31508005EA000F0D0FD4C48FFF7C9FF09B000BD70B53A
-S31508005EB004000D002800C0B2412803DB84214748AE
-S31508005EC0FCF75BFD2800C0B200F070F8002607E07A
-S31508005ED0FDF79AF9300080B2205C00F067F8761C6E
-S31508005EE030002900C9B280B289B28842F0D370BDA9
-S31508005EF038B504000D003A480078002817D139480B
-S31508005F0000F044F801283FD13648007800283BD0F5
-S31508005F1034480078412837DAFBF742F932490860F5
-S31508005F2000203249087001202D4908702CE02D48C0
-S31508005F302E4909780844401C00F028F8012819D190
-S31508005F402A480078401C29490870284800782549BD
-S31508005F500978884218D12548027892B22449200047
-S31508005F60FEF73CFF00201E4908702048007828707C
-S31508005F7001200AE0FBF714F91B49096864318142DC
-S31508005F8002D2002016490870002032BD38B5040038
-S31508005F9000251148FFF75CFF002804D00E48FFF7DC
-S31508005FA061FF207001252800C0B232BD10B501007E
-S31508005FB0C9B20948FFF759FFFBF7F2F804000A349B
-S31508005FC00548FFF74AFF002805D1FDF71DF9FBF73D
-S31508005FD0E7F88442F4D210BD004800404870000833
-S31508005FE0BD14002084120020A8140020BC14002030
-S31508005FF08512002080B500F04BF94021DFF8B40483
-S3150800600000F05AF9DFF8B01408704021DFF8AC0444
-S3150800601000F052F9DFF8A8140870DFF89C0400783D
-S31508006020FF2804D0DFF898040078FF2804D18421DB
-S31508006030DFF89004FCF7A1FC0022DFF88C14DFF8E7
-S315080060408C04FCF7D5FADFF88814DFF88004FCF72F
-S31508006050FBFA0120FCF7B7FCDFF87004FCF7FEFA40
-S3150800606000F07CFDDFF86404D0F8C002FBF761FCA1
-S31508006070FEF7A6FFB0F5FA6F03D24FF4FA60FEF703
-S315080060809CFF01BD80B5DFF84404D0F8C002FBF7D9
-S315080060906EFCDFF83804FCF7C3FA0020FCF793FC23
-S315080060A001BD70B505000C002000C0B2402804DB15
-S315080060B0BB21DFF81004FCF760FC2000C0B200F03A
-S315080060C07DF8C0B2012804D0BF21DFF8F803FCF739
-S315080060D054FC00260FE0FDF797F8300080B2285CE4
-S315080060E000F06CF8C0B2012804D0C821DFF8D40348
-S315080060F0FCF743FC761C30002100C9B280B289B295
-S315080061008842E8D370BD38B504000D00DFF8BC033B
-S31508006110D0F8C002FBF783F9DFF8B8030078002847
-S3150800612019D1DFF8B40300F041F8012811D1DFF8DE
-S31508006130A803007800280CD0DFF89C0300784028D4
-S3150800614007DA0120DFF88C1308700020DFF88C13BB
-S315080061500870002032BDDFF88003DFF88013097865
-S315080061600844401C00F022F80128F2D1DFF86C033D
-S315080061700078401CDFF864130870DFF860030078C5
-S31508006180DFF8541309788842E3D1DFF85003027820
-S3150800619092B2DFF84C132000FEF720FE0020CD490E
-S315080061A00870CE48007828700120D3E780B5010032
-S315080061B0C348007800F005F9C0B202BD80B50100F9
-S315080061C0C9B2BD48007800F090F8C0B202BD38B533
-S315080061D0B948007800F05AF904002000C0B2002837
-S315080061E028D02000C0B2412800DB4024002513E057
-S315080061F06946B148007800F0E4F8C0B2012804D036
-S315080062004FF4A471AF48FCF7B8FB9DF80000B549F8
-S315080062102A00D2B288546D1C28002100C0B2C9B227
-S315080062208842E5D3E4B223009BB2AE4A8121A7484F
-S31508006230FCF768F831BD70B50500002000F00EFDCA
-S3150800624004002900C9B2A148FCF778F80500002621
-S315080062500FE0300080B2215C9948007800F045F8DC
-S31508006260C0B2012804D04FF4B5719648FCF785FBF7
-S31508006270761C3000290080B289B28842E9D300F042
-S31508006280EDFC0200402301219048FCF749F870BD57
-S315080062909549964A002004E088744A6118311832F4
-S315080062A0401C0300DBB2002BF6D08874002048613E
-S315080062B08D488F490860704710B48D4A1268002AC5
-S315080062C001D1FF200FE08A4A12685369884C23607F
-S315080062D011749060D060002353741060C9B20844EA
-S315080062E0401E5060907C10BC704738B504000D0005
-S315080062F02000C0B2022804DB4FF4E1717148FCF7B4
-S315080063003CFB79492200D2B21820424301EB020035
-S31508006310417C754A2300DBB21820434302EB030095
-S31508006320007C814201D100204AE06F492200D2B2A6
-S315080063301820424301EB0200C06805706A49220032
-S31508006340D2B21820424301EB0200417C491C664A3E
-S315080063502300DBB21820434302EB03004174624971
-S315080063602200D2B21820424301EB0200C068411C49
-S315080063705D4A2300DBB21820434302EB0300C160E9
-S3150800638059492200D2B21820424301EB0200416863
-S31508006390554A2300DBB21820434302EB0300C068CA
-S315080063A081420CD250492200D2B218204243895861
-S315080063B04D4AE4B21820444302EB0400C1600120B0
-S315080063C032BD38B504000D002000C0B2022804DB37
-S315080063D04FF4F2713B48FCF7D0FA43492200D2B297
-S315080063E01820424301EB0200407C002801D100201E
-S315080063F04BE03D492200D2B21820424301EB02008D
-S3150800640080680078287038492200D2B218204243A2
-S3150800641001EB0200407C411E334A2300DBB2182000
-S31508006420434302EB030041742F492200D2B21820DD
-S31508006430424301EB02008068411C2B4A2300DBB271
-S315080064401820434302EB0300816027492200D2B299
-S315080064501820424301EB02004168234A2300DBB2BD
-S315080064601820434302EB0300806881420CD21E4980
-S315080064702200D2B21820424389581B4AE4B2182097
-S31508006480444302EB04008160012032BD10B50400CC
-S315080064902000C0B2022804DB4FF401710948FCF75A
-S315080064A06CFA1149E4B21820444301EB0400407C1D
-S315080064B010BD0000C9120020C81200200D130020CC
-S315080064C00C130020C470000870000020D40C0020B3
-S315080064D018000020BF14002090130020BE140020CE
-S315080064E091130020D01300205014002068140020B7
-S315080064F0B0140020F8B516000C000825DFF82402B1
-S31508006500007D012801D1022059E00120DFF814227C
-S31508006510107511F17841B1F5801F01D2012700E00D
-S3150800652002270020DFF8FC11886139004CF2503050
-S3150800653000F08DF80100C9B200293BD1012F08D11E
-S31508006540DFF8E401006850F00200DFF8DC110860AB
-S3150800655007E0DFF8D801006850F00200DFF8CC1138
-S315080065600860BFF36F8FBFF34F8F30682060241D1C
-S31508006570361D6D1E2800C0B20028F6D1BFF36F8FF6
-S31508006580BFF34F8F39004CF2503000F060F8012FFE
-S3150800659008D1DFF89411096831F00201DFF8882183
-S315080065A0116007E0DFF88411096831F00201DFF8AD
-S315080065B07C2111600021DFF86C211175C0B2F2BD93
-S315080065C0DFF864010068C00710D5DFF87401DFF84A
-S315080065D074110860DFF87001DFF868110860DFF8E9
-S315080065E048010068C00701D5012015E0DFF83C0125
-S315080065F00068C0070FD5DFF84801DFF850110860BA
-S31508006600DFF84401DFF84411086048480068C0070D
-S3150800661001D5012000E0002070474348006850F08B
-S3150800662001004149086040480068C00701D40120BC
-S315080066300CE03E48006850F001003C4908603B48C1
-S315080066400068C00701D4012000E000207047F8B5B3
-S3150800665004000D00FAF7B4FD0600012D01D1042748
-S3150800666000E03B4F3B483840B84208D13048006804
-S315080066703840B84201D101200DE000200BE02E4839
-S315080066800068384020F0004027F00041884201D1D8
-S31508006690012000E0002000280BD014F1010FE1D002
-S315080066A0FAF78EFD801B844201D3002CDAD1032031
-S315080066B036E0012D04D11E4801682748014005E04F
-S315080066C01D4801682548014051F0004131F002405B
-S315080066D0002811D0134880690843124A90611D4862
-S315080066E00840884202D11348016003E021F00041C6
-S315080066F012480160012013E0012D08D10C480068FA
-S31508006700C0030CD55FF480300A49086007E00A48E0
-S315080067100068C00303D55FF480300849086000208C
-S31508006720F2BD0000801400200C2000520C210052FB
-S315080067301020005214200052102100521421005239
-S315080067402301674504200052AB89EFCD042100528E
-S31508006750040000800F00EF1F0000EE170000EE9700
-S31508006760F8B504000D000026DFF84002007D012878
-S3150800677001D102208EE00120DFF8301208750020D2
-S31508006780DFF8281288612079C00707D501214CF265
-S315080067905030FFF75CFF002800D0012620798007DB
-S315080067A007D502214CF25030FFF751FF002800D0E0
-S315080067B001263000C0B2002866D1206801282AD1F7
-S315080067C06168206900F067F82079C0070FD50121B4
-S315080067D04CF25030FFF73BFF002800D00126DFF8C7
-S315080067E0D001006830F00800DFF8C411086020798D
-S315080067F0800749D502214CF25030FFF728FF0028C0
-S3150800680000D00126DFF8AC01006830F00800DFF898
-S31508006810A411086038E05FF0FF302860A76800E040
-S315080068207F1CE168A06841188F422DD222696168F1
-S31508006830380000F08EF82079C0070ED501214CF2F9
-S315080068405030FFF704FF0600DFF864010168DFF83F
-S3150800685068010140DFF858010160207980070ED5EC
-S3150800686002214CF25030FFF7F2FE0600DFF8440131
-S315080068700168DFF844010140DFF8380101603000A3
-S31508006880C0B20028CCD02F600020DFF82011087590
-S315080068903000C0B2F2BD11F00302032A26D1DFF898
-S315080068A01011096831F03001DFF804211160DFF8B2
-S315080068B00411096831F03001DFF8F8201160DFF8BB
-S315080068C0F01009680143DFF8E8201160DFF8E410EA
-S315080068D009680843DFF8DC100860DFF8E0000068A4
-S315080068E050F01000DFF8D410086031E0CA0716D55A
-S315080068F0DFF8BC20126832F03002DFF8B4301A60D4
-S31508006900DFF8AC2012680243DFF8A4301A60DFF81B
-S31508006910A020126852F08802DFF894301A608907BE
-S3150800692016D5DFF89010096831F03001DFF88420B9
-S315080069301160DFF8801009680843DFF878100860EE
-S31508006940DFF87000006850F08800DFF8681008600B
-S31508006950704710B4CB0712D5DFF854301B6833F4F0
-S31508006960E663DFF84C402360DFF844301B681343C6
-S3150800697053EA002353F08403DFF834402360890781
-S3150800698012D5DFF83010096831F4E661DFF82430F3
-S315080069901960DFF8201009680A4352EA002252F00B
-S315080069A08402DFF81000026010BC704780140020D3
-S315080069B00C2000520C210052FBF8FFFF1820005251
-S315080069C0006810F001007047C26A1209120189B204
-S315080069D01143C1627047426832F440521143416024
-S315080069E07047826832F4407211438160704710B470
-S315080069F00C2A25D2019CB3F5004F15D14B4BD2B2C8
-S31508006A0053F82220B1FBF2F12200520812EB4102A0
-S31508006A10B2FBF4F189B24FF6F0720A40C1F34201B3
-S31508006A2089B20A43C2600BE0404BD2B253F8222027
-S31508006A30B1FBF2F111EB5401B1FBF4F189B2C1607B
-S31508006A4010BC7047F8B505000F0001260024280081
-S31508006A50FFF7B6FF002864D129683D480140B868A9
-S31508006A6001433869014378690143F869014329609C
-S31508006A70F9682800FFF7AFFFB9692800FFF7B1FFEB
-S31508006A802B48854204D13348FDF789FB040036E0DC
-S31508006A902848854204D13048FDF781FB04002EE0E2
-S31508006AA02548854204D12C48FDF779FB040026E0E9
-S31508006AB02248854204D12848FDF771FB04001EE0F0
-S31508006AC01F48854204D12448FDF769FB040016E0F7
-S31508006AD01C48854204D11F48FDF761FB04000EE0FF
-S31508006AE01948854204D11C48FDF759FB040006E005
-S31508006AF01648854203D11848FDF751FB0400002CBF
-S31508006B000BD07868002808D0002678680090FB69C2
-S31508006B103A6821002800FFF76AFF39682800FFF75E
-S31508006B2053FF3000C0B2F2BD000000003871000803
-S31508006B30001001400044004000480040004C00405E
-S31508006B40005000400014014000780040007C0040DE
-S31508006B50F369FFEF08030007080000070348006809
-S31508006B6050F0807001490860704700000C480258D0
-S31508006B7038B5040000254023022281212000FBF7B6
-S31508006B8063FB4023022201212000FBF75DFB402323
-S31508006B90334A01212000FBF7C3FB2800C0B232BDEF
-S31508006BA038B50400002581212000FBF75FFB012191
-S31508006BB02000FBF75BFB2800C0B232BD10B50B0006
-S31508006BC0172228491C7814F0600F28D15C78062C07
-S31508006BD004D00A2C13D00B2C16D020E05C88A4B263
-S31508006BE0240AA4B2212C06D11F49DA88182A01DB07
-S31508006BF0172200E0DA8892B2FCF7C8FA0FE0012201
-S31508006C001A49FCF7C3FA0AE05988C9B2002903D120
-S31508006C1098781649086002E01900FCF77BFA00200C
-S31508006C2010BD80B5FFF7D3FA002002BD80B5080075
-S31508006C30C0B2FFF700FB002002BD80B590F89C02A9
-S31508006C40032801D1FFF7C3FA002002BD20210180E5
-S31508006C50074870470A210180064870470048704770
-S31508006C60101400205900002062000020B4140020EF
-S31508006C70500000200C000020122008802C48704785
-S31508006C80042008802B48704780B50A00C0B2002847
-S31508006C9004D129492948FCF748FA03E02649274838
-S31508006CA0FCF743FA244802BD80B50A002249244865
-S31508006CB0FCF73BFA204802BD80B51A20088000F090
-S31508006CC022F8204802BD80B50A00C0B2002804D1C7
-S31508006CD019491D48FCF729FA03E017491A48FCF731
-S31508006CE024FA154802BD80B50A00C0B2002804D1AE
-S31508006CF011491648FCF719FA03E00F491348FCF73F
-S31508006D0014FA0D4802BD10B51148006811490C68FF
-S31508006D10114909680818002808D008220F4900F008
-S31508006D2021F804220E49200000F01CF810BD0000CE
-S31508006D308C000020A0000020980F00207472000824
-S31508006D40B8720008A4000020D87200085C72000817
-S31508006D5000E8F11F04E8F11F08E8F11FA60000206B
-S31508006D60B600002030B4002300231AE00400240FE4
-S31508006D7037341D00EDB201F815400AE00400240F6F
-S31508006D800A2CF3D20400240F30341D00EDB201F8AA
-S31508006D901540000100241D00EDB201EB45056C709D
-S31508006DA05B1C1C001500E4B2EDB2AC42E6D330BC65
-S31508006DB0704700002648006850F4700024490860AF
-S31508006DC02448006850F00100224908600020224942
-S31508006DD0086020480168214801401E4801600020DB
-S31508006DE01F49086000201F49086000201E490860E6
-S31508006DF000201E49086000201D49086000201D4922
-S31508006E00086000201C49086000201C490860002012
-S31508006E101B49086000201B49086000201A490860C1
-S31508006E200C48006830F480200A4908600020174999
-S31508006E30086017480068000C0004B0F1005F02D231
-S31508006E400120144908605FF0006013490860704724
-S31508006E5088ED00E000440258104402587FEDF6EA37
-S31508006E60184402581C440258204402582844025820
-S31508006E702C440258304402583444025838440258C4
-S31508006E803C4402584044025844440258604402585C
-S31508006E900010005C0881005108ED00E000000208BF
-S31508006EA000000200010100000000040800000200C2
-S31508006EB002010000000006080000020003010000AD
-S31508006EC000000808000002000401000000000A088B
-S31508006ED0000002000501000000000C080000020086
-S31508006EE00601000000000E0800000200070100006D
-S31508006EF0000010080000020000020000000012084E
-S31508006F000000020001020000000014080000020050
-S31508006F10020200000000160800000200030200003A
-S31508006F2000001808000002000402000000001A0809
-S31508006F30000002000502000000001C080000020014
-S31508006F400602000000001E080000020007020000FA
-S31508006F50433A5C576F726B5C736F667477617265E0
-S31508006F605C4F70656E424C545C5461726765745C24
-S31508006F7044656D6F5C41524D434D375F53544D33F5
-S31508006F803248375F4E75636C656F5F483734335ADE
-S31508006F90495F4941525C426F6F745C757362645F06
-S31508006FA0636F6E662E630000433A5C576F726B5CC4
-S31508006FB0736F6674776172655C4F70656E424C5488
-S31508006FC05C5461726765745C44656D6F5C41524DD3
-S31508006FD0434D375F53544D333248375F4E75636CB4
-S31508006FE0656F5F483734335A495F4941525C426F8F
-S31508006FF06F745C6D61696E2E63000000000000000E
-S315080070000000000000000000000000000000000072
-S315080070100100000002000000030000000400000058
-S31508007020000000000500000000000000000000004D
-S31508007030000000000600000000000000000000003C
-S315080070400000000007000000433A5C576F726B5C53
-S31508007050736F6674776172655C4F70656E424C54E7
-S315080070605C5461726765745C536F757263655C41E5
-S31508007070524D434D375F53544D333248375C727324
-S315080070803233322E63000000433A5C576F726B5CF2
-S31508007090736F6674776172655C4F70656E424C54A7
-S315080070A05C5461726765745C536F757263655C41A5
-S315080070B0524D434D375F53544D333248375C636105
-S315080070C06E2E6300433A5C576F726B5C736F66741F
-S315080070D0776172655C4F70656E424C545C546172A0
-S315080070E06765745C536F757263655C41524D434DB9
-S315080070F0375F53544D333248375C7573622E6300DD
-S3150800710030B4002512E050F8042BD30744BF4A4494
-S31508007110521E091F042942F8045BFAD213468C074B
-S3150800712044BF15809B1CC90748BF1D7050F8041B37
-S315080071300029E8D130BC70470100000002000000B9
-S315080071400400000006000000080000000A00000015
-S315080071500C000000100000002000000040000000A5
-S31508007160800000000001000010B507497944183175
-S31508007170064C7C44163404E00A68081D1144884706
-S315080071800146A142F8D110BD500000006C00000075
-S3150800719005020602060307030803090309040A048D
-S315080071A00B040C040C050D050E050F050F0610063D
-S315080071B0100710084EF68851CEF20001086840F410
-S315080071C070000860BFF34F8FBFF36F8F4FF00070EA
-S315080071D0E1EE100A7047000029FFFFFF00140000C7
-S315080071E0C4000020000000000BADFFFF4C030000A8
-S315080071F0380100000000002000F00DF8002801D03A
-S31508007200FFF7B2FFAFF300800020AFF30080FDF771
-S315080072107FFA00F002F80120704700F001B800007C
-S315080072200746384600F002F8FBE7000080B5AFF3E2
-S315080072300080024A11001820ABBEFBE726000200B8
-S315080072400548014603B4684680F30988AFF3008011
-S31508007250FFF7B0FFFFF7D0FFA5EDF5FE57696E55AE
-S3150800726053422042756C6B20496E74657266616381
-S315080072706500000057696E5553422042756C6B20B5
-S315080072804465766963650000000102030405060784
-S31508007290080C1014182030400000000001020304F6
-S315080072A0010203040607080900000000010203049E
-S315080072B001020304060708094F70656E424C542004
-S315080072C05573657200000000014880470148004771
-S315080072D0B56D00084172000844656661756C7400F6
-S315080072E04F70656E424C5400FFF7FEBFFFF7FEBFB6
-S315080072F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB4
-S31508007300FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA3
-S31508007310FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF93
-S31508007320FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF83
-S31508007330FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF73
-S31508007340FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF63
-S31508007350FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF53
-S31508007360FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF43
-S31508007370FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF33
-S31508007380FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF23
-S31508007390FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF13
-S315080073A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF03
-S315080073B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF3
-S315080073C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE3
-S315080073D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD3
-S315080073E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC3
-S315080073F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB3
-S31508007400FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA2
-S31508007410FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF92
-S31508007420FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF82
-S31508007430FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF72
-S31508007440FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF62
-S31508007450FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF52
-S31508007460FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF42
-S31508007470FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF32
-S31508007480FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF22
-S31508007490FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF12
-S315080074A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF02
-S315080074B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF2
-S315080074C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE2
-S315080074D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD2
-S315080074E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC2
-S315080074F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB2
-S31508007500FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA1
+S31508002D000027688880B2000AC0B201281FD00228AE
+S31508002D1025D0032838D0062800F0BA80072800F006
+S31508002D20C7800F2840F0D680D4F8B002C0690028C2
+S31508002D3007D06946207CD4F8B022D26990470600AD
+S31508002D4004E02900200000F0FBF97F1CC7E0694673
+S31508002D50207CD4F8B022126890470600BFE0207C99
+S31508002D60002808D16846D4F8B412896A884706004C
+S31508002D700220707007E06846D4F8B412C96A88471A
+S31508002D80060002207070AAE0A878002808D0022859
+S31508002D902CD018D304284FD03BD305285FD071E038
+S31508002DA0D4F8B0024068002807D06946207CD4F8D9
+S31508002DB0B02252689047060004E02900200000F07F
+S31508002DC0BFF97F1C63E0D4F8B0028068002807D0FA
+S31508002DD06946207CD4F8B02292689047060004E041
+S31508002DE02900200000F0ACF97F1C50E0D4F8B002AE
+S31508002DF0C068002807D06946207CD4F8B022D2687B
+S31508002E009047060004E02900200000F099F97F1C8D
+S31508002E103DE0D4F8B0020069002807D06946207C56
+S31508002E20D4F8B02212699047060004E02900200071
+S31508002E3000F086F97F1C2AE0D4F8B0024069002821
+S31508002E4007D06946207CD4F8B0225269904706001C
+S31508002E5004E02900200000F073F97F1C17E0D4F87D
+S31508002E60B0028069002807D06946207CD4F8B022D1
+S31508002E7092699047060004E02900200000F060F9F6
+S31508002E807F1C04E02900200000F05AF97F1C26E088
+S31508002E90207C002806D16846D4F8B412496B8847C6
+S31508002EA0060004E02900200000F04AF97F1C16E01D
+S31508002EB0207C002808D16846D4F8B412096B8847E4
+S31508002EC006000720707004E02900200000F038F999
+S31508002ED07F1C04E02900200000F032F97F1CFFB2B5
+S31508002EE0002F1AD1BDF80000002810D0E888002865
+S31508002EF00DD0BDF80000E988884202D3E888ADF80D
+S31508002F000000BDF800203100200000F055F9E888DF
+S31508002F10002802D1200000F073F9F1BD38B504008D
+S31508002F208888002825D1C888002822D14888802882
+S31508002F301FD28D7815F07F0594F89C02032803D1DB
+S31508002F40200000F0FDF817E084F89E522900C9B267
+S31508002F502000FFF7CAF9200000F052F9EDB2002D63
+S31508002F6003D0022084F89C0206E0012084F89C0223
+S31508002F7002E0200000F0E4F831BD38B504000D0089
+S31508002F8068883749087036480078022804D329002B
+S31508002F90200000F0D5F861E094F89C02022802D0DF
+S31508002FA003281ED051E02E480078002815D02C485A
+S31508002FB000786060032084F89C0229480178200084
+S31508002FC0FFF753FB022804D12900200000F0B8F8C7
+S31508002FD044E0200000F014F902E0200000F010F9A7
+S31508002FE03CE01F48007800280ED1022084F89C0295
+S31508002FF01B48007860601A4801782000FFF746FBF6
+S31508003000200000F0FDF81FE0154800786168884246
+S3150800301017D06168C9B22000FFF738FB104800785E
+S3150800302060600F4801782000FFF71FFB022804D1D3
+S315080030302900200000F084F810E0200000F0E0F8F5
+S3150800304002E0200000F0DCF808E02900200000F08B
+S3150800305077F8034801782000FFF718FB31BD000018
+S315080030604C16002080B5CA88012A02D000F068F8FC
+S3150800307016E090F89C22521E012A02D9921E08D008
+S315080030800CE000218160012210F1080100F094F89B
+S3150800309006E00122011D00F08FF801E000F050F86B
+S315080030A001BD80B590F89C22521E022A15D8CA88FE
+S315080030B0022A02D000F044F811E00121C160D0F8DC
+S315080030C0A412002903D0C16851F00201C16002228E
+S315080030D010F10C0100F070F801E000F031F801BDC4
+S315080030E080B54988012904D10121C0F8A41200F04D
+S315080030F087F801BD80B590F89C22521E022A08D88E
+S315080031004988012904D10021C0F8A41200F078F8F2
+S3150800311001E000F015F801BD0A7802704A7842709D
+S315080031208A78CB781B029A1842800A794B791B0257
+S315080031309A1882808A79C97909028918C1807047E4
+S3150800314010B5040080212000FFF79DF8002120001B
+S31508003150FFF799F810BDF8B504000D001700002612
+S31508003160002C1ED0200000F01DF84000801C38807E
+S3150800317038783100C9B26854761C03203100C9B2C8
+S315080031806854761C0AE020783100C9B26854641C79
+S31508003190761C00203100C9B26854761C20780028B5
+S315080031A0F1D1F1BD0200002001E0401C521C11784B
+S315080031B00029FAD1C0B2704780B513000222C0F8C0
+S315080031C094221A0092B2C2611A0092B202629BB2AB
+S315080031D00A000021FFF796F8002002BD80B513000B
+S315080031E09BB20A000021FFF78DF8002002BD80B5CA
+S315080031F013009BB20A000021FFF792F8002002BDD7
+S3150800320080B50421C0F89412002300220021FFF79C
+S3150800321079F8002002BD80B50521C0F89412002374
+S3150800322000220021FFF77CF8002002BD80B5FFF7D9
+S31508003230C1FB01BD80B5FFF7C2FB01BD81617047C7
+S3150800324009048161704715490880704780B5FDF704
+S31508003250A7FF13490968884219D31248007800283D
+S3150800326007D101200F49087080210F48FFF7E6FFB4
+S3150800327006E000200B49087080210B48FFF7E0FFA5
+S31508003280FDF78EFF0549098840180549086001BD04
+S3150800329080B580210448FFF7D3FF01BD44160020FE
+S315080032A030160020471600200004025830B593B0A7
+S315080032B004006846DFF818164C22FEF737FE002C85
+S315080032C001D101205CE12068DFF80816884203D1A5
+S315080032D0206810F580706060A068B0F5407F206CAB
+S315080032E00028A06C0028206D0028206E0028E06DBC
+S315080032F0216E0818002894F89800002805D10020A7
+S3150800330084F89900200000F04DFC2068806930F0B0
+S31508003310100021688861FDF753FF05002068806961
+S3150800332000070FD5FDF74CFF401B0B28F6D3D4F842
+S315080033309C0050F00100C4F89C00032084F8980013
+S3150800334001201DE12068806950F00100216888612C
+S31508003350FDF736FF050020688069C0070FD4FDF722
+S315080033602FFF401B0B28F6D3D4F89C0050F0010021
+S31508003370C4F89C00032084F89800012000E1206826
+S31508003380806950F0020021688861207C012806D1F6
+S315080033902068806930F040002168886105E020686F
+S315080033A0806950F0400021688861607C012806D158
+S315080033B02068806950F480402168886105E02068AB
+S315080033C0806930F4804021688861A07C012806D194
+S315080033D02068806930F480502168886105E020689B
+S315080033E0806950F48050216888612068816931F4C9
+S315080033F04071A0680143206881612068806930F0C7
+S31508003400A400216888612068006930F010002168EE
+S315080034100861E068012806D12068806950F0040038
+S315080034202168886121E0E06800281ED0E06802284B
+S3150800343015D02068806950F080002168886120686E
+S31508003440006950F0100021680861E06803280CD173
+S315080034502068806950F020002168886105E02068AE
+S31508003460806950F0200021688861A069401EE169E2
+S31508003470491E090251EA4061206A401E01436069FB
+S31508003480401E51EA00412068C161A068B0F5407F3E
+S315080034900FD1A06A401EE16A491E50EA0120216B3D
+S315080034A0491E50EA0110616A491E50EA0140216826
+S315080034B0C860206E002807D02068D0F8C010606E5B
+S315080034C001432068C0F8C010E06D216E0818002876
+S315080034D00CD02068D0F8C810C908C9006846A26E82
+S315080034E050F8220001432068C0F8C810206C002854
+S315080034F00CD02068D0F8BC10C908C9006846626CB0
+S3150800350050F8220001432068C0F8BC10A06C0028BF
+S315080035100DD02068D0F8BC0030F070006946E26C27
+S3150800352051F8221050EA01102168C1F8BC00206D3C
+S3150800353000280DD02068D0F8BC0030F4E060694659
+S31508003540626D51F8221050EA01202168C1F8BC00CA
+S315080035502068DFF88013884205D160688068800893
+S315080035608000616888600020C4F894000020C4F8D0
+S315080035709C00012084F89800200000F0C7F9C0B22A
+S3150800358013B030BD10B490F898201300DBB2012BAD
+S3150800359002D0D2B2022A3BD1CA68072A0A68002A90
+S315080035A01ED1CA68072ACA68072A09D10A69CB69D7
+S315080035B01B0253EA02438A69134353F0605309E036
+S315080035C08A68CB68DB0653EA82730A6953EA0243C0
+S315080035D04A691343C06E496810EB8100036015E021
+S315080035E0CA68072ACB680A6952EA4372CB68072B6E
+S315080035F001D18B6903E08C684B6953EA8473006FC9
+S31508003600496810EBC1000260001D0360002006E057
+S31508003610D0F89C1051F00201C0F89C10012010BC93
+S31508003620704710B490F89840012C0BD1019C920079
+S3150800363052EA011252EA430222430068C0F8802087
+S31508003640002006E0D0F89C1051F00401C0F89C1048
+S31508003650012010BC704790F8981001290DD102215D
+S3150800366080F89810016889694908490002689161DB
+S315080036700021C0F89C10002006E0D0F89C1051F0FC
+S315080036800401C0F89C100120704738B590F898508E
+S315080036904C68002CFFD02C00E4B2012C02D0EDB20D
+S315080036A0022D27D193FAA3F4B4FA84F40568D5F861
+S315080036B0C050C5F30545AC4207D3D0F89C1051F06D
+S315080036C02001C0F89C1001201BE00468D4F8CC4007
+S315080036D01C4207D0D0F89C1051F04001C0F89C104D
+S315080036E001200EE093FAA3F3B3FA83F300F00FFA7E
+S315080036F0002006E0D0F89C1051F00201C0F89C109A
+S31508003700012032BD90F89820022A04D10068C0F83A
+S31508003710D010002006E0D0F89C1051F00801C0F83F
+S315080037209C1001207047F0B4002590F89840E4B248
+S31508003730022C40F0C380402927D10468D4F8A04061
+S3150800374014F4FE0F07D1D0F89C1051F02001C0F8F0
+S315080037509C100120B9E00468D4F8A44014F07F0F47
+S3150800376007D1D0F89C1051F48071C0F89C10012044
+S31508003770ABE00468D4F8A440C4F30525466F446C4E
+S3150800378004FB05F416EB84063AE0412927D10468C0
+S31508003790D4F8B04014F4FE0F07D1D0F89C1051F0BD
+S315080037A02001C0F89C1001208FE00468D4F8B440CA
+S315080037B014F07F0F07D1D0F89C1051F48071C0F82F
+S315080037C09C10012081E00468D4F8B440C4F30525B0
+S315080037D0866FC46C04FB05F416EB840610E0046DD2
+S315080037E0A14207D3D0F89C1051F02001C0F89C10D4
+S315080037F001206AE0C66F446D04FB01F416EB8406EB
+S31508003800346814F0804454605468002C04D1346839
+S31508003810C4F38A44146003E0346824F060441460F6
+S31508003820346814F000549460346814F00044146149
+S31508003830341D2668B6B2D661266816F47026D66098
+S31508003840266816F480165661266816F400169661E0
+S315080038502668C6F3066616622668F60F5662241DA3
+S31508003860002602E0A75D9F55761CDFF89C70D2F80B
+S315080038700CC05FEA1C4C17F80C70BE42F2D3402904
+S3150800388003D10068C0F8A85016E0412903D10068A2
+S31508003890C0F8B85010E0202906D2012212FA01F128
+S315080038A00068C0F8981007E0012211F01F0112FA0B
+S315080038B001F10068C0F89C10002006E0D0F89C10C2
+S315080038C051F00801C0F89C100120F0BC70470000B8
+S315080038D0D072000800A000400068D0F8CC0008426A
+S315080038E001D1002000E001207047402905D1006879
+S315080038F0D0F8A40010F07F0004E00068D0F8B40007
+S3150800390010F07F0070470000A4740008426B01683D
+S31508003910D1F884106FF38F0151EA82010368C3F866
+S3150800392084100168D1F8841031F47F01836B51EA61
+S3150800393003410368C3F88410816B8A180168D1F8BB
+S3150800394088106FF38F0151EA82010368C3F8881063
+S315080039500168D1F8881031F4FE01C36B51EA0341BE
+S315080039600368C3F88810C16B12EB41020168D1F8ED
+S31508003970A0106FF38F0151EA82010368C3F8A01003
+S315080039800168D1F8A01031F4FE01036C51EA034135
+S315080039900368C3F8A010036C416C01FB032201689D
+S315080039A0D1F8B0106FF38F0151EA82010368C3F8AA
+S315080039B0B0100168D1F8B01031F4FE01836C51EAF9
+S315080039C003410368C3F8B010836CC16C01FB032282
+S315080039D00168D1F8AC106FF38F0151EA82010368D0
+S315080039E0C3F8AC10036D416D01FB03220168D1F8E1
+S315080039F0F0106FF38F0151EA82010368C3F8F010E3
+S31508003A000168D1F8F01031F47C11836D51EA034155
+S31508003A100368C3F8F010816D12EB41020168D1F812
+S31508003A20C0106FF38F0151EA82010268C2F8C01014
+S31508003A300168D1F8C01031F47C11C26D51EA024117
+S31508003A400268C2F8C0100168D1F8C01031F07C5184
+S31508003A50026E51EA02610268C2F8C010416B4E4A12
+S31508003A6012EB8102C266C16E826B11EB820101679D
+S31508003A70016FC26B11EBC2014167426F036C416C67
+S31508003A804B4312EB83028267826F836CC16C4B4394
+S31508003A9012EB8302C267C26F036D416D4B4312EB93
+S31508003AA08302C0F88020D0F88010826D11EBC20125
+S31508003AB0C0F88410D0F88420C36D816E4B4312EB96
+S31508003AC08302C0F88820D0F88820036E816E4B43A5
+S31508003AD012EB8302C0F89020D0F890102F4A91423A
+S31508003AE00AD3D0F89C1051F02001C0F89C1003218D
+S31508003AF080F89810012009E0C16E02E000220A60F1
+S31508003B00091DD0F890209142F8D30020704770B470
+S31508003B101C004B68002B06D10D698B681D430B688A
+S31508003B2055EA834506E00D698B681D430B681D43FE
+S31508003B3055F080450B6ACE6956EA03668B691E43C3
+S31508003B404B691E43CB681E43D0F88430806E4443CD
+S31508003B5013EB84031D60181D0660031D002412E084
+S31508003B6002EB0400C07802EB0405AD782D0455EA93
+S31508003B70006502EB0400407855EA0025105D054310
+S31508003B801D601B1D241D0648CD682D0C405D844212
+S31508003B90E6D370BC7047000000AC0040FDD300407F
+S31508003BA0A474000870470000DFF838070068400C66
+S31508003BB010F001007047DFF82C070068800810F045
+S31508003BC001007047DFF81C07006810F018007047FE
+S31508003BD0DFF810070068000A10F001007047DFF8E8
+S31508003BE008070068400810F001007047DFF8FC0677
+S31508003BF0006810F038007047DFF8F406006810F423
+S31508003C0070607047DFF8E806006810F00F0070472C
+S31508003C10DFF8E006006810F070007047DFF8D40699
+S31508003C20006810F4E060704700F0FF02DFF8CC1679
+S31508003C308A1811680200120E03001B0A13F01F03EC
+S31508003C409A4011400200120A12F01F02D14050EAAF
+S31508003C500140704780B5FFF7E7FF02BDDFF8A00611
+S31508003C60006810F003007047DFF898060068400EF9
+S31508003C7010F001007047DFF890060068000C10F09D
+S31508003C8001007047DFF880060068400C10F001005C
+S31508003C907047DFF874060068800C10F00100704762
+S31508003CA0DFF86406006810F001007047DFF85C066C
+S31508003CB00068C005C00D401C7047DFF84406006860
+S31508003CC0C0F305107047DFF844060068C0F34620C5
+S31508003CD0401C7047DFF834060068C0F30640401CF5
+S31508003CE07047DFF828060068C0F30660401C704776
+S31508003CF0DFF81C060068C0F3CC007047DFF804063E
+S31508003D000068C00E10F001007047DFF8FC05006877
+S31508003D10C00C10F001007047DFF8EC050068000DD4
+S31508003D2010F001007047DFF8E0050068400D10F05C
+S31508003D3001007047DFF8D0050068000910F001009F
+S31508003D407047DFF8D0050068C005C00D401C7047F5
+S31508003D50DFF8AC050068C0F305307047DFF8B40536
+S31508003D600068C0F34620401C7047DFF8A8050068C5
+S31508003D70C0F30640401C7047DFF898050068C0F39A
+S31508003D800660401C7047DFF8A0050068C0F3CC0049
+S31508003D907047DFF870050068400F10F001007047A3
+S31508003DA0DFF864050068800D10F001007047DFF841
+S31508003DB058050068C00D10F001007047DFF8480587
+S31508003DC00068000E10F001007047DFF83C05006837
+S31508003DD0000A10F001007047DFF850050068C005BA
+S31508003DE0C00D401C7047DFF818050068C0F3055081
+S31508003DF07047DFF838050068C0F34620401C704756
+S31508003E00DFF828050068C0F30640401C7047DFF855
+S31508003E101C050068C0F30660401C7047DFF81005F3
+S31508003E200068C0F3CC00704780B5DFF8B8040068B6
+S31508003E3050F00100DFF8AC140860FFF7BCFE00285C
+S31508003E40FBD00020DFF8A4140860DFF898040168A6
+S31508003E50DFF8C4040140DFF88C040160FFF704FFB3
+S31508003E600028FBD1FFF74AFF0028FBD1FFF791FF97
+S31508003E700028FBD10020DFF8781408600020DFF85E
+S31508003E80741408600020DFF870140860DFF88C04EA
+S31508003E90DFF86C140860DFF88804DFF86C14086033
+S31508003EA0DFF88004DFF8641408600020DFF8601487
+S31508003EB00860DFF87004DFF85C1408600020DFF89B
+S31508003EC068140860DFF85C04DFF8601408600020F6
+S31508003ED0DFF85C140860DFF80C04006830F4802012
+S31508003EE0DFF8001408600020DFF848140860DFF8DF
+S31508003EF04804016840F2FF700143DFF83C040160A2
+S31508003F00DFF83804006850F48030DFF830140860B1
+S31508003F1001BD2DE9FC41070000260025FFF79EFE9E
+S31508003F20002803D0022813D00BD318E0FFF743FE6E
+S31508003F30002805D0DFF80864FFF744FEC008C6402D
+S31508003F400DE0FFF745FE002801D0DFF8F86306E02C
+S31508003F50FFF72AFE002801D0DFF8EC63FFE7002010
+S31508003F603860002078600020B860FFF7A6FE0400DD
+S31508003F70FFF79CFE8046FFF793FE002802D0FFF766
+S31508003F80B7FE0500002C29D0FFF775FE002809D0DA
+S31508003F90FFF799FE00902B0042462100300000F002
+S31508003FA0EFF83860FFF76EFE002809D0FFF792FE9B
+S31508003FB000902B0042462100300000F0E1F87860BE
+S31508003FC0FFF767FE002809D0FFF78BFE00902B004D
+S31508003FD042462100300000F0D3F8B860BDE8F3810E
+S31508003FE02DE9FC41070000260025FFF737FE0028CB
+S31508003FF003D0022813D00BD318E0FFF7DCFD002806
+S3150800400005D0DFF83C63FFF7DDFDC008C6400DE0CC
+S31508004010FFF7DEFD002801D0DFF8286306E0FFF78A
+S31508004020C3FD002801D0DFF82063FFE700203860D1
+S31508004030002078600020B860FFF78AFE0400FFF7CA
+S3150800404080FE8046FFF776FE002802D0FFF79BFE2B
+S315080040500500002C29D0FFF758FE002809D0FFF7E5
+S315080040607DFE00902B0042462100300000F088F8C3
+S315080040703860FFF751FE002809D0FFF776FE00905A
+S315080040802B0042462100300000F07AF87860FFF7EE
+S315080040904AFE002809D0FFF76FFE00902B00424623
+S315080040A02100300000F06CF8B860BDE8F3812DE916
+S315080040B0FC41070000240026FFF7D0FD002803D0A6
+S315080040C0022813D00BD318E0FFF775FD002805D09A
+S315080040D0DFF86C42FFF776FDC008C4400DE0FFF735
+S315080040E077FD002801D0DFF85C4206E0FFF75CFDAB
+S315080040F0002801D0DFF85042FFE700203860002092
+S3150800410078600020B860FFF76EFE0500FFF764FED2
+S315080041108046FFF75AFE002802D0FFF77FFE06000A
+S31508004120002D2BD0002C29D0FFF73AFE002809D005
+S31508004130FFF75FFE0090330042462900200000F09A
+S315080041401FF83860FFF733FE002809D0FFF758FE3E
+S315080041500090330042462900200000F011F87860EC
+S31508004160FFF72CFE002809D0FFF751FE0090330018
+S3150800417042462900200000F003F8B860BDE8F38144
+S3150800418000EE100A00EE901A01EE102A01EE903A9F
+S315080041909DED002AB8EE400AF8EE600A80EE200A85
+S315080041A0F8EE410AB8EE611ADFED4D1A81EE211AD2
+S315080041B070EE810A20EE200AF8EE420A80EE200A06
+S315080041C0BCEEC00A10EE100A70471FB50024FFF7B0
+S315080041D041FDDFF87811884240D0DFF87411884233
+S315080041E028D0DFF8701188424CD0DFF86C1188426D
+S315080041F048D0DFF8681188424DD0DFF8641188424C
+S3150800420049D0DFF8601188424ED0DFF85C11884249
+S315080042104AD0DFF85811884251D0DFF85411884245
+S315080042204DD0DFF85011884250D0DFF84C11884243
+S315080042304CD052E000F0A4F80400FFF7DDFCDFF8EC
+S315080042403C11C0F30320085C10F01F00C440200096
+S3150800425000F0B5F800F0CEF804003EE000F090F863
+S315080042600400FFF7C9FCDFF81411C0F30320085C4B
+S3150800427010F01F00C440200000F0A1F800F0ACF8D0
+S3150800428004002AE0FFF73AFD002803D06846FFF746
+S31508004290A7FE019C21E0FFF77CFD002803D06846B5
+S315080042A0FFF705FF019C18E0FFF785FC002805D0FD
+S315080042B0DFF88C40FFF786FCC008C4400DE0FFF726
+S315080042C087FC002801D0DFF87C4006E0FFF787FC72
+S315080042D0002801D04FF40044FFE7200004B010BDC9
+S315080042E00000004600440258704402581044025820
+S315080042F0184402581C440258204402584C44025898
+S3150800430028440258004402582C44025830440258A3
+S31508004310344402583844025845EDF6EA00020202CF
+S315080043200000FF01800201013C4402584044025843
+S31508004330444402586044025868440258D04402581B
+S315080043400090D00300093D0000127A00080000071B
+S315080043500803000708000107080301070800020709
+S3150800436008030207080003070803030708000407F1
+S31508004370080304070800050708030507B4740008BE
+S315080043801FB50024FFF732FC002806D008280AD0FB
+S3150800439010280AD018280AD00EE01E4CFFF712FC87
+S315080043A0C008C44008E01A4C06E01B4C04E0684606
+S315080043B0FFF7AFFD009CFFE7200004B010BD10B565
+S315080043C00400FFF71FFC154910F00F00085C10F0F9
+S315080043D01F00C440200010BD10B50400FFF718FCEC
+S315080043E00E49C0F30210085C10F01F00C4402000FC
+S315080043F010BD000010B50400FFF710FC0749C0F314
+S315080044000220085C10F01F00C440200010BD000008
+S3150800441000093D000090D00300127A00B474000829
+S315080044205FF0FF30DFF8941508605FF0FF30DFF8C3
+S31508004430901508607047F8B504000D0016000127AE
+S31508004440DFF88005D0F8A810DFF87805D0F8AC00BA
+S315080044504118491E091B681E814200D200273800F0
+S31508004460C0B201280BD1200000F07EFAFF2805D043
+S315080044702819401E00F078FAFF2800D100273800D6
+S31508004480C0B201281AD12100890A4FF4806041433D
+S31508004490DFF830050068814208D12B003200210080
+S315080044A0DFF81C0500F027F9070007E02B003200AB
+S315080044B02100DFF8080500F01EF907003800C0B231
+S315080044C0F2BDF8B504000D000126FF27FF20DFF82E
+S315080044D0F414D1F8A820DFF8EC14D1F8AC108A1837
+S315080044E0521E121B691E8A4200D200263100C9B22A
+S315080044F0012911D1200000F037FA07002C19641E93
+S31508004500200000F031FA3900C9B2FF2903D00100B2
+S31508004510C9B2FF2900D100263100C9B2012906D146
+S315080045200100C9B23800C0B200F0B7F90600300081
+S31508004530C0B2F2BD80B5012000210091DFF88014D9
+S31508004540096811F1010F3CD00100C9B2012938D11F
+S315080045500099DFF86C044068411800910099DFF86B
+S3150800456060048068411800910099DFF85404C06817
+S31508004570411800910099DFF8480400694118009134
+S315080045800099DFF83C044069411800910099DFF86A
+S3150800459030048069411800910099DFF82404C06945
+S315080045A0411800910098C04300900098401C009064
+S315080045B06A460421DFF80C04006810F52670FFF738
+S315080045C03AFFC0B202BD01200022DFF8F8130968DD
+S315080045D009688A18DFF8EC130968091D09688A183A
+S315080045E0DFF8E0130968083109688A18DFF8D41378
+S315080045F009680C3109688A18DFF8C8130968103188
+S3150800460009688A18DFF8BC130968143109688A181A
+S31508004610DFF8B0130968183109688A18DFF8A41397
+S31508004620096811F5267109688A18002A00D0002041
+S31508004630C0B2704710B50124DFF88403006810F192
+S31508004640010F06D0DFF8780300F0A9F8002800D19A
+S3150800465000242000C0B201280CD1DFF860030068EE
+S3150800466010F1010F06D0DFF8540300F098F800287F
+S3150800467000D100242000C0B210BDDFF8480300684E
+S31508004680704710B501248A0500D000242200D2B252
+S31508004690012A08D102688A4205D001604FF4806277
+S315080046A0001D00F0B9F92000C0B210BD70B50500B4
+S315080046B00E000020C248854202D1C04D2C000FE0F2
+S315080046C0C0480068864204D1BD4DBE4806682C0025
+S315080046D006E02C00280000F062F8002800D100242B
+S315080046E0002C06D031002800FFF7CBFF002800D1A8
+S315080046F00024200070BD2DE9F84304008946904641
+S315080047001D0001274E46B60A4FF4806046432068CE
+S3150800471010F1010F06D131002000FFF7B2FF002883
+S3150800472000D100273800C0B201280AD12068B0425B
+S3150800473007D031002000FFF7B9FF0400002C00D194
+S3150800474000273800C0B2012825D12068B9EB000936
+S3150800475004EB090010F10409FEF76CFD201DB9EB06
+S315080047600000B0F5806F09D316F580612000FFF7C9
+S315080047709DFF0400002C0DD014F1040998F80000E0
+S3150800478089F8000019F1010918F101086D1E002DBC
+S31508004790E2D100E000273800C0B2BDE8F2832DE977
+S315080047A0F843040001262025206800F0DDF8FF28DC
+S315080047B000D100263000C0B201283ED100F0A4F98D
+S315080047C0002700E07F1C4FF480602900C9B290FBE7
+S315080047D0F1F087422FD22068A8465FFA88F808FBCE
+S315080047E007082800C0B200FB07F0204410F10409AE
+S315080047F0FEF720FD4A464146012000F01FF9002831
+S3150800480001D1002002E0002615E0401C01002A0024
+S31508004810C9B2D2B291420AD20100C9B218F801103F
+S315080048200200D2B219F802209142EED000263000DA
+S31508004830C0B20028C6D100F094F93000C0B2BDE875
+S31508004840F283F8B501245F4A0300DBB20C214B431F
+S31508004850D5585C4AC0B20C2148431044466815F046
+S31508004860030F02D116F0030F04D04FF44B715648CC
+S31508004870FEF783F8002701E02D1D7F1CB7EB960F86
+S3150800488008D2380601D1FEF7D5FC286810F1010FC9
+S31508004890F2D000242000C0B2F2BD70B586B0060082
+S315080048A00C0001250020009020003100C0B2C9B2DA
+S315080048B0884200D200252800C0B2012804D1200071
+S315080048C0C0B20F2800D300252800C0B2012847D15E
+S315080048D000F01AF91EE000200190202005903949C1
+S315080048E03200D2B20C20424301EB0200407A029019
+S315080048F034493200D2B20C20424301EB0200007A5E
+S31508004900039001200490694601A800F0CDF900281B
+S3150800491023D1761C20003100C0B2C9B288421DD30B
+S315080049203000C0B2FFF78DFF0028F2D1FEF782FCF7
+S3150800493024493200D2B20C2042438958214A330016
+S31508004940DBB20C20434302EB0300406811F1010F70
+S3150800495001D00028BFD1002500E0002500F001F9AC
+S315080049602800C0B206B070BD70B50400FF25002649
+S3150800497000E0761C3000C0B20F281BD2FEF75AFCA6
+S3150800498010493200D2B20C20424388588442F0D3F0
+S315080049900C493200D2B20C2042438958094A3300E6
+S315080049A0DBB20C20434302EB0300406841188C42FB
+S315080049B0DFD235002800C0B270BD00009405002083
+S315080049C098090020007000088871000880B500F07A
+S315080049D09BFA01BD10B500F0A7FA002816D0FDF71E
+S315080049E0D9FF002812D000F0F0FA00F079FBFCF7A6
+S315080049F0C3FB00F09DFA064908400649086000F026
+S31508004A0097FA001D046800F081FAA04710BD00005F
+S31508004A1080FFFF1F08ED00E070B504000D001600CA
+S31508004A2005E0287820706D1C641CFEF703FC300036
+S31508004A30461E80B20028F4D170BD0000F8B51600F5
+S31508004A400C000825DFF82402007D012801D1022088
+S31508004A5059E00120DFF81422107511F17841B1F5FB
+S31508004A60801F01D2012700E002270020DFF8FC1191
+S31508004A70886139004CF2503000F08DF80100C9B257
+S31508004A8000293BD1012F08D1DFF8E401006850F076
+S31508004A900200DFF8DC11086007E0DFF8D8010068DB
+S31508004AA050F00200DFF8CC110860BFF36F8FBFF338
+S31508004AB04F8F30682060241D361D6D1E2800C0B239
+S31508004AC00028F6D1BFF36F8FBFF34F8F39004CF232
+S31508004AD0503000F060F8012F08D1DFF8941109680A
+S31508004AE031F00201DFF88821116007E0DFF8841150
+S31508004AF0096831F00201DFF87C2111600021DFF836
+S31508004B006C211175C0B2F2BDDFF864010068C007F8
+S31508004B1010D5DFF87401DFF874110860DFF870014A
+S31508004B20DFF868110860DFF848010068C00701D59A
+S31508004B30012015E0DFF83C010068C0070FD5DFF853
+S31508004B404801DFF850110860DFF84401DFF8441126
+S31508004B50086048480068C00701D5012000E0002029
+S31508004B6070474348006850F00100414908604048D2
+S31508004B700068C00701D401200CE03E48006850F0E8
+S31508004B8001003C4908603B480068C00701D4012081
+S31508004B9000E000207047F8B504000D00FCF710FB94
+S31508004BA00600012D01D1042700E03B4F3B48384061
+S31508004BB0B84208D1304800683840B84201D10120CF
+S31508004BC00DE000200BE02E480068384020F0004039
+S31508004BD027F00041884201D1012000E0002000288A
+S31508004BE00BD014F1010FE1D0FCF7EAFA801B8442DE
+S31508004BF001D3002CDAD1032036E0012D04D11E485A
+S31508004C0001682748014005E01D480168254801401C
+S31508004C1051F0004131F00240002811D01348806954
+S31508004C200843124A90611D480840884202D1134839
+S31508004C30016003E021F0004112480160012013E001
+S31508004C40012D08D10C480068C0030CD55FF48030EC
+S31508004C500A49086007E00A480068C00303D55FF4FC
+S31508004C608030084908600020F2BD00000C160020BC
+S31508004C700C2000520C210052102000521420005221
+S31508004C8010210052142100522301674504200052C6
+S31508004C90AB89EFCD04210052040000800F00EF1FFE
+S31508004CA00000EE170000EE97F8B504000D00002688
+S31508004CB0DFF84002007D012801D102208EE00120A4
+S31508004CC0DFF8301208750020DFF82812886120798D
+S31508004CD0C00707D501214CF25030FFF75CFF0028CA
+S31508004CE000D001262079800707D502214CF25030E2
+S31508004CF0FFF751FF002800D001263000C0B2002877
+S31508004D0066D1206801282AD16168206900F067F811
+S31508004D102079C0070FD501214CF25030FFF73BFF31
+S31508004D20002800D00126DFF8D001006830F008001E
+S31508004D30DFF8C41108602079800749D502214CF2B2
+S31508004D405030FFF728FF002800D00126DFF8AC0115
+S31508004D50006830F00800DFF8A411086038E05FF05A
+S31508004D60FF302860A76800E07F1CE168A06841184A
+S31508004D708F422DD222696168380000F08EF82079BA
+S31508004D80C0070ED501214CF25030FFF704FF06008C
+S31508004D90DFF864010168DFF868010140DFF85801AF
+S31508004DA00160207980070ED502214CF25030FFF7BA
+S31508004DB0F2FE0600DFF844010168DFF8440101400D
+S31508004DC0DFF8380101603000C0B20028CCD02F606F
+S31508004DD00020DFF8201108753000C0B2F2BD11F0CE
+S31508004DE00302032A26D1DFF81011096831F03001D1
+S31508004DF0DFF804211160DFF80411096831F0300189
+S31508004E00DFF8F8201160DFF8F01009680143DFF8D1
+S31508004E10E8201160DFF8E41009680843DFF8DC10C1
+S31508004E200860DFF8E000006850F01000DFF8D410E2
+S31508004E30086031E0CA0716D5DFF8BC20126832F0E0
+S31508004E403002DFF8B4301A60DFF8AC20126802438B
+S31508004E50DFF8A4301A60DFF8A020126852F0880242
+S31508004E60DFF894301A60890716D5DFF890100968BC
+S31508004E7031F03001DFF884201160DFF8801009680E
+S31508004E800843DFF878100860DFF87000006850F013
+S31508004E908800DFF868100860704710B4CB0712D591
+S31508004EA0DFF854301B6833F4E663DFF84C402360C0
+S31508004EB0DFF844301B68134353EA002353F0840396
+S31508004EC0DFF834402360890712D5DFF83010096807
+S31508004ED031F4E661DFF824301960DFF8201009683C
+S31508004EE00A4352EA002252F08402DFF810000260F8
+S31508004EF010BC70470C1600200C2000520C210052E2
+S31508004F00FBF8FFFF1820005272B6704762B670476A
+S31508004F1080B5FFF785FA01BD80B5FFF78CFA02BDAB
+S31508004F2080B5FFF7CEFA02BD80B5FFF74CFB02BD90
+S31508004F3080B5FFF7A2FB02BD80B5FFF7FBFA002894
+S31508004F4001D1002001E0FFF775FB02BD80B500F036
+S31508004F5037F900F02BFC01204349087000F06CFD7E
+S31508004F6000204149087000F029FE02203E490870D9
+S31508004F7001BD80B569463D4800F0FDFC012807D112
+S31508004F800120394908709DF80010384800F047F9A3
+S31508004F906946364800F090FD012807D100203249BD
+S31508004FA008709DF80010314800F039F969462F4815
+S31508004FB000F08DFE012807D102202B4908709DF8C4
+S31508004FC000102A4800F02BF901BD80B500F03EFE1E
+S31508004FD001BD38B504000D0023480078012804D126
+S31508004FE02900C9B2200000F085FC1F480078002877
+S31508004FF004D12900C9B2200000F03DFD1A48007806
+S31508005000022804D12900C9B2200000F02EFE00F0C3
+S3150800501000F931BD14480078002805D0022807D0C9
+S3150800502004D3032806D007E0812006E0082004E020
+S315080050303F2002E0002000E0812080B270470A4845
+S315080050400078002805D0022807D004D3032806D004
+S3150800505007E0812006E0082004E03F2002E0002067
+S3150800506000E0812080B27047880100208C13002060
+S3150800507010B5002400F0C3F8002800D00124200051
+S31508005080C0B210BD80B5032001F075F8FDF774F9BC
+S31508005090DFF8F810DFF8F8201268C2F30322895CFB
+S315080050A011F01F01C840DFF8E410DFF8E4201268A9
+S315080050B012F00F02895C11F01F010200CA40DFF8E6
+S315080050C0D4100A60DFF8D0100860002001F07AF8E2
+S315080050D0002801D0012002E001F0A1FA002002BD5B
+S315080050E080B57FF00040DFF8B41008600020DFF8D4
+S315080050F0AC1008605FF0FF30DFF8A41008600020ED
+S31508005100DFF89C1008605FF0FF30DFF89810086041
+S315080051100020DFF8901008605FF0FF30DFF8881095
+S3150800512008600020DFF8801008605FF0FF30DFF8C5
+S315080051307C1008600020DFF8741008605FF0FF300C
+S31508005140DFF86C1008600020DFF8641008605FF074
+S31508005150FF30DFF8601008600020DFF8581008609C
+S315080051605FF0FF30DFF8501008600020DFF84810C5
+S3150800517008605FF0FF30DFF8441008600020DFF8B1
+S315080051803C10086001F0B6FA002002BDC47400089D
+S315080051901844025808000020040000207C440258E5
+S315080051A08044025884440258884402588C44025861
+S315080051B09044025894440258984402589C44025811
+S315080051C00020DFF8041581F881000020DFF8F814C4
+S315080051D0C1F888000020DFF8F01481F88400002068
+S315080051E0DFF8E414A1F886000020DFF8DC1481F863
+S315080051F083000020DFF8D01481F882007047DFF8BA
+S31508005200C80490F88100002801D1002000E00120A0
+S3150800521070470020DFF8B01481F88400704780B525
+S315080052200178FF291ED100F0B3F8DFF89C0490F846
+S315080052308400012802D1102000F085F8DFF88804E0
+S31508005240B0F9860001280CDB0120DFF87C1481F810
+S315080052508400DFF87404B0F98610DFF86C0400F0F7
+S3150800526054F801BDDFF8601491F8811001294BD17B
+S315080052700178C92932D0CC293FD0CF293AD0D029B4
+S315080052802FD0D12933D0D2292ED0F32917D0F429FB
+S315080052900FD0F5290AD0F6290ED0FA2912D0FC2902
+S315080052A013D0FD2914D0FE2915D029E000F0FEF808
+S315080052B0BBE700F021F9B8E700F0E9F8B5E700F038
+S315080052C047F9B2E700F0C9F8AFE700F0C1F8ACE774
+S315080052D000F0A5F8A9E700F093F8A6E700F075F93D
+S315080052E0A3E700F098F9A0E700F053F99DE700F06E
+S315080052F0C7F99AE700F0DDF997E700F0EDF994E7CA
+S31508005300202000F020F890E7ABE780B589B2FFF7D8
+S3150800531060FE01BDF8B504000D001600002704E084
+S315080053202078C719641CFDF785FF2800451E00284C
+S31508005330F6D1FFB237600120F2BD0020DFF88813EE
+S3150800534081F882007047FE21DFF87C231170DFF8B0
+S31508005350781348700220DFF87013A1F886007047AA
+S31508005360010000200A7810434A7850EA02208A7819
+S3150800537050EA0240C97850EA016070470870020096
+S31508005380120A4A700200120C8A70000EC870704722
+S3150800539080B5FFF7D2FF0120DFF82C1381F88100D2
+S315080053A0FF20DFF8241308700020DFF81C1348706C
+S315080053B0C548407850F01000C34948700020C249DB
+S315080053C08870C1488078C0498870FFF723FEBE49B7
+S315080053D0C870FFF734FEBC490871FFF730FE80B28B
+S315080053E0000AB94948710120B74988710120B649B0
+S315080053F0C8710820B449A1F88600FFF789FD01BDE8
+S3150800540080B50020B04981F88100FFF796FFFF209C
+S31508005410AD4908700120AC49A1F8860001BDFF20FE
+S31508005420A94908700020A8494870A74890F8820042
+S31508005430A54988700020A449C8700020A2490871AF
+S315080054400020A149487106209F49A1F886007047A7
+S3150800545080B50020FFF777FF01BD80B5FF209A4988
+S3150800546008709A489849C1F88800002096494870FB
+S3150800547000209549887000209349C87007209449F0
+S31508005480FFF77CFF08209049A1F8860001BD80B58A
+S31508005490FF218D4A1170001DFFF762FF8A49C1F886
+S315080054A0880001208849A1F8860001BD10B50400CE
+S315080054B0FFF7B0FD80B2401E6178884203DA2220E9
+S315080054C0FFF741FF17E06278824892B27E49D1F829
+S315080054D08810FFF7A1FAFF207B4908707A48D0F8B0
+S315080054E08800617840187849C1F888006078401CBF
+S315080054F07549A1F8860010BD10B50400FFF78AFDAE
+S3150800550080B2401E6178884203DA2220FFF71BFF2B
+S315080055101DE0201DFFF724FF6B49C1F8880062785B
+S315080055206C4892B26849D1F88810FFF775FAFF20DF
+S31508005530654908706448D0F888006178401862495F
+S31508005540C1F888006078401C5F49A1F8860010BD44
+S3150800555080B500210091FF215B4A1170001DFFF7FD
+S31508005560FFFE6A4601005848D0F88800FFF7D2FEC9
+S315080055705549487056490098FFF700FF00205249E0
+S31508005580887000205049C87008204F49A1F8860045
+S3150800559001BD80B5FF204C49087000204A49487073
+S315080055A0002049498870FFF735FD4749C870002033
+S315080055B045490871002044494871002042498871CC
+S315080055C007204149A1F8860001BD10B50400FFF780
+S315080055D021FD621C80B2401E01003B48D0F88800BD
+S315080055E0FFF79AFC002803D13120FFF7ACFE11E043
+S315080055F0FF2035490870FFF70DFD3349D1F88810AB
+S3150800560080B2401E40183049C1F8880001202E4952
+S31508005610A1F8860010BD10B50400FFF7FBFC80B2A8
+S31508005620801E6178884203DA2220FFF78CFE26E086
+S31508005630FF202549087001202349A1F886006078D3
+S31508005640002807D1FFF778FC002802D13120FFF7A0
+S315080056507AFE14E0A21C61781B48D0F88800FFF790
+S315080056605BFC002803D13120FFF76DFE07E01648E2
+S31508005670D0F88800617840181349C1F8880010BD31
+S3150800568010B51149D1F88840001DFFF769FE0100E1
+S315080056902000FFF745FC002803D13120FFF753FE11
+S315080056A006E0FF200849087001200749A1F886008E
+S315080056B010BD80B5FFF78EF9FF2003490870012059
+S315080056C00149A1F8860001BD00130020FC740008FA
+S315080056D0041300200113002080B53120FFF733FEA4
+S315080056E001BD0000C249096831F040510843C0496C
+S315080056F008607047F8B507000C0015001E0000206A
+S31508005700FFF7F0FF4FF4FA51002200E0521C100098
+S31508005710C0B2122848D2380080B2B64B94465FFA17
+S315080057208CFC13F81C30DFF8CCC296465FFA8EFE66
+S315080057300CEB4E0C9CF801C01CEB03035B1C584396
+S31508005740B1FBF0F300FB13100028DFD1380080B25C
+S31508005750A84B94465FFA8CFC13F81C30DFF894C209
+S3150800576096465FFA8EFE0CEB4E0C9CF801C01CEBBD
+S3150800577003035B1C5843B1FBF0F020802088002807
+S31508005780C4D0208840F201239842BFDA9948110014
+S31508005790C9B210F8110028709648D2B200EB420040
+S315080057A040783070012000E00020F2BD10B58AB0C4
+S315080057B00020ADF8060000208DF8050000208DF8C1
+S315080057C0040040F2676401AB0DF105020DF1060114
+S315080057D04FF4FA70FFF78EFF002803D1B8218648E8
+S315080057E0FDF7CBF88548864908600020844988601B
+S315080057F000208349C8600120814908740020804937
+S31508005800487400207E498874BDF806007C494861C2
+S3150800581001207B4988619DF805007949C8619DF892
+S3150800582004007749086201207549486201207449D5
+S31508005830886201207249C862012071490863002004
+S315080058406F494863002C06D401206D4988630020FF
+S315080058506B49C86305E000206949886301206849E7
+S31508005860C863012066490864042065494864002025
+S315080058706349886404206249C86400206049086551
+S3150800588004205F49486500205D49886501205C4918
+S31508005890C86500205A490866002059494866042008
+S315080058A0574988665648FDF701FD002C02D40020AA
+S315080058B0029004E05FF08040029024F0004400204B
+S315080058C00390012004900120059006940794002077
+S315080058D0089002A94A48FDF755FE012000900123C9
+S315080058E0022202214648FDF79CFE4548FDF7B3FE15
+S315080058F00AB010BD18B589B0020040F2E170002860
+S3150800590003D400900020019005E020F000400090AC
+S315080059105FF08040019000200290C9B2090403910B
+S315080059200020049000200590002006900020079093
+S3150800593052200890012369463148FDF7A6FEC0B2F9
+S31508005940002816D101212E48FDF7DCFEC0B200283A
+S315080059500FD1FBF725FC0400323401212848FDF756
+S31508005960BBFF002805D0FDF765FCFBF719FC844250
+S31508005970F3D20AB010BD2DE9F0418AB006000C003A
+S31508005980002540F267675FF0010840211C48FDF7D3
+S31508005990ACFF002806D033006A4640211848FDF7B8
+S315080059A0C2FE80465FFA88F8B8F1000F1AD1002FB8
+S315080059B007D40098B8420ED1019800280BD10125CA
+S315080059C009E027F000470098B84204D10198B0F1E1
+S315080059D0804F00D101252800C0B2012802D10398C2
+S315080059E0000C20702800C0B20AB0BDE8F0810000A3
+S315080059F050440258AC7300083072000800A00040FA
+S31508005A0060120020016851F00101016070470168C9
+S31508005A104908490001607047C069400910F0010053
+S31508005A207047C069C00910F001007047406AC0B2EB
+S31508005A307047C9B28162704780B588B05848FFF789
+S31508005A40E6FF002000904FF461400190002002908C
+S31508005A5000200390002004900C200590002006905A
+S31508005A600020079069464E4800F0ECFE4C48FFF7C8
+S31508005A70C9FF09B000BD70B504000D002800C0B20A
+S31508005A80822803DB84214748FCF777FF2800C0B249
+S31508005A9000F070F8002607E0FDF7CCFB300080B276
+S31508005AA0205C00F067F8761C30002900C9B280B285
+S31508005AB089B28842F0D370BD38B504000D003A4863
+S31508005AC00078002817D1394800F044F801283FD15A
+S31508005AD03648007800283BD034480078822837DAE0
+S31508005AE0FBF75EFB32490860002032490870012046
+S31508005AF02D4908702CE02D482E4909780844401C89
+S31508005B0000F028F8012819D12A480078401C2949AC
+S31508005B1008702848007825490978884218D1254808
+S31508005B20027892B224492000FEF776FF00201E492B
+S31508005B30087020480078287001200AE0FBF730FB3F
+S31508005B401B490968C831814202D2002016490870EB
+S31508005B50002032BD38B5040000251148FFF75CFF68
+S31508005B60002804D00E48FFF761FF207001252800A1
+S31508005B70C0B232BD10B50100C9B20948FFF759FFD6
+S31508005B80FBF70EFB04000A340548FFF74AFF002816
+S31508005B9005D1FDF74FFBFBF703FB8442F4D210BD9A
+S31508005BA000480040DC710008491600201014002047
+S31508005BB034160020481600201114002080B500F085
+S31508005BC04BF94021DFF8B40400F05AF9DFF8B014B5
+S31508005BD008704021DFF8AC0400F052F9DFF8A81489
+S31508005BE00870DFF89C040078FF2804D0DFF89804D2
+S31508005BF00078FF2804D18421DFF89004FCF7BDFE65
+S31508005C000022DFF88C14DFF88C04FCF7F1FCDFF8CF
+S31508005C108814DFF88004FCF717FD0120FCF7D3FE93
+S31508005C20DFF87004FCF71AFD00F098FEDFF864044C
+S31508005C30D0F8C002FBF77DFE00F0C0FEB0F5FA6FA3
+S31508005C4003D24FF4FA6000F0B6FE01BD80B5DFF866
+S31508005C504404D0F8C002FBF78AFEDFF83804FCF7E4
+S31508005C60DFFC0020FCF7AFFE01BD70B505000C0097
+S31508005C702000C0B2402804DBBB21DFF81004FCF783
+S31508005C807CFE2000C0B200F07DF8C0B2012804D026
+S31508005C90BF21DFF8F803FCF770FE00260FE0FDF7DA
+S31508005CA0C9FA300080B2285C00F06CF8C0B201284E
+S31508005CB004D0C821DFF8D403FCF75FFE761C300059
+S31508005CC02100C9B280B289B28842E8D370BD38B51E
+S31508005CD004000D00DFF8BC03D0F8C002FBF79FFBF9
+S31508005CE0DFF8B8030078002819D1DFF8B40300F00C
+S31508005CF041F8012811D1DFF8A803007800280CD054
+S31508005D00DFF89C030078402807DA0120DFF88C13B7
+S31508005D1008700020DFF88C130870002032BDDFF809
+S31508005D208003DFF8801309780844401C00F022F845
+S31508005D300128F2D1DFF86C030078401CDFF8641301
+S31508005D400870DFF860030078DFF854130978884292
+S31508005D50E3D1DFF85003027892B2DFF84C13200043
+S31508005D60FEF75AFE0020CD490870CE480078287004
+S31508005D700120D3E780B50100C348007800F005F993
+S31508005D80C0B202BD80B50100C9B2BD48007800F0B6
+S31508005D9090F8C0B202BD38B5B948007800F05AF993
+S31508005DA004002000C0B2002828D02000C0B2412834
+S31508005DB000DB4024002513E06946B148007800F06E
+S31508005DC0E4F8C0B2012804D04FF4A471AF48FCF738
+S31508005DD0D4FD9DF80000B5492A00D2B288546D1C3E
+S31508005DE028002100C0B2C9B28842E5D3E4B2230034
+S31508005DF09BB2AE4A8121A748FCF784FA31BD70B53B
+S31508005E000500002000F073FE04002900C9B2A1486D
+S31508005E10FCF794FA050000260FE0300080B2215CFA
+S31508005E209948007800F045F8C0B2012804D04FF42C
+S31508005E30B5719648FCF7A1FD761C3000290080B2A2
+S31508005E4089B28842E9D300F052FE020040230121BC
+S31508005E509048FCF765FA70BD9549964A002004E01B
+S31508005E6088744A6118311832401C0300DBB2002BD3
+S31508005E70F6D08874002048618D488F4908607047BD
+S31508005E8010B48D4A1268002A01D1FF200FE08A4A11
+S31508005E9012685369884C236011749060D06000239F
+S31508005EA053741060C9B20844401E5060907C10BC00
+S31508005EB0704738B504000D002000C0B2022804DB84
+S31508005EC04FF4E1717148FCF758FD79492200D2B2C6
+S31508005ED01820424301EB0200417C754A2300DBB2DD
+S31508005EE01820434302EB0300007C814201D10020C5
+S31508005EF04AE06F492200D2B21820424301EB020061
+S31508005F00C06805706A492200D2B21820424301EBE4
+S31508005F100200417C491C664A2300DBB21820434331
+S31508005F2002EB0300417462492200D2B218204243B0
+S31508005F3001EB0200C068411C5D4A2300DBB2182051
+S31508005F40434302EB0300C16059492200D2B218202C
+S31508005F50424301EB02004168554A2300DBB2182090
+S31508005F60434302EB0300C06881420CD25049220029
+S31508005F70D2B21820424389584D4AE4B21820444305
+S31508005F8002EB0400C160012032BD38B504000D00E3
+S31508005F902000C0B2022804DB4FF4F2713B48FCF73C
+S31508005FA0ECFC43492200D2B21820424301EB02001E
+S31508005FB0407C002801D100204BE03D492200D2B2A6
+S31508005FC01820424301EB020080680078287038499F
+S31508005FD02200D2B21820424301EB0200407C411E47
+S31508005FE0334A2300DBB21820434302EB0300417413
+S31508005FF02F492200D2B21820424301EB02008068E2
+S31508006000411C2B4A2300DBB21820434302EB030052
+S31508006010816027492200D2B21820424301EB0200D0
+S315080060204168234A2300DBB21820434302EB0300EE
+S31508006030806881420CD21E492200D2B218204243FF
+S3150800604089581B4AE4B21820444302EB04008160D5
+S31508006050012032BD10B504002000C0B2022804DBBE
+S315080060604FF401710948FCF788FC1149E4B218207D
+S31508006070444301EB0400407C10BD00009514002049
+S3150800608094140020D9140020D81400208072000827
+S31508006090100100209C0D0020180000204B1600203F
+S315080060A01C1500204A1600201D1500205C1500202E
+S315080060B0DC150020F41500203C16002010F007001F
+S315080060C0DFF8E4100A684FF6FF010A4052EA002298
+S315080060D0DFF8D80002433448026070473248006847
+S315080060E0C0F302207047020012B2002A04D4090144
+S315080060F02F4A00B2115407E009012E4A00B210F0E7
+S315080061000F00104400F8041C704710B410F0070084
+S31508006110D0F10703052B01D3042301E0D0F10703CF
+S31508006120041D072C01D2002000E0C01E012414FA29
+S3150800613003F35B1E19408140012313FA00F0401E49
+S315080061401040084310BC704780B5411EB1F1807FEE
+S3150800615001D301200EE0401E174908600F215FF0A9
+S31508006160FF30FFF7C0FF00201449086007201449D4
+S315080061700860002002BD80B5FFF7A0FF01BD70B51D
+S3150800618004000D001600FFF7A9FF32002900FFF7EB
+S31508006190BCFF0100200000B2FFF7A5FF70BD80B567
+S315080061A0FFF7D2FF02BD00000CED00E00000FA0583
+S315080061B000E400E018ED00E014E000E018E000E07C
+S315080061C010E000E010B5040011480078002801D15D
+S315080061D001201CE04FF47A700D490978B0FBF1F004
+S315080061E00C490968B1FBF0F0FFF7D9FF002801D088
+S315080061F001200CE0102C09D2002221005FF0FF30AC
+S31508006200FFF7BDFF04480460002000E0012010BD30
+S31508006210890100200400002000000020DFF8341562
+S315080062200968C908C9000843DFF8281508607047D7
+S31508006230DFF82415096831F440410843DFF81815DA
+S3150800624008607047DFF81405006850F48020DFF80E
+S315080062500C1508607047DFF80405006850F48030B4
+S31508006260DFF8F81408607047DFF8F0040068400C9F
+S3150800627010F001007047DFF8E8140968C908C9007A
+S315080062800843DFF8DC1408607047DFF8D81409689B
+S3150800629031F470610843DFF8CC1408607047DFF802
+S315080062A0C4140968090909010843DFF8B814086025
+S315080062B07047DFF8B414096831F070010843DFF855
+S315080062C0A81408607047DFF8A014096831F4E06183
+S315080062D00843DFF8941408607047DFF888140968E3
+S315080062E031F070010843DFF87C1408607047DFF866
+S315080062F07C14096831F070010843DFF870140860EF
+S31508006300704710B400F0FF02DFF864148A181168A9
+S3150800631003001B0E0400240A14F01F04A34099432B
+S31508006320C0F30743000A10F01F0013FA00F00843F1
+S31508006330106010BC704780B5FFF7E3FF01BDDFF8BA
+S315080063403414096831F440110843DFF8281408604A
+S315080063507047DFF82414096831F040510843DFF824
+S31508006360181408607047DFF814140968890889004A
+S315080063700843DFF8081408607047DFF8E003006890
+S3150800638050F08070DFF8D41308607047DFF8CC034C
+S315080063900068400E10F001007047DFF8E40300685B
+S315080063A050F48030DFF8D81308607047DFF8D00360
+S315080063B0006850F40030DFF8C81308607047DFF84B
+S315080063C0C013096831F0020151EA4001DFF8B00351
+S315080063D001607047DFF8A813096831F00C0151EA2B
+S315080063E08001DFF89C0301607047DFF8981309689D
+S315080063F0490A4902401E0843DFF8881308607047B7
+S31508006400DFF87813096831F47C7151EA0011DB482A
+S3150800641001607047DB49096831F47E41401E51EA44
+S315080064204021D84801607047D649096831F4FE0111
+S31508006430401E51EA0041D34801607047D1490968B6
+S3150800644031F0FE41401E51EA0061CE4801607047B6
+S31508006450CD490968090909010843CB49086070470D
+S31508006460C948006810F00F00704781B0C74909682D
+S315080064700143C64A1160C54909680840009000985A
+S3150800648001B07047C149096831EA0000BF49086090
+S31508006490704781B0BE4909680143BD4A1160BC49CD
+S315080064A0096808400090009801B07047B849096823
+S315080064B031EA0000B6490860704781B0B5490968F5
+S315080064C00143B44A1160B34909680840009000982E
+S315080064D001B07047AF49096831EA0000AD49086064
+S315080064E0704781B0AC4909680143AB4A1160AA49B3
+S315080064F0096808400090009801B07047A6490968E5
+S3150800650031EA0000A4490860704781B0A3490968C8
+S315080065100143A24A1160A149096808400090009801
+S3150800652001B070479D49096831EA00009B49086037
+S31508006530704709048161704780B500F005F800F0DE
+S31508006540E7FA00F0F3FAFCE780B5FEF79BFD00F0EA
+S3150800655001F801BD80B50420FFF77AFFFFF780FF39
+S31508006560042803D064218E48FCF707FA0220FFF7B7
+S3150800657055FE4FF44040FFF75BFEFFF763FEFFF75B
+S315080065806AFEFFF771FE0128FBD10220FFF7EBFE3A
+S31508006590FFF703FFFFF70AFF0120FFF71BFF0020A5
+S315080065A0FFF70DFF0420FFF72BFF4FF4F070FFF7FE
+S315080065B01CFF0220FFF72EFF1420FFF735FF0220ED
+S315080065C0FFF73CFFFFF7D9FEFFF7E0FE0128FBD1F6
+S315080065D00820FFF764FE0320FFF74DFE0020FFF7B3
+S315080065E054FE0820FFF75BFE4020FFF762FE4FF4DB
+S315080065F08060FFF768FE4020FFF76FFE4020FFF738
+S3150800660076FE6848FFF797FE0020FFF7A2FE5FF4C4
+S315080066108010FFF794FE644800F092FA01BD80B539
+S3150800662086B00220FFF771FF0120FFF732FF022034
+S31508006630FFF72FFF0420FFF72CFF0820FFF729FF9D
+S315080066405FF48020FFF739FF4FF48070FFF749FFAA
+S3150800665080200090012001900020029000200390E5
+S31508006660002004906946514800F070FB4FF4005032
+S315080066700090002001900020049069464C4800F0E4
+S3150800668065FB4FF4407000900220019000200290B4
+S31508006690002003900020049007200590694645488D
+S315080066A000F054FB4FF44070009002200190022045
+S315080066B00290002003900020049009200590694666
+S315080066C03A4800F043FB4FF4C05000900220019076
+S315080066D00320029000200390002004900A200590D1
+S315080066E06946354800F032FB5FF00060FFF7BDFEF3
+S315080066F007B000BD80B5FDF797FB80212B48FFF753
+S3150800670018FF2C4800F08FFA294800F08CFA274821
+S3150800671000F089FA284800F086FA5FF00060FFF773
+S31508006720B1FE4FF48070FFF7E9FE5FF48020FFF7B3
+S31508006730D1FE0820FFF7BAFE0420FFF7B7FE0220B5
+S31508006740FFF7B4FE0120FFF7B1FE0220FFF7EAFECD
+S3150800675001BD00000C480258184802580044025867
+S3150800676010440258184402581C440258204402583F
+S315080067704C4402585444025850440258284402587B
+S315080067802C4402583044025800200052D84402587B
+S31508006790E0440258E8440258EC440258F4440258CB
+S315080067A0207100080800000700389C1C00040258E5
+S315080067B000080258000C02580000025870470000F2
+S315080067C0006810F001007047C26A1209120189B206
+S315080067D01143C1627047426832F440521143416026
+S315080067E07047826832F4407211438160704710B472
+S315080067F00C2A25D2019CB3F5004F15D14B4BD2B2CA
+S3150800680053F82220B1FBF2F12200520812EB4102A2
+S31508006810B2FBF4F189B24FF6F0720A40C1F34201B5
+S3150800682089B20A43C2600BE0404BD2B253F8222029
+S31508006830B1FBF2F111EB5401B1FBF4F189B2C1607D
+S3150800684010BC7047F8B505000F0001260024280083
+S31508006850FFF7B6FF002864D129683D480140B868AB
+S3150800686001433869014378690143F869014329609E
+S31508006870F9682800FFF7AFFFB9692800FFF7B1FFED
+S315080068802B48854204D13348FDF79FFC040036E0C7
+S315080068902848854204D13048FDF797FC04002EE0CD
+S315080068A02548854204D12C48FDF78FFC040026E0D4
+S315080068B02248854204D12848FDF787FC04001EE0DB
+S315080068C01F48854204D12448FDF77FFC040016E0E2
+S315080068D01C48854204D11F48FDF777FC04000EE0EA
+S315080068E01948854204D11C48FDF76FFC040006E0F0
+S315080068F01648854203D11848FDF767FC0400002CAA
+S315080069000BD07868002808D0002678680090FB69C4
+S315080069103A6821002800FFF76AFF39682800FFF760
+S3150800692053FF3000C0B2F2BD0000000054730008E7
+S31508006930001001400044004000480040004C004060
+S31508006940005000400014014000780040007C0040E0
+S31508006950F369FFEF0803000708000007034800680B
+S3150800696050F0807001490860704700000C480258D2
+S3150800697080B501201849087000F023F800F001F8E6
+S3150800698001BD80B5FEF774FB012813D012480078C4
+S3150800699001280FD1FAF704FC10490A68104909685A
+S315080069A08A1812F5FA72904204D300200A49087030
+S315080069B0FEF710F801BD09490860704707480068E6
+S315080069C0704780B504480078012803D1FAF7E8FB38
+S315080069D00349086001BD0000461600202C16002059
+S315080069E02816002038B504000025402302228121FC
+S315080069F02000FBF729FC4023022201212000FBF797
+S31508006A0023FC40233B4A01212000FBF789FC280090
+S31508006A10C0B232BD38B50400002581212000FBF73D
+S31508006A2025FC01212000FBF721FC2800C0B232BD5D
+S31508006A3010B51722304B0C7814F06004002C0ED0D9
+S31508006A40402C35D14A78012A08D18988072905D1E9
+S31508006A502A499E2292B2FCF7AFFBFFE728E04C7862
+S31508006A60062C04D00A2C14D00B2C17D020E04C8806
+S31508006A70A4B2240AA4B2212C06D1214BCA88182A0A
+S31508006A8001DB172200E0CA8892B21900FCF794FBD2
+S31508006A900EE001221B49FCF78FFB09E04A88D2B2B7
+S31508006AA0002A03D188781749086001E0FCF748FBFB
+S31508006AB0002010BD80B5FFF76EF9002002BD80B535
+S31508006AC00800C0B2FFF79BF9002002BD80B590F818
+S31508006AD09C02032801D1FFF75EF9002002BD2021A0
+S31508006AE00180094870470A21018008487047014813
+S31508006AF0704700009C1500205900002070000020F7
+S31508006B006200002040160020500000200C000020E3
+S31508006B1080B5FDF75BFFFCF789FBFAF71DFBFEF76F
+S31508006B20F7F9FEF713FAFFF723FF01BD80B5FCF767
+S31508006B3081FBFAF72BFBFEF71CFAFFF722FF01BDD4
+S31508006B40DFF80410086070470400002030B40468B9
+S31508006B5001FB01F503235D43AC43494351432143FC
+S31508006B60016030BC704743688B4351431943416009
+S31508006B70704730B4846801FB01F503235D43AC43D9
+S31508006B80494351432143816030BC704730B4C468DF
+S31508006B9001FB01F503235D43AC43494351432143BC
+S31508006BA0C16030BC704730B4046A01FB01F54D433F
+S31508006BB04D430F235D43AC4301FB01F34B4301FBFC
+S31508006BC003F151432143016230BC704730B4446A33
+S31508006BD00D002D0A0B001B0A5D430B001B0A5D43C3
+S31508006BE00B001B0A5D430F235D43AC430D002D0AC2
+S31508006BF00B001B0A5D430B001B0A5D43090A01FBD8
+S31508006C0005F151432143416230BC70474349096845
+S31508006C1008434249086070474049096831EA00005C
+S31508006C203E490860704710B500243D49884206D1A0
+S31508006C300120FFF7EBFF0120FFF7EEFF6AE0394975
+S31508006C40884206D10220FFF7E1FF0220FFF7E4FFA2
+S31508006C5060E03549884206D10420FFF7D7FF0420B3
+S31508006C60FFF7DAFF56E03149884206D10820FFF7D8
+S31508006C70CDFF0820FFF7D0FF4CE02D49884206D10A
+S31508006C801020FFF7C3FF1020FFF7C6FF42E029498F
+S31508006C90884206D12020FFF7B9FF2020FFF7BCFF66
+S31508006CA038E02549884206D14020FFF7AFFF40204B
+S31508006CB0FFF7B2FF2EE02149884206D18020FFF770
+S31508006CC0A5FF8020FFF7A8FF24E01D49884208D1C8
+S31508006CD04FF48070FFF79AFF4FF48070FFF79CFF20
+S31508006CE018E01849884208D14FF40070FFF78EFF64
+S31508006CF04FF40070FFF790FF0CE01349884208D163
+S31508006D004FF48060FFF782FF4FF48060FFF784FF3F
+S31508006D1000E001242000C0B210BD000088440258DB
+S31508006D20000002580004025800080258000C0258D5
+S31508006D30001002580014025800180258001C025885
+S31508006D40002002580024025800280258F8B5050009
+S31508006D500E00306890FAA0F0B0FA80F731E0726958
+S31508006D6021002800FFF732FF25E034680120B840EB
+S31508006D700440002C24D07068012802D070680228CC
+S31508006D8009D1B26821002800FFF7F3FEF2683168DE
+S31508006D902800FFF7E8FE326921002800FFF7F6FE13
+S31508006DA07068022807D1B4F5807FD8D272692100AD
+S31508006DB02800FFF7F8FE726821002800FFF7C6FED4
+S31508006DC07F1C3068F8400028CFD10020F2BD0000B3
+S31508006DD0122008802E487047042008802D487047E6
+S31508006DE080B50A00C0B2002804D12B492B48FCF70D
+S31508006DF0B2F903E028492948FCF7ADF9264802BD4F
+S31508006E0080B50A0024492648FCF7A5F9224802BDA0
+S31508006E1080B51A20088000F026F8224802BD80B501
+S31508006E200A00C0B2002804D11B491F48FCF793F991
+S31508006E3003E019491C48FCF78EF9174802BD80B5CE
+S31508006E400A00C0B2002804D113491848FCF783F990
+S31508006E5003E011491548FCF77EF90F4802BD2120C9
+S31508006E6008801348704710B51248006812490C6824
+S31508006E70124909680818002808D00822104900F0A5
+S31508006E8023F804220F49200000F01EF810BD000068
+S31508006E90300100206801002060100020907400086E
+S31508006EA0D47400086C010020F47400087874000893
+S31508006EB04401002000E8F11F04E8F11F08E8F11F6B
+S31508006EC06E0100207E01002030B4002300231AE062
+S31508006ED00400240F37341D00EDB201F815400AE00E
+S31508006EE00400240F0A2CF3D20400240F30341D00AA
+S31508006EF0EDB201F81540000100241D00EDB201EBCA
+S31508006F0045056C705B1C1C001500E4B2EDB2AC4282
+S31508006F10E6D330BC704700002648006850F470007D
+S31508006F20244908602448006850F001002249086096
+S31508006F3000202249086020480168214801401E486F
+S31508006F40016000201F49086000201F4908600020D2
+S31508006F501E49086000201E49086000201D49086077
+S31508006F6000201D49086000201C49086000201C49B3
+S31508006F70086000201B49086000201B4908600020A3
+S31508006F801A4908600C48006830F480200A490860ED
+S31508006F9000201749086017480068000C0004B0F183
+S31508006FA0005F02D20120144908605FF000601349AF
+S31508006FB00860704788ED00E0004402581044025803
+S31508006FC07FEDF6EA184402581C4402582044025839
+S31508006FD0284402582C440258304402583444025873
+S31508006FE0384402583C440258404402584444025823
+S31508006FF0604402580010005C0881005108ED00E06A
+S315080070000000020800000200010100000000040858
+S31508007010000002000201000000000608000002004D
+S315080070200301000000000808000002000401000037
+S3150800703000000A08000002000501000000000C0814
+S31508007040000002000601000000000E080000020011
+S3150800705007010000000010080000020000020000FE
+S3150800706000001208000002000102000000001408D7
+S3150800707000000200020200000000160800000200DC
+S3150800708003020000000018080000020004020000C5
+S3150800709000001A08000002000502000000001C0893
+S315080070A0000002000602000000001E0800000200A0
+S315080070B007020000433A5C576F726B5C736F667425
+S315080070C0776172655C4F70656E424C545F57696EA6
+S315080070D05553425F4175746F5F496E7374616C6C8A
+S315080070E05C5461726765745C44656D6F5C41524DB2
+S315080070F0434D375F53544D333248375F4E75636C93
+S31508007100656F5F483734335A495F4941525C426F6D
+S315080071106F745C757362645F636F6E662E630000DE
+S31508007120433A5C576F726B5C736F6674776172650E
+S315080071305C4F70656E424C545F57696E5553425F9B
+S315080071404175746F5F496E7374616C6C5C546172DF
+S315080071506765745C44656D6F5C41524D434D375F9E
+S3150800716053544D333248375F4E75636C656F5F48CD
+S315080071703734335A495F4941525C426F6F745C6DCC
+S3150800718061696E2E63000000433A5C576F726B5C50
+S31508007190736F6674776172655C4F70656E424C54A6
+S315080071A05F57696E5553425F4175746F5F496E73D9
+S315080071B074616C6C5C5461726765745C536F75724C
+S315080071C063655C41524D434D375F53544D333248E6
+S315080071D0375C666C6173682E63000000433A5C573F
+S315080071E06F726B5C736F6674776172655C4F7065FE
+S315080071F06E424C545F57696E5553425F4175746FC2
+S315080072005F496E7374616C6C5C5461726765745C1B
+S31508007210536F757263655C41524D434D375F5354E6
+S315080072204D333248375C72733233322E63000000B6
+S31508007230433A5C576F726B5C736F667477617265FD
+S315080072405C4F70656E424C545F57696E5553425F8A
+S315080072504175746F5F496E7374616C6C5C546172CE
+S315080072606765745C536F757263655C41524D434D37
+S31508007270375F53544D333248375C63616E2E630073
+S31508007280433A5C576F726B5C736F667477617265AD
+S315080072905C4F70656E424C545F57696E5553425F3A
+S315080072A04175746F5F496E7374616C6C5C5461727E
+S315080072B06765745C536F757263655C41524D434DE7
+S315080072C0375F53544D333248375C7573622E63000B
+S315080072D000000000000000000000000000000000A0
+S315080072E0000000000100000002000000030000008A
+S315080072F00400000000000000050000000000000077
+S315080073000000000000000000060000000000000069
+S3150800731000000000000000000700000030B400254F
+S3150800732012E050F8042BD30744BF4A44521E091FE3
+S31508007330042942F8045BFAD213468C0744BF158029
+S315080073409B1CC90748BF1D7050F8041B0029E8D1CB
+S3150800735030BC704701000000020000000400000075
+S3150800736006000000080000000A0000000C000000EB
+S31508007370100000002000000040000000800000000F
+S315080073800001000010B5074979441831064C7C44C1
+S31508007390163404E00A68081D114488470146A142CC
+S315080073A0F8D110BD500000006C000000050206026E
+S315080073B0060307030803090309040A040B040C045B
+S315080073C00C050D050E050F050F061006100710080B
+S315080073D04EF68851CEF20001086840F47000086045
+S315080073E0BFF34F8FBFF36F8F4FF00070E1EE100AB7
+S315080073F07047000029FFFFFFC41400008C0100201D
+S3150800740000000000EFAAFFFF48030000B0020000DA
+S315080074100000002000F00DF8002801D0FFF7B2FFA9
+S31508007420AFF300800020AFF30080FFF785F800F087
+S3150800743002F80120704700F001B8000007463846F8
+S3150800744000F002F8FBE7000080B5AFF30080024ABF
+S3150800745011001820ABBEFBE72600020005480146CE
+S3150800746003B4684680F30988AFF30080FFF7B0FFDE
+S31508007470FFF7D0FFA5EDF5FE57696E55534220423A
+S31508007480756C6B20496E74657266616365000000F1
+S3150800749057696E5553422042756C6B204465766970
+S315080074A0636500000001020304050607080C1014B2
+S315080074B01820304000000000010203040102030402
+S315080074C0060708090000000001020304010203047C
+S315080074D0060708094F70656E424C5420557365724D
+S315080074E0000000000148804701480047196F00085E
+S315080074F05D74000844656661756C74004F70656E4E
+S31508007500424C5400FFF7FEBFFFF7FEBFFFF7FEBF72
S31508007510FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF91
S31508007520FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF81
-S31508007530FFF7FEBFFFF7FEBF0010FC000A90D0035E
-S315080075400090D0030A060002FD00014001FD000B71
-S31508007550716B0008A16B0008BD6B0008F8000B23CF
-S315080075606C00082D6C00083B6C0008F400034D6C99
-S315080075700008FC0012556C000809022000010100F1
-S31508007580C0320904000002FFFD002D0705810240F4
-S3150800759000FF070501024000FF796C0008816C00B6
-S315080075A008A96C0008896C0008B96C0008C76C004B
-S315080075B008E76C000812010002FD001240501DACDD
-S315080075C0600002010203010000040309041A03E62D
-S309080075D000010401A3
-S705080072413F
+S31508007530FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF71
+S31508007540FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF61
+S31508007550FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF51
+S31508007560FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF41
+S31508007570FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF31
+S31508007580FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF21
+S31508007590FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF11
+S315080075A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF01
+S315080075B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF1
+S315080075C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE1
+S315080075D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD1
+S315080075E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC1
+S315080075F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB1
+S31508007600FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA0
+S31508007610FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF90
+S31508007620FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF80
+S31508007630FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF70
+S31508007640FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF60
+S31508007650FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF50
+S31508007660FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF40
+S31508007670FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF30
+S31508007680FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF20
+S31508007690FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF10
+S315080076A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF00
+S315080076B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF0
+S315080076C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE0
+S315080076D0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD0
+S315080076E0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC0
+S315080076F0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB0
+S31508007700FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF9F
+S31508007710FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF8F
+S31508007720FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF7F
+S31508007730FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF6F
+S31508007740FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF5F
+S315080077500010FC000A90D0030090D0030A0610011E
+S31508007760FD00014001FD000BE5690008156A0008E7
+S31508007770316A0008F8000BB56A0008BF6A0008CD30
+S315080077806A0008F40003DF6A0008FC0012E76A00D2
+S315080077900809022000010100C0320904000002FFA6
+S315080077A0FD000E070581024000FF070501024000A3
+S315080077B0FF0AFB000D03069E001400030057494EFE
+S315080077C0555342F6002C80000400010028004400AE
+S315080077D06500760069006300650049006E00740064
+S315080077E06500720066006100630065004700550089
+S315080077F0490044FD004C4E007B003800300037003D
+S31508007800390039003900430033002D0045003400A3
+S31508007810450030002D0034003000450041002D00A1
+S3150800782038003100380038002D0034003800450093
+S315080078303800350032004200350034004600320078
+S3150800784042007DFB0023D16D0008D96D0008016E4A
+S315080078500008E16D0008116E00081F6E00083F6EF3
+S3150800786000085F6E000812010102FD002C40501D41
+S31508007870AC600001010203010000050F2100011C94
+S31508007880100500DF60DDD88945C74C9CD2659D9EF2
+S31508007890648A9F000003069E0001FC000504030994
+S30D080078A0041A03E600010401C5
+S7050800745D21
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_conf.h
index cee15fdcd..7a48424b8 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.c
index 464ac5cc0..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,9 +69,12 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
+#define USB_SIZ_BOS_DESC 0x21
+
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
@@ -121,6 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#if (USBD_WINUSB_ENABLED == 1)
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#endif
/**
* @}
@@ -140,6 +147,9 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
+#if (USBD_WINUSB_ENABLED == 1)
+, USBD_FS_USR_BOSDescriptor
+#endif /* (USBD_LPM_ENABLED == 1) */
};
#if defined ( __ICCARM__ ) /* IAR Compiler */
@@ -150,7 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
+#else
0x00, /*bcdUSB */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -160,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -169,6 +184,37 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
};
/* USB_DeviceDescriptor */
+/** BOS descriptor. */
+#if (USBD_WINUSB_ENABLED == 1)
+#if defined ( __ICCARM__ ) /* IAR Compiler */
+ #pragma data_alignment=4
+#endif /* defined ( __ICCARM__ ) */
+__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
+{
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -331,6 +377,21 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
+#if (USBD_WINUSB_ENABLED == 1)
+/**
+ * @brief Return the BOS descriptor
+ * @param speed : Current device speed
+ * @param length : Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ UNUSED(speed);
+ *length = sizeof(USBD_FS_BOSDesc);
+ return (uint8_t*)USBD_FS_BOSDesc;
+}
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
/**
* @brief Create the serial number string descriptor
* @param None
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_IAR/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/bin/openblt_stm32h743.srec b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/bin/openblt_stm32h743.srec
index c148a6587..26f9a5d4d 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/bin/openblt_stm32h743.srec
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/bin/openblt_stm32h743.srec
@@ -1,1454 +1,1482 @@
-S31508000000301B002439030008410300084303000895
-S3150800001045030008470300084903000800000000DC
-S315080000200000000000000000000000004B0300086C
-S315080000304D030008000000004F030008293500089A
-S315080000405103000851030008510300085103000832
-S315080000505103000851030008510300085103000822
-S315080000605103000851030008510300085103000812
-S315080000705103000851030008510300085103000802
-S3150800008051030008510300085103000851030008F2
-S3150800009051030008510300085103000851030008E2
-S315080000A051030008510300085103000851030008D2
-S315080000B051030008510300085103000851030008C2
-S315080000C051030008510300085103000851030008B2
-S315080000D051030008510300085103000851030008A2
-S315080000E051030008510300080000000051030008EE
-S315080000F05103000851030008510300085103000882
-S315080001005103000851030008510300085103000871
-S315080001105103000851030008510300085103000861
-S315080001205103000851030008510300085103000851
-S315080001305103000851030008510300085103000841
+S31508000000C01C002479030008810300088303000844
+S31508000010850300088703000889030008000000001C
+S315080000200000000000000000000000008B0300082C
+S315080000308D030008000000008F030008F135000852
+S31508000040930300089303000893030008930300082A
+S31508000050930300089303000893030008930300081A
+S31508000060930300089303000893030008930300080A
+S3150800007093030008930300089303000893030008FA
+S3150800008093030008930300089303000893030008EA
+S3150800009093030008930300089303000893030008DA
+S315080000A093030008930300089303000893030008CA
+S315080000B093030008930300089303000893030008BA
+S315080000C093030008930300089303000893030008AA
+S315080000D0930300089303000893030008930300089A
+S315080000E09303000893030008000000009303000828
+S315080000F0930300089303000893030008930300087A
+S315080001009303000893030008930300089303000869
+S315080001109303000893030008930300089303000859
+S315080001209303000893030008930300089303000849
+S315080001309303000893030008930300089303000839
S3150800014000000000000000000000000000000000A1
-S315080001505103000851030008510300085103000821
-S315080001605103000851030008510300085103000811
-S31508000170510300085103000851030008000000005D
-S3150800018051030008510300085103000851030008F1
-S3150800019051030008510300085103000851030008E1
-S315080001A051030008510300085103000851030008D1
-S315080001B051030008510300085103000851030008C1
-S315080001C051030008510300085103000851030008B1
-S315080001D051030008510300085103000851030008A1
-S315080001E05103000851030008510300085103000891
-S315080001F05103000851030008510300085103000881
-S315080002005103000851030008510300085103000870
-S315080002105103000851030008510300085103000860
-S3150800022051030008510300085103000800000000AC
-S31508000230510300085103000800000000510300089C
-S315080002405103000851030008510300085103000830
-S315080002505103000851030008510300085103000820
-S315080002605103000851030008510300085103000810
-S31508000270510300085103000851030008000000005C
-S31508000280510300085103000851030008000000004C
-S31508000290000000005103000800F002F800F03CF8E6
+S315080001509303000893030008930300089303000819
+S315080001609303000893030008930300089303000809
+S315080001709303000893030008930300080000000097
+S3150800018093030008930300089303000893030008E9
+S3150800019093030008930300089303000893030008D9
+S315080001A093030008930300089303000893030008C9
+S315080001B093030008930300089303000893030008B9
+S315080001C093030008930300089303000893030008A9
+S315080001D09303000893030008930300089303000899
+S315080001E09303000893030008930300089303000889
+S315080001F09303000893030008930300089303000879
+S315080002009303000893030008930300089303000868
+S315080002109303000893030008930300089303000858
+S3150800022093030008930300089303000800000000E6
+S3150800023093030008930300080000000093030008D6
+S315080002409303000893030008930300089303000828
+S315080002509303000893030008930300089303000818
+S315080002609303000893030008930300089303000808
+S315080002709303000893030008930300080000000096
+S315080002809303000893030008930300080000000086
+S31508000290000000009303000800F002F800F05CF884
S315080002A00AA090E8000C82448344AAF10107DA45C3
-S315080002B001D100F031F8AFF2090EBAE80F0013F0D9
-S315080002C0010F18BFFB1A43F001031847E456000054
-S315080002D004570000103A24BF78C878C1FAD85207E4
-S315080002E024BF30C830C144BF04680C6070470000A2
-S315080002F00023002400250026103A28BF78C1FBD821
-S31508000300520728BF30C148BF0B6070471FB505F0BC
-S3150800031083FA1FBD10B510BD00F063F81146FFF74C
-S31508000320F5FF05F072FA00F081F803B4FFF7F2FF63
-S3150800033003BC00F089F800000948804709480047CF
-S31508000340FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777
-S31508000350FEE7000004480549054A064B70470000B9
-S31508000360B53600089902000830150024301B002411
-S31508000370301700243017002410B5203AC0F00B803F
-S31508000380B1E81850203AA0E81850B1E81850A0E88B
-S315080003901850BFF4F5AF5FEA027C24BFB1E81850E5
-S315080003A0A0E8185044BF18C918C0BDE810405FEA55
-S315080003B0827C24BF51F8043B40F8043B08BF7047D1
-S315080003C0D20728BF31F8023B48BF11F8012B28BFD6
-S315080003D020F8023B48BF00F8012B7047704770476A
-S315080003E07047754600F02CF8AE4605006946534638
-S315080003F020F00700854618B020B5FFF7ABFFBDE82B
-S3150800040020404FF000064FF000074FF000084FF06D
-S31508000410000B21F00701AC46ACE8C009ACE8C009FE
-S31508000420ACE8C009ACE8C0098D46704710B504466B
-S31508000430AFF300802046BDE81040FFF776BF000006
-S3150800044000487047D014002401491820ABBEFEE7C7
-S3150800045026000200704700F0F6F9FCE710B500F038
-S3150800046099F9012812D00A4C207801280ED103F0F8
-S315080004706DF9D4E90112114401F5FA71884205D3E0
-S3150800048000202070BDE8104000F0F6B910BD00004D
-S31508000490D80000240148406870470000D8000024AE
-S315080004A010B504490120087000F006F8BDE81040B0
-S315080004B0FFF7D4BFD800002410B5044C20780128D3
-S315080004C002D103F043F9A06010BD0000D800002453
-S315080004D00149486070470000D800002410B500F0B4
-S315080004E0B6F900F0ABF903F039F902F02DFE00F089
-S315080004F03DF9BDE81040FFF7D3BF10B500F0A3F9EA
-S3150800050003F046F900F04EF9BDE81040FFF7A6BF24
-S315080005102DE9F041184C256825F0405525604FF423
-S31508000520FA560024154F4FF4007C07EB440817F8D9
-S31508000530145098F8018045446D1C4543B6FBF5F800
-S3150800054005FB1868B8F1000F10D1B6FBF5F5ADB28A
-S315080005500D806D1E654509D217F81400107007EB5B
-S315080005604400407818700120BDE8F081641CE4B2AC
-S31508000570122CDAD30020F7E750440258D85800085E
-S3150800058070B58CB000250B950A95099540F26766FB
-S3150800059009AB0AAA0BA94FF4FA70FFF7B9FF18B905
-S315080005A0B82121A0FFF757FF2A482949016085602D
-S315080005B0C5600124047445748574BDF82C10416126
-S315080005C084619DF82810C1619DF824100162446277
-S315080005D08462C462046345638463C5630464042156
-S315080005E041648564C164056541658565C4650566BC
-S315080005F04566816600F0EAFE019502950394049427
-S3150800060005960696079501A9124800F0A6FD02224E
-S31508000610104801231146009400F0E3FD0D4801F04F
-S3150800062013F80CB070BD00002E2E5C2E2E5C2E2EFC
-S315080006305C2E2E5C536F757263655C41524D434D5B
-S31508000640375F53544D333248375C63616E2E63000F
-S3150800065000A00040EC0700242DE9F0418AB080464E
-S315080006600F46002440F2676601250E48402100F037
-S31508000670E0FD30B10B48402143466A4600F0E6FDEE
-S31508000680054655B90098B04202D1019800B901242F
-S31508000690012C02D10398000C38700AB02046BDE838
-S315080006A0F0810000EC07002410B58AB040F2E1732F
-S315080006B00193002302930393090404910593069377
-S315080006C00793089352210991012301A902460F486D
-S315080006D000F010FD002816D10C48012100F099FD04
-S315080006E0002810D103F032F800F1320405E000F0DA
-S315080006F0AAF803F02BF8A04205D80448012100F017
-S3150800070099FF0028F3D10AB010BD0000EC070024B9
-S3150800071004F002BD09480078002807D0012807D050
-S31508000720022807D0032807D040207047402070478A
-S31508000730082070473F20704700207047E4000024D7
-S3150800074009480078002807D0012807D0022807D0D2
-S31508000750032807D04020704740207047082070477C
-S315080007603F20704700207047E400002410B504F0CD
-S315080007709DFFFFF705FF064C0120207002F022FEC0
-S315080007800020207004F0D8FC0220207010BD000064
-S31508000790E400002410B5002404F096FF00B10124FB
-S315080007A0204610BD38B514486946FFF755FF134C67
-S315080007B0012805D120709DF800100F4804F08EFF1F
-S315080007C00D48694602F02CFE012806D1002020704B
-S315080007D09DF80010084804F081FF0748694604F0B0
-S315080007E00FFD012806D1022020709DF8001002484E
-S315080007F004F074FF38BD000060070024E4000024FC
-S3150800080070B506460C460C4D2878012803D13046AB
-S31508000810E1B2FFF749FF287818B93046E1B202F08D
-S3150800082055FE2878022803D13046E1B204F06EFD61
-S31508000830BDE8704004F0BEBFE4000024AFF30080BA
-S31508000840642002F04FBCAFF3008002F051BCAFF356
-S31508000850008072B6704762B6704770B505460C469A
-S31508000860164605E014F8010B05F8010BFFF7EBFF38
-S31508000870761EB6B2F6D270BD10B502F067FC002837
-S3150800088018D000F01DF8002814D0FFF741FF00F03B
-S31508000890F7FB02F075FF02F055FC074908400749C7
-S315080008A0086002F04FFC4468FFF7D5FFA446BDE890
-S315080008B01040604710BD000080FFFF1F08ED00E0F4
-S315080008C010B54FF4005007490969884303D0002042
-S315080008D018B1002010BD0120FAE702F0FBFB012049
-S315080008E010BD00000008025830B5426B036853F883
-S315080008F0844F4FF6FC718C4344EA82041C600368FB
-S3150800090053F8844F058F24F47F0444EA05441C6099
-S31508000910836B1A44036853F8884F8C4344EA82046D
-S315080009201C60036853F8884F858F24F4FE0444EA54
-S3150800093005441C60C36B02EB4302036853F8A04FDF
-S315080009408C4344EA82041C60036853F8A04FB0F84D
-S31508000950405024F4FE0444EA05441C60D0E91034EF
-S3150800096003FB0422036853F8B04F8C4344EA82041D
-S315080009701C60036853F8B04FB0F8485024F4FE04DE
-S3150800098044EA05441C60D0E9123403FB04220368D8
-S3150800099053F8AC4F8C4344EA82041C60D0E9143403
-S315080009A003FB0422036853F8F04F8C4344EA82049D
-S315080009B01C60036853F8F04FB0F8585024F47C14C0
-S315080009C044EA05441C60836D02EB4303026852F84F
-S315080009D0C04F8C4344EA83011160016851F8C02F67
-S315080009E0B0F85C3022F47C1242EA03420A600168DD
-S315080009F051F8C02F90F8603022F07C5242EA036228
-S31508000A000A60416B224A02EB8101C166826B01EBE7
-S31508000A1082020267C36B02EBC3024267D0E9103455
-S31508000A20634302EB83028267D0E91234634302EB25
-S31508000A308302C267D0E91434634302EB8302C0F829
-S31508000A408020836D02EBC302C0F88420C46D836ED8
-S31508000A505C4302EB8402C0F88820046E5C4302EB18
-S31508000A608402C0F890200B4B9A4208D99830416806
-S31508000A7041F02001416003210170012030BD0022B0
-S31508000A8000E004C1D0F890308B42FAD8002030BD7F
-S31508000A9000AC0040FCD30040F0B5D1E901650C6913
-S31508000AA02C430D68002E19D045F080452C4391F84B
-S31508000AB02070D1E9066535434E6946EA076635432F
-S31508000AC0CE683543D0F88460806E584306EB8003C1
-S31508000AD01C605D60083300200C4E0FE044EA854434
-S31508000AE0E5E71418155CE77845EA0765A77864789A
-S31508000AF03F0447EA0424254320C3001DCC6806EBBF
-S31508000B00144424788442ECD8F0BD00003458000818
-S31508000B1030B50E4B4FF08404CD0744EA002007D0C9
-S31508000B20DC6824F4E664DC60DC6814430443DC60B7
-S31508000B30890709D503F58673196821F4E6611960F2
-S31508000B40196811430143196030BD000000200052A6
-S31508000B50CA4393071A4A1CD0CB070AD0D36823F096
-S31508000B603003D360D3680343D360D36843F0880364
-S31508000B70D36089070CD502F58672116821F0300119
-S31508000B801160116801431160106840F08800106018
-S31508000B907047D16821F03001D160D2F80C1121F0EC
-S31508000BA03001C2F80C11D1680143D160D2F80C119A
-S31508000BB00143C2F80C11906940F01000906170472B
-S31508000BC0002000522DE9F04705460F4600F07CFE4E
-S31508000BD08246012F06D0294CDFF8A490294E04EA54
-S31508000BE009080AE00424F7E7681C06D000F06CFE42
-S31508000BF0A0EB0A00A84224D81DB3B8F1000F22D0F2
-S31508000C00D6F8100124EA00004000EDD0012F1FD0CD
-S31508000C10D6F810011C49084040F0004030F0024167
-S31508000C201AD01A4A91690143916110EA090F01D154
-S31508000C30706103E020F00040C6F814010120BDE809
-S31508000C40F0870320FBE7306934EA0000CCD0DDE703
-S31508000C5030690F490840E1E7012F4FF4803007D08B
-S31508000C60D6F81011C90301D5C6F814010020E6E725
-S31508000C703169C903FAD57061F8E7000004000080FD
-S31508000C80F0FF10E0002000520000EE97FC00002460
-S31508000C900000EE172DE9F04704460D46164698461D
-S31508000CA001274FEA952A4FEA8A2A2068401C05D16F
-S31508000CB05146204600F0E8F800B90027012F09D16F
-S31508000CC02068504506D05146204600F0EDF8044607
-S31508000CD004B90027012F1DD12068281A05192D1DD2
-S31508000CE04FF480690AF5806AFFF7ADFD281B001FDF
-S31508000CF0484506D35146204600F0D6F8044664B166
-S31508000D00251D16F8010B05F8010BA8F10108B8F125
-S31508000D10000FE9D13846BDE8F0870027FAE700005A
-S31508000D2010B501240A480068401C04D0084800F0A1
-S31508000D3033F900B90024012C08D106480068401C84
-S31508000D4004D0044800F028F900B90024204610BD54
-S31508000D50900C00248C0800242DE9F04107460D4626
-S31508000D600124FF26FF210F48C21B681E824200D2BB
-S31508000D700024012C0DD1384600F058F8064678199B
-S31508000D80401E00F053F80146FF2E01D0FF2900D17E
-S31508000D900024012C03D1304600F006F8044620460C
-S31508000DA0BDE8F081FFFF1F082DE9F04186B0044633
-S31508000DB00E46012500270097B44200D90025012DCB
-S31508000DC002D10E2E00D90025012D28D100F05AFD9A
-S31508000DD0DFF854801FE0FFF736FD04EB440058F8AF
-S31508000DE0201008EB80004268491C10D07AB10197A0
-S31508000DF020210591417A0291007A039001200490FE
-S31508000E0001A8694600F038FC18B1002505E0002560
-S31508000E1003E0641CE4B2B442DDD900F0BBFC06B0C2
-S31508000E202846BDE8F0810000FC5800082DE9F0418D
-S31508000E300546FF2600240C4FFFF705FD04EB44008A
-S31508000E4057F82010A94207D807EB800040680844E5
-S31508000E50A84201D9264603E0641CE4B20F2CEBD362
-S31508000E603046BDE8F0810000FC580008004870478D
-S31508000E700000020803494FF0FF30086001F2044100
-S31508000E80086070478C08002410B501248A0500D034
-S31508000E900024012C06D102688A4203D002C0A202AD
-S31508000EA0FFF7DBFC204610BD70B505460E460E481A
-S31508000EB0854203D1A0F204452C460CE00B48864235
-S31508000EC003D1094D06462C4605E02C46284600F077
-S31508000ED063F800B900242CB131462846FFF7D4FF41
-S31508000EE000B90024204670BD900C002400000208BA
-S31508000EF001200A490A684B681A448B681A44CB6869
-S31508000F001A440B691A444B691A448B691A44D1F876
-S31508000F1098121144002900D00020704700000208EA
-S31508000F202DE9F04105460E46174601241648411B91
-S31508000F30701E814200D20024012C0BD12846FFF7EF
-S31508000F4075FFFF2805D0A819401EFFF76FFFFF2879
-S31508000F5000D10024012C13D1A80A80020B4988422B
-S31508000F6007D10B4833463A462946FFF793FE04460F
-S31508000F7006E0084833463A462946FFF78BFE0446FC
-S31508000F802046BDE8F0810000FFFF1F0800000208A8
-S31508000F90900C00248C0800242DE9F0410746012511
-S31508000FA03868FFF743FFFF2800D10025012D25D11A
-S31508000FB000F068FC0024386800EB441607EB441878
-S31508000FC008F10408FFF73FFC01204246314600F0CD
-S31508000FD0FBFB08B100250FE00023F05C18F80310AE
-S31508000FE0884201D0002503E05B1CDBB2202BF4D33A
-S31508000FF015B1641C202CDED300F0CCFB2846BDE8D6
-S31508001000F081000008B50120002100910C490A680A
-S31508001010521C14D048688A681044CA6810440A6981
-S3150800102010444A6910448A691044C9690844C0438F
-S31508001030401C0090034804216A46FFF771FF08BD6B
-S31508001040900C00249802020810B50B480168001D90
-S315080010500468001D0068084400280BD007490822C8
-S3150800106001F077FB054904222046BDE810401031FF
-S3150800107001F06FBB10BD000000E8F11FBE000024A0
-S3150800108010B512496FF00040086000200860411E44
-S315080010900E4A121D11601060121D11601060121D9B
-S315080010A011601060121D11601060121D1160106031
-S315080010B0121D11601060121D11601060121D116062
-S315080010C0106000F057FC002010BD00007C44025858
-S315080010D070B5044600F0F8FB0546601C02D00448CB
-S315080010E00078044400F0F0FB401BA042FAD370BD20
-S315080010F00C00002470B590F89840012C08D0022CFA
-S3150800110006D050F89C1F41F002010160012070BD15
-S315080011100468D4F8C05093FAA3F6B6FA86F6C5F36F
-S315080011200545B54206D850F89C1F41F020010160DC
-S31508001130012070BDD4F8CC401C4206D050F89C1F44
-S3150800114041F040010160012070BD93FAA3F3B3FAA0
-S3150800115083F3FFF7A1FC002070BD10B590F8982026
-S31508001160012A08D0022A06D050F89C1F41F0020135
-S315080011700160012010BDCA680B688BB1072A0B698C
-S3150800118043EA42732BD00C7A4A6942EA8472496868
-S31508001190006F00EBC100036042604FF0000010BD15
-S315080011A0072A10D00C7A4FEAC2624B6943EA847365
-S315080011B00C8A42EA044243EA02034968C06E00EB1D
-S315080011C081000360E9E70B8A4FF060548A6942EAB6
-S315080011D00343CA6944EA022243EA0203EDE78A693D
-S315080011E0D5E730B5039C90F89850012D06D050F8F5
-S315080011F09C1F41F004010160012030BD006809010F
-S3150800120041EA820141EA43012143C0F880100020E7
-S3150800121030BD90F89820022A06D050F89C1F41F05D
-S3150800122008010160012070470068C0F8D01000204E
-S3150800123070470068402904D0D0F8B40000F07F0059
-S315080012407047D0F8A40000F07F007047F0B500267C
-S3150800125090F89840022C06D050F89C1F41F00801DF
-S3150800126001600120F0BD40290BD041292BD0046D27
-S315080012708C424AD850F89C1F41F020010160012099
-S31508001280F0BD0468D4F8A05015F4FE0F0DD0D4F8BC
-S31508001290A4506D0610D0D4F8A440C4F30526446CB7
-S315080012A0456F744305EB840534E050F89C1F41F004
-S315080012B0200101600120F0BD50F89C1F41F48071A7
-S315080012C001600120F0BD0468D4F8B05015F4FE0F93
-S315080012D00DD0D4F8B4506D0610D0D4F8B440C4F389
-S315080012E00526C46C856F744305EB840512E050F837
-S315080012F09C1F41F0200101600120F0BD50F89C1FA1
-S3150800130041F4807101600120F0BD446DC56F4C4306
-S3150800131005EB84052C6804F0804454602CB32C68D3
-S3150800132024F0604414602C6804F0005494602C681F
-S3150800133004F000441461AC88A4B2D4616C6804F467
-S315080013407024D4606C6804F4801454616C6804F4E6
-S31508001350001494616C68C4F3066414626C680835FA
-S31508001360E40F54620024184F09E02C68C4F38A4439
-S315080013701460D8E715F804C003F804C0641CD2F852
-S315080013800CC007EB1C4C9CF800C0A445F2D84029B9
-S3150800139009D041290BD0012220290CD200688A40A5
-S315080013A0C0F898200DE00068C0F8A86009E0006859
-S315080013B0C0F8B86005E0006801F01F018A40C0F86F
-S315080013C09C200020F0BD0000345800082DE9F043A9
-S315080013D093B004464C2295496846FEF7CDFF6CB19A
-S315080013E0934F2068B84202D100F5807060604FF4D0
-S315080013F0407994F89800002620B108E0012013B03F
-S31508001400BDE8F08384F89960204600F01CF920684E
-S31508001410816921F01001816100F056FA05464FF006
-S3150800142003080DE000F050FA401B0A2808D954F8C2
-S315080014309C0F40F00100206004F8048C0120DEE7D0
-S31508001440206880690007EDD42068816941F00101B0
-S31508001450816100F039FA05460DE000F035FA401BC7
-S315080014600A2808D954F89C0F40F00100206004F8B7
-S31508001470048C0120C3E720688069C007EDD0206886
-S31508001480816941F002018161207C012839D02068F8
-S31508001490816941F040018161607C012837D020686C
-S315080014A0816921F480418161A07C012835D02068BA
-S315080014B0816941F48051816120688169A26821F4BB
-S315080014C04071114381612068816921F0A40181611D
-S315080014D02068016921F010010161E068012822D025
-S315080014E030B302282BD02068816941F080018161E0
-S315080014F02068016941F010010161E068032818D0ED
-S3150800150022E02068816921F040018161C4E72068F2
-S31508001510816941F480418161C6E72068816921F4C7
-S3150800152080518161C8E72068816941F004018161C1
-S315080015300AE02068816941F02001816104E02068A1
-S31508001540816941F020018161207E401E4106E069E3
-S31508001550401E41EA0020216A491E0843A18A491E05
-S3150800156040EA01402168C861A06848450FD1E16A90
-S31508001570A06A491E401E40EA0121206B401E41EA2E
-S315080015800011A08C401E41EA00402168C860206E08
-S3150800159028B1206850F8C01F626E11430160D4E973
-S315080015A01701C842694609D0206850F8C82FA36EAB
-S315080015B022F0070251F823301A430260206C48B122
-S315080015C0206850F8BC2F636C22F0070251F82330CC
-S315080015D01A430260A06C50B1206850F8BC2FE36C27
-S315080015E022F0700251F8233042EA03120260206D9D
-S315080015F050B1206850F8BC2F636D22F4E06251F8B0
-S31508001600231042EA012101602068B84204D16068CB
-S31508001610816821F00301816044F8946FA660012077
-S315080016202071943C2046FFF75FF9E8E64458000825
-S3150800163000A000400068D0F8CC00084201D1002084
-S31508001640704701207047704790F89810012906D016
-S3150800165050F89C1F41F004010160012070470221E7
-S3150800166080F8981001688A6922F001028A610021CF
-S31508001670C0F89C10002070472DE9F05F04468946A3
-S315080016800025DFF808A19AF8140001281CD00120CB
-S315080016908AF814004FF0000BCAF818B02079C00772
-S315080016A006D001214CF25030FFF78CFA00B1012523
-S315080016B02079800706D502214CF25030FFF782FACE
-S315080016C000B101251DB15CE00220BDE8F09F20684D
-S315080016D02F4F012807D04FF0FF30C9F80000A66841
-S315080016E040F2047848E061682069FFF731FA20790A
-S315080016F0C0070AD001214CF25030FFF763FA00B157
-S315080017000125F86820F00800F8602079800738D5A8
-S3150800171002214CF25030FFF755FA00B10125D7F8EF
-S315080017200C0120F00800C7F80C012AE022693046AF
-S315080017306168FFF7EDF92079C00709D001214CF25D
-S315080017405030FFF73FFA0546F86820EA0800F860C7
-S31508001750207980070BD502214CF25030FFF732FA78
-S315080017600546D7F80C0120EA0800C7F80C0115B1A0
-S31508001770C9F8006005E0761CD4E902100844B042B6
-S31508001780D4D88AF814B028469FE70000FC00002445
-S31508001790002000520B48C16841F00101C160C168D0
-S315080017A0C9070AD000F58670016841F00101016099
-S315080017B00068C00703D00020704701207047012049
-S315080017C070470000002000522DE9F05F15460C46D0
-S315080017D00826DFF8A89099F81400012809D00120F6
-S315080017E089F81400A1F10061B1F5801F04D2012720
-S315080017F003E00220BDE8F09F02274FF0000AC9F86F
-S3150800180018A04CF2503B39465846FFF7DBF918BB8F
-S31508001810DFF86C80012F22D0D8F80C0140F00200C6
-S31508001820C8F80C01BFF36F8FBFF34F8F01CD01C40A
-S31508001830761EF6B2002EF9D1BFF36F8FBFF34F8F26
-S3150800184039465846FFF7BEF9012F0FD0D8F80C11C4
-S3150800185021F00201C8F80C1189F814A0CAE7D8F8D3
-S315080018600C0040F00200C8F80C00DBE7D8F80C10B2
-S3150800187021F00201C8F80C10EEE70000FC00002475
-S31508001880002000520D48C1680E4ACB070C4906D005
-S3150800189041604260C368DB0701D001207047D0F879
-S315080018A00C31DB0708D000F58270016002608068A1
-S315080018B0C00701D001207047002070470020005261
-S315080018C023016745AB89EFCD01F040BF10B5032072
-S315080018D000F02EF900F048FE0F490A68C2F3032308
-S315080018E00E4AD35C03F01F03D840096801F00F01C4
-S315080018F0515C0B4A01F01F0120FA01F111600949F8
-S315080019000860002000F010F808B1012010BD00F0B2
-S3150800191071F8002010BD000018440258225800082B
-S31508001920040000240000002470B504460F4D2A78F0
-S31508001930002A0CD04FF47A700D49B0FBF2F0096812
-S31508001940B1FBF0F000F0EAFE18B1012070BD0120ED
-S3150800195070BD102C07D200222146501E00F0C8F890
-S315080019606C60002070BD012070BD00000C000024D2
-S315080019700000002410B501F04DF8194C4FF4000191
-S31508001980A161184800F026FF174800F023FF2046FB
-S3150800199000F020FF154800F01DFF1548016821F0EA
-S315080019A00061016012481430016821F480710160F9
-S315080019B0001F016821F480210160082000F0E6FE7E
-S315080019C0042000F0E3FE022000F0E0FE012000F013
-S315080019D0DDFE07481C30016821F00201016010BDD8
-S315080019E000040258000C0258000802580000025869
-S315080019F0D8440258F0B587B03848016841F002016A
-S31508001A000160006800F002000090012000F0C6FEA8
-S31508001A10022000F0C3FE042000F0C0FE082000F0FB
-S31508001A20BDFE2E480C38016841F48021016000682B
-S31508001A3000F48020009029480838016841F4807134
-S31508001A400160006800F480700090802001900120F9
-S31508001A500290002403940494059401A9204F384663
-S31508001A6000F048FF4FF4005001900294059401A934
-S31508001A701C4800F03FFF4FF4407601960225029578
-S31508001A800394049405940720069001A9164800F0CB
-S31508001A9031FF019602950395049405940920069052
-S31508001AA001A9384600F026FFF000019002950320B0
-S31508001AB00390049405940A20069001A90B4800F0A7
-S31508001AC019FF06481C38016841F00061016000688A
-S31508001AD000F00060009007B0F0BD0000F444025822
-S31508001AE00004025800080258000C02580000025868
-S31508001AF0F0B40D460D4B1B68C3F30223C3F107046C
-S31508001B00042C00D90424191D072901D2002300E05A
-S31508001B10DB1E012606FA04F1491E294099409E401B
-S31508001B20761E16403143F0BC03F05FBE0CED00E0B4
-S31508001B3000F00701054A10684FF6FF03184040EA0F
-S31508001B400120034908431060704700000CED00E0CF
-S31508001B500000FA0501680122C0F8FC23002280F87B
-S31508001B60F423886940F000608861486D024A104392
-S31508001B7048650020704700000300001070470068A1
-S31508001B8041620020704770B50368586A002907D07B
-S31508001B909C6A00EB14440020491E4FF482750AE043
-S31508001BA040EA024098620DE005EB80069E5904EB78
-S31508001BB01644401CC0B28842F6D305EB810144EABC
-S31508001BC002405850002070BD10B50446012003F0AD
-S31508001BD0D7F9D4F80404BDE8104002F073B9C1EB94
-S31508001BE0C10200EB8202D0F80404926C02F0B3B88A
-S31508001BF0C1EBC10200EB8202D0F80404D2F8082235
-S31508001C0002F014B910B50446002C0CD0032084F851
-S31508001C10BD03204600F046FC204600F0D5FB002018
-S31508001C2084F8BD0310BD012010BD10B50446206818
-S31508001C3094F8BC13012906D0012184F8BC13A16AC3
-S31508001C40012902D008E0022010BDA169012903D0AC
-S31508001C50816B41F480318163206802F065FD0020C4
-S31508001C6084F8BC0310BD10B5044694F8BC030128DB
-S31508001C7009D0012084F8BC03206802F061FD002029
-S31508001C8084F8BC0310BD022010BD10B50446002020
-S31508001C9003F076F9D4F80404BDE8104002F014B94C
-S31508001CA070B504464FF0010201F00F004FF0000531
-S31508001CB00B06C0EBC00104EB810102D53C314A702A
-S31508001CC002E001F5FE714D70087094F8BC03012816
-S31508001CD008D084F8BC23206802F0E4FC84F8BC53DE
-S31508001CE0002070BD022070BD70B5044601F00F00DB
-S31508001CF06268904201D9012070BD0B064FF00102BF
-S31508001D0001F00F014FF00005C1EBC10104EB8101A1
-S31508001D1002D53C314A7002E001F5FE714D708D70B6
-S31508001D20087094F8BC03012808D084F8BC232068FE
-S31508001D3002F080FE84F8BC53002070BD022070BDFE
-S31508001D4001F00F01C1EBC10100EB8100D0F81402CC
-S31508001D5070472DE9F04104464FF0010601F00F00E7
-S31508001D604FF000050F06C0EBC00104EB810102D558
-S31508001D703C314E7002E001F5FE714D7008708A60C4
-S31508001D80CB704A7802B1C880022B00D10D7194F845
-S31508001D90BC03012809D084F8BC63206802F0D6FB8E
-S31508001DA0284684F8BC53BDE8F0810220FBE770B5ED
-S31508001DB00D4605F00F04C4EBC40100EB810101F5E3
-S31508001DC0FE71CA604B6100238B614B700C7003690E
-S31508001DD0012B00D10A612A0705D0027C006802F0AF
-S31508001DE081FE002070BD027C006802F06FFDF8E7F6
-S31508001DF070B504460D4605F00F006168884201D9A2
-S31508001E00012070BD29064FF000064FF0010206D5E5
-S31508001E10C0EBC00104EB81013C314A7006E0C5EB1A
-S31508001E20C50104EB810101F5FE714E708A700870D8
-S31508001E3094F8BC03012807D084F8BC23206802F074
-S31508001E4025FE280702D007E0022070BD217C04F594
-S31508001E507172206802F0C4FD84F8BC63002070BD6E
-S31508001E6070B50D4605F00F04C4EBC40100EB810103
-S31508001E703C31CA604B6100238B6101234B700C70A7
-S31508001E800369012B00D10A612A0705D0027C006884
-S31508001E9002F028FE002070BD027C006802F016FDE4
-S31508001EA0F8E72DE9F84F04462568284602F04CFF66
-S31508001EB000287ED1206802F073FF002879D02068B8
-S31508001EC002F06EFF800704D52068416901F002011F
-S31508001ED04161206802F064FFC10604F57170009044
-S31508001EE035D52068816921F0100181612F6A07F0D4
-S31508001EF00F00C0EBC00004EB800606F5FE76C7F3BC
-S31508001F004340022802D0062812D01BE047F6F0709C
-S31508001F10074217D0C7F30A12F1681746284602F097
-S31508001F2043FFF0683844F060B0693844B06109E0AE
-S31508001F3000990822284602F037FFB069C7F30A114C
-S31508001F400844B0612068816941F010018161206808
-S31508001F5002F026FF00034FF001084FF008094FF082
-S31508001F60100A3ED50026206802F0F9FE834635E0C1
-S31508001F705FEACB702FD02068F1B202F009FF07465E
-S31508001F80F80707D005EB4610C0F8088B31462046FF
-S31508001F9001F004F9380707D505EB4610C0F8089B89
-S31508001FA03146204601F0D6F8F80605D505EB461069
-S31508001FB000E087E1C0F808ABB80604D505EB461182
-S31508001FC02020C1F8080BB80405D505EB46114FF4D7
-S31508001FD00050C1F8080B761C4FEA5B0BBBF1000FEB
-S31508001FE0C6D1206802F0DCFE400359D5206802F00D
-S31508001FF0AFFE8346002650E05FEACB704AD02068E1
-S31508002000F1B202F0B3FE0746F80723D006F00F0137
-S3150800201008FA01F0D5F834188143C5F8341805EBE9
-S315080020204610C0F80889206901280FD1C6EBC600FA
-S3150800203004EB8000D0E911211144816436B9206D82
-S3150800204020B920680121009A02F0CAFC2046F1B2A4
-S31508002050FFF7C5FD380703D505EB4610C0F8089904
-S31508002060F80603D505EB4610C0F808A9780604D586
-S3150800207005EB46114020C1F80809B80704D505EB59
-S3150800208046110220C1F80809380603D5314620460C
-S3150800209001F0F6F8761C4FEA5B0BBBF1000FABD1EB
-S315080020A0206802F07DFE002811DAD5F8040820F031
-S315080020B00100C5F8040894F8F403012839D020462D
-S315080020C000F0A6F92068416901F0004141612068E5
-S315080020D002F066FE00050BD5D5F80808C00702D041
-S315080020E0204600F0FDF92068416901F4006141616C
-S315080020F0206802F055FE00010AD52068416901F002
-S315080021000061416194F8F403D8B1204600F0E8F97B
-S31508002110206802F045FEC00473D5D5F8040820F0FF
-S315080021200100C5F804082068102102F0EBFD002123
-S3150800213032E0002084F8F40300212046FFF71EFD54
-S31508002140C0E784F8F4832068406DC0F38300C4F8C0
-S31508002150F80301212046FFF711FDD9E705EB4110E9
-S315080021604FF67F3200F510608260036823F400138F
-S315080021700360036843F000630360C0F80822D0F8E0
-S31508002180002222F40012C0F80022D0F8002242F001
-S315080021900062C0F80022491C60688842DED8D5F87B
-S315080021A01C0840F00110C5F81C08206B60B1D5F872
-S315080021B0840840F00B00C5F88408D5F8440840F0B8
-S315080021C00B00C5F844080CE0D5F8140842F22B01B8
-S315080021D00843C5F81408D5F8100840F00B00C5F8F0
-S315080021E01008D5F8000820F4FE60C5F80008217C20
-S315080021F02068009A02F0F4FB2068416901F48051D6
-S315080022004161206802F0CCFD800415D5206802F0F3
-S31508002210DFF9206802F088FDE06000F083F9227B90
-S315080022200146206802F0FEFD204600F0CFF820683F
-S31508002230416901F400514161206802F0B1FD0007CF
-S3150800224007D5204600F0EEF82068416901F008013C
-S315080022504161206802F0A4FDC00208D5002120468D
-S3150800226000F032F82068416901F480114161206864
-S3150800227002F096FD800208D50021204600F028F8D5
-S315080022802068416901F400114161206802F088FD67
-S31508002290400007D52046FFF797FC2068416901F002
-S315080022A080414161206802F07BFD40070AD520681D
-S315080022B04568680702D52046FFF7E7FC20684168AD
-S315080022C029434160BDE8F88FD0F8040401F05ABEEE
-S315080022D0D0F8040401F058BE2DE9F0418AB004464E
-S315080022E0002C05D0266894F8BD03002520B108E027
-S315080022F001200AB0BDE8F08184F8BC53204600F0FE
-S3150800230064F8032084F8BD03F06BC00500D425618A
-S31508002310206802F0D5FA04F110016846282288469A
-S31508002320FEF72AF894E80F0002F060F9022718B1C0
-S3150800233084F8BD730120DCE72068002102F043FD24
-S31508002340002101260DE0C1EBC10004EB80003C3002
-S3150800235046700170C180C5708560C5604561491CBD
-S31508002360C9B260688842EED800210DE0C1EBC10011
-S3150800237004EB800000F5FE7045700170C57085603D
-S31508002380C5604561491CC9B260688842EED82822F2
-S3150800239041466846FDF7F0FF94E80F0002F0DCF9C5
-S315080023A018B184F8BD730120A3E784F8385084F87F
-S315080023B0BD63606A012802D12046FFF7CBFB20687F
-S315080023C002F0BEF9002094E77047704770B50446DE
-S315080023D00125E068002810D0022803D0912108A022
-S315080023E0FEF739F8D4F80404294601F023FED4F898
-S315080023F00404BDE8704001F0DEBD0025F2E70000E8
-S315080024002E2E5C757362645F636F6E662E630000C2
-S3150800241010B5044602F0EAFED4F80404BDE81040FC
-S3150800242001F0F2BDD0F8040401F0F8BD10B5044679
-S3150800243094F8BC0301280BD0012084F8BC0384F867
-S315080024403810206802F0D7FC002084F8BC0310BDC1
-S31508002450022010BDD0F8042400F57171104601F071
-S31508002460F5BD10B50446206894F8BC13012906D0BA
-S31508002470012184F8BC13A16A012902D008E00220D0
-S3150800248010BDA169012903D0816B41F480318163B4
-S31508002490206802F049F9206802F01EFC002084F842
-S315080024A0BC0310BD70B5044694F8BC0301280ED0D1
-S315080024B0012084F8BC03206802F002FA206802F0C2
-S315080024C02BFD002528B184F8BC53012070BD0220DD
-S315080024D070BD206802F034F984F8BC53002070BD42
-S315080024E010B50446D4F8040401F0F8FD2068D0F8C5
-S315080024F0001E41F00101C0F8001E206A20B1044800
-S31508002500016841F006010160BDE8104002F039BDDE
-S3150800251010ED00E00248016841F0807101607047E3
-S315080025200C48025800B500F01FF80B490A68C2F3B8
-S3150800253003230A4AD35C03F01F03D840096801F055
-S315080025400F01515C064A01F01F0120FA01F11160E2
-S31508002550044A1060084600BD18440258225800086C
-S31508002560040000240000002430B564480068654C67
-S3150800257010F03801624808D0021108290DD0102938
-S315080025800DD018290DD0104630BD21688906FBD517
-S315080025902168C1F3C101C84030BD104630BD5A4854
-S315080025A030BD564918310A6802F003020968C1F3BA
-S315080025B00511524B1C331B6803F001034F4D24359C
-S315080025C02D68C5F3CC0515FB03F300EE103AB8EEFB
-S315080025D0400A002977D0DFED4D0A484BB7EE001ABE
-S315080025E020333AB39FED4A2A012A58D0022A6CD0E2
-S315080025F001EE901A1868F8EE611AC2EE212AC0F3A5
-S31508002600080001EE900AF8EE611A40EE201A31EE43
-S31508002610810A22EE800A1868C0F34620401C00EEA4
-S31508002620900AF8EE600A80EE201ABCEEC10A10EE97
-S31508002630100A30BD226892061BD52268C2F3C10271
-S31508002640D04001EE900A1868F8EE612A01EE901A59
-S31508002650F8EE611A82EEA12AC0F3080001EE900A8C
-S31508002660F8EE611A40EE201A31EE810A22EE000ACF
-S31508002670D1E701EE901ADFED272A1868F8EE611AFD
-S3150800268082EEA12AC0F3080001EE900AF8EE611A5C
-S3150800269040EE201A31EE810A22EE000ABBE701EE6F
-S315080026A0901A1868F8EE611AC2EE212AC0F30800DB
-S315080026B001EE900AF8EE611A40EE201A31EE810A10
-S315080026C022EE800AA7E716E0FFE701EE901ADFED93
-S315080026D0122A1868F8EE611A82EEA12AC0F30800D9
-S315080026E001EE900AF8EE611A40EE201A31EE810AE0
-S315080026F022EE000A8FE7002030BD00001044025881
-S315080027000090D0030044025800127A0000000039F5
-S315080027100024744A0024744C0024F44A10B5401E60
-S31508002720B0F1807F01D3012010BD4FF0E024606135
-S315080027300F21601703F059F80020A06107202061D7
-S31508002740002010BD10B5FFF7C1F8BDE8104000F035
-S31508002750EDBEF0B500230A2530263727002412E0FF
-S31508002760B5EB107F04D906EB107C01F813C003E023
-S3150800277007EB107C01F813C0000101EB430C8CF841
-S3150800278001405B1CDBB29342EAD3F0BD02490A68FA
-S3150800279082430A6070470000E044025808B50449BD
-S315080027A00A6802430A6009680140009108BD0000F2
-S315080027B0E044025802490A6802430A60704700006A
-S315080027C08844025802490A6882430A607047000032
-S315080027D08844025870B500243B49884206D1012036
-S315080027E0FFF7E8FF0120FFF7EDFF6AE03749884267
-S315080027F006D10220FFF7DEFF0220FFF7E3FF60E0C5
-S315080028003349884206D10420FFF7D4FF0420FFF796
-S31508002810D9FF56E02F49884206D10820FFF7CAFF9C
-S315080028200820FFF7CFFF4CE02B49884206D110203D
-S31508002830FFF7C0FF1020FFF7C5FF42E0274988428F
-S3150800284006D12020FFF7B6FF2020FFF7BBFF38E0B0
-S315080028502349884206D14020FFF7ACFF4020FFF706
-S31508002860B1FF2EE01F49884206D18020FFF7A2FF5C
-S315080028708020FFF7A7FF24E01B49884208D14FF4C0
-S3150800288080752846FFF796FF2846FFF79BFF18E056
-S315080028901649884208D14FF400752846FFF78AFF83
-S315080028A02846FFF78FFF0CE01149884208D14FF4FC
-S315080028B080652846FFF77EFF2846FFF783FF00E07E
-S315080028C00124204670BD000000000258000402588A
-S315080028D000080258000C025800100258001402584A
-S315080028E000180258001C02580020025800240258FA
-S315080028F000280258F0B50A6892FAA2F2B2FA82F4EF
-S3150800290053E00123A3401A40CAB34B68012B01D0F8
-S31508002910022B10D18D68134686685B4303EB430789
-S315080029206B43BE431E438660CD680B6846689E436C
-S315080029306B431E4346600D691346D0F80CC05B43D3
-S315080029401E4603EB43076B432CEA070C4CEA030CC1
-S31508002950C0F80CC04B68022B20D1FF2A10D84D694D
-S31508002960D0F820C006FB02F35343C3EB03126B43B4
-S315080029702CEA020C4CEA030CC0F820C00EE013E067
-S315080029804B69150A05FB05F26A436A43456AC2EBB9
-S31508002990021C5A4325EA0C05154345624A68036832
-S315080029A05643BB4333430360641C0A6832FA04F394
-S315080029B0A7D10020F0BD000002480068C0F300203F
-S315080029C07047000000440258DDED000A00EE100AC8
-S315080029D09FED0F2AB8EE401A00EE101AB8EE400A1C
-S315080029E0C1EE001A00EE102AB8EE401A00EE103AB0
-S315080029F0B8EE400A00EE021A21EE810AB8EE601A15
-S31508002A00C0EE010ABCEEE00A10EE100A704700009C
-S31508002A100000003970B5264D286840F0010028608E
-S31508002A2000F078FA0028FBD0214800241030046012
-S31508002A30286820490840286000F07CFA0028FBD165
-S31508002A4000F080FA0028FBD100F084FA0028FBD1B8
-S31508002A50174818300460001D0460001D04601449FE
-S31508002A60154828310860091D14480860091D1448CE
-S31508002A700860091D0C60091D0860091D0C60091D08
-S31508002A800860081D0460286820F48020286008482B
-S31508002A906030046006486830016840F2FF721143EE
-S31508002AA001600348D030016841F48031016070BD8F
-S31508002AB00044025845EDF6EA000202020000FF0152
-S31508002AC080020101064AC1B21144030E0A68C0F326
-S31508002AD004218B401A40CA4040EA02407047000071
-S31508002AE04C4402582DE9F84F044600250027374E76
-S31508002AF0306800F00300002804D001280BD0022813
-S31508002B0012D10DE000F006FA70B100F0FBF9304D75
-S31508002B10C008C54008E0FFF74FFF28B12D4D03E078
-S31508002B2000F0E8F900B12C4D002020606060A0603C
-S31508002B303068C0F30518254E08363068C0F3080912
-S31508002B4009F10109A6F1040ADAF80000C0F3000049
-S31508002B5018B1301D0068C0F3CC07B8F1000F33D0A8
-S31508002B60DAF80000C0F3004058B13068C0F34620D8
-S31508002B70401C3B464A46414600902846FFF724FF3C
-S31508002B802060DAF80000C0F3404058B13068C0F35E
-S31508002B900640401C3B464A46414600902846FFF7F9
-S31508002BA013FF6060DAF80000C0F3804000280BD0FD
-S31508002BB03068C0F30660401C3B464A4641460090D2
-S31508002BC02846FFF701FFA060BDE8F88F28440258A1
-S31508002BD00090D00300093D0000127A002DE9F84F55
-S31508002BE0044600250027384E306800F00300002808
-S31508002BF004D001280BD0022812D10DE000F08AF982
-S31508002C0070B100F07FF9314DC008C54008E0FFF704
-S31508002C10D3FE28B12E4D03E000F06CF900B12D4D1E
-S31508002C20002020606060A0603068C0F30538264E3A
-S31508002C3010363068C0F3080909F10109DFF888A0E1
-S31508002C400AF1040ADAF80000C0F3001018B1301DC2
-S31508002C500068C0F3CC07B8F1000F33D0DAF80000EB
-S31508002C60C0F3C04058B13068C0F34620401C3B460C
-S31508002C704A46414600902846FFF7A6FE2060DAF845
-S31508002C800000C0F3005058B13068C0F30640401C3D
-S31508002C903B464A46414600902846FFF795FE606047
-S31508002CA0DAF80000C0F3405000280BD03068C0F3B3
-S31508002CB00660401C3B464A46414600902846FFF7B8
-S31508002CC083FEA060BDE8F88F284402580090D00320
-S31508002CD000093D0000127A002DE9F84F0446002548
-S31508002CE00027394E306800F00300002804D0012878
-S31508002CF00BD0022812D10DE000F00CF970B100F0EB
-S31508002D0001F9324DC008C54008E0FFF755FE28B165
-S31508002D102F4D03E000F0EEF800B12E4D00202060A4
-S31508002D206060A0603068C0F30558274E18363068D2
-S31508002D30C0F3080909F10109DFF88CA00AF1040AB1
-S31508002D40DAF80000C0F3002018B1301D0068C0F39F
-S31508002D50CC07B8F1000F35D0002D33D0DAF80000D3
-S31508002D60C0F3805058B13068C0F34620401C3B463B
-S31508002D704A46414600902846FFF726FE2060DAF8C4
-S31508002D800000C0F3C05058B13068C0F30640401C7C
-S31508002D903B464A46414600902846FFF715FE6060C6
-S31508002DA0DAF80000C0F3006000280BD03068C0F3E2
-S31508002DB00660401C3B464A46414600902846FFF7B7
-S31508002DC003FEA060BDE8F88F284402580090D0039F
-S31508002DD000093D0000127A000248006800F470609D
-S31508002DE07047000018440258FEB50024FFF76AFE33
-S31508002DF03A4A4FF440764FF48033811A90424FF4A2
-S31508002E007D4560D022DC364A9042A0EB020109D00B
-S31508002E1010DC344DA0F1E060083842D0B0422ED024
-S31508002E2098422AD100F08EF838B36846FFF7D6FEE6
-S31508002E30019C22E0A94201D099421ED100F08AF8ED
-S31508002E40D8B16846FFF748FF019C16E0264A881A5B
-S31508002E50914204D008DCB14235D099420DD1FFF732
-S31508002E60ABFD50B1214C08E0A84201D0984204D1EC
-S31508002E7000F058F808B14FF400442046FEBD00F0B3
-S31508002E807BFA0446FFF7A8FFC0F30320285C00F08E
-S31508002E901F0024FA00F000F041FA00F05DFA04463B
-S31508002EA0EBE700F069FA0446FFF796FFC0F3032044
-S31508002EB0285C00F01F0024FA00F000F02FFA00F05A
-S31508002EC03BFA0446D9E700F025F80028D5D000F0EB
-S31508002ED019F8074CC008C440CFE7000008000307EC
-S31508002EE008030107905800080003010000093D0087
-S31508002EF00090D00302480068C0F3404070470000C5
-S31508002F00004402580248006800F0180070470000A4
-S31508002F100044025802480068C0F380007047000069
-S31508002F200044025802480068C0F340007047000099
-S31508002F307044025802480068C0F3406070470000B9
-S31508002F400044025802480068C0F3C0607047000099
-S31508002F500044025802480068C0F3407070470000F9
-S31508002F600044025803490A6822F00F0202430A6025
-S31508002F70704700001844025801490860704700006D
-S31508002F80000000242DE9F04104460D4601260020E4
-S31508002F902168C1F3000100296ED12A69A968EB6985
-S31508002FA011436A691A43114322683E4B1A4011437A
-S31508002FB02160E968626822F440520A436260A9699E
-S31508002FC0A26822F440720A43A2603749374B8C4202
-S31508002FD003D11846FFF708FF30E0354A35499442D1
-S31508002FE003D10846FFF700FF28E0334A944203D18D
-S31508002FF00846FFF7F9FE21E0304A944203D1084615
-S31508003000FFF7F2FE1AE02E4A944203D10846FFF76C
-S31508003010EBFE13E02B4A944203D11846FFF7E4FE71
-S315080030200CE0294A944203D10846FFF7DDFE05E085
-S31508003030264A944202D10846FFF7D6FEA8B1696827
-S3150800304099B10026EB692A680B2A0ED8204FB3F5EA
-S31508003050004F14D0D2B257F82220B0FBF2F000EBA2
-S315080030605100B0FBF1F080B2E0602888E16A80B2D6
-S3150800307021F00F010143E1623046BDE8F081D2B28A
-S3150800308057F82220B0FBF2F0400000EB5100B0FBED
-S31508003090F1F080B24FF6F0710140C0F342000143EF
-S315080030A0E160E2E7F369FFEF00100140080300075B
-S315080030B0004400400800000700480040004C00405B
-S315080030C0005000400014014000780040007C004099
-S315080030D0A058000802494FF40000886170470000B4
-S315080030E0000402580149488070470000180000246F
-S315080030F010B500F02BFB0B4C616888420CD3207886
-S31508003100094950B1002020704FF40000886100F092
-S315080031101DFB61880844606010BD01202070802076
-S315080031208861F4E7180000240004025810B5FDF77A
-S3150800313069FF18B1BDE81040FDF7F2BD002010BDCB
-S31508003140FDF70ABEFDF792BEFDF794BEFDF7D0BEA9
-S31508003150FDF7E6BE70B504462068056C00EB411025
-S31508003160D0F8081B0C4EB54205D9090403D54FF40F
-S315080031700041C0F8081B2046FFF76CF9B54208D98C
-S315080031802069012805D12068012104F5717201F032
-S3150800319027FC002070BD00000A30544F2DE9F0418D
-S315080031A004460D462668316C06EB4510D0F8083BF8
-S315080031B04FF40047D4F8108004F571724FF0200CD4
-S315080031C0B8F1010F08D0DFF8B080414545D11904A0
-S315080031D03AD5C0F8087B4CE0284E5FEA037806D556
-S315080031E0B14246D9190444D5C0F8087B41E05FEAE4
-S315080031F0836802D5C0F808CB3BE013F0280F38D116
-S31508003200B14204D9190402D5C0F8087B31E0C5EBF0
-S31508003210C501D0F8100B04EB810101F501710B68AB
-S31508003220C0F31200181A086148681844486035B98E
-S31508003230D4F8100218B92068012101F0D1FB204604
-S31508003240E9B2FEF7D5FC14E0990601D5C0F808CB1B
-S315080032502046E9B2FEF7CCFC0BE035B9D4F81002EB
-S3150800326018B90021304601F0BBFB2046E9B2FEF74B
-S31508003270BFFC0020BDE8F0810A31544F0A30544F94
-S315080032802DE9F84F80460E46D8F80070C6EBC60002
-S3150800329008EB80043C34D4E90510884202D90120A1
-S315080032A0BDE8F88F081AA168814200D20846C01CFA
-S315080032B04FEA900A07EB461916E0151AA268AA42C1
-S315080032C000D21546E81C4FEA900A98F810000090BC
-S315080032D0ABB2E1683846F2B201F03FFEE068284436
-S315080032E0E060A0692844A061D9F8180980B2504561
-S315080032F005D3D4E90520904201D2002ADDD1D4E9CC
-S315080033000501884208D8012006F00F018840D7F841
-S3150800331034188143C7F834180020C1E704490968FE
-S3150800332001F00F01034A515C01F01F01C8407047C4
-S3150800333018440258905800080549096801F07001B8
-S31508003340044A0909515C01F01F01C8407047000092
-S315080033501C440258905800080549096801F4E061C0
-S31508003360044A090A515C01F01F01C8407047000071
-S315080033701C440258905800080EB500200D490968EB
-S3150800338001F0380100290AD008290ED010290ED0DC
-S31508003390182903D16846FFF7A5FB00980EBDFFF76D
-S315080033A0B1FDC1080448C8400EBD04480EBD044816
-S315080033B00EBD0000104402580090D00300093D00DD
-S315080033C000127A0010B588B00D4C206820F0010074
-S315080033D02060002100914FF4614001900291039111
-S315080033E004910C2005900691079169462046FFF73F
-S315080033F0C9FD206840F00100206008B010BD00003B
-S3150800340000480040024600200449CB69C3F3401334
-S31508003410002B02D0486A107001207047004800400F
-S315080034202DE9F04180460F461B4C00251B4E60785F
-S31508003430002810D020783044401CFFF7E3FF01280D
-S3150800344019D000F083F961686431884200D9657043
-S315080034500020BDE8F0811148FFF7D4FF0128F7D115
-S315080034603078401E3F28F3D800F070F96060257068
-S3150800347001206070ECE72078401CC2B222703078D8
-S3150800348031469042E4D1491C4046FDF7E6F965709D
-S31508003490207838700120DCE7E80000249410002426
-S315080034A070B5094DA86200F051F900F10A0405E06B
-S315080034B0FDF7C9F900F04AF9A04204D8E869C0F353
-S315080034C0C0100028F4D070BD0048004070B505460D
-S315080034D00E46402E03D9842108A0FCF7BCFF3046CF
-S315080034E0FFF7DEFF002406E0FDF7ADF9285DFFF7DC
-S315080034F0D7FF641CA4B2B442F6D370BD2E2E5C2E40
-S315080035002E5C2E2E5C2E2E5C536F757263655C41A5
-S31508003510524D434D375F53544D333248375C7273BF
-S315080035203233322E630000007047000010B55A4847
-S31508003530016821F00F0141F004010160006800F004
-S315080035400F00042803D0672154A0FCF784FF5648CF
-S31508003550016821F0070141F00201016052480C3070
-S31508003560016841F4404101605049086840F48020F0
-S315080035700860086840F4803008600868C0F3404076
-S315080035800028FAD0494A2832106820F0030040F093
-S3150800359002001060101D036843F48033036003685B
-S315080035A043F400330360036823F00C0343F0040379
-S315080035B00360036823F002030360106820F47C703C
-S315080035C040F04000106039483030026840F2DF139E
-S315080035D06FF308021A430260026822F47E4242F43C
-S315080035E000720260026822F4FE0242F49812026037
-S315080035F0026822F0FE4242F080720260086840F0DB
-S31508003600807008600868C0F340600028FAD0082077
-S31508003610FFF7A8FC25481030016821F0070141F0A2
-S3150800362003010160214C1834206820F47060206082
-S315080036300820FFF797FC201D016821F0700141F072
-S3150800364040010160016821F4E06141F48061016094
-S31508003650206820F0700040F04000206013482030B9
-S31508003660016821F0700141F0400101600F485430B3
-S31508003670016821F007010160011F0A6822F0405223
-S315080036800A60016821F4401141F480110160BDE827
-S3150800369010400748FFF770BC002000522E2E5C6DC4
-S315080036A061696E2E630000000C48025800440258F7
-S315080036B000389C1C2048016841F4700101601F49CC
-S315080036C0086840F0010008601C4A002010321060AB
-S315080036D00A681B4B1A400A60184A18321060121DF5
-S315080036E01060121D1060154A28321060121D1060F5
-S315080036F0121D1060121D1060121D1060121D106040
-S31508003700121D1060121D10600A6822F480220A60D9
-S315080037100A49603108600B4800686FF30F00B0F182
-S31508003720005F02D20849012008604FF00060024994
-S31508003730803908607047000088ED00E000440258B0
-S315080037407FEDF6EA0010005C0881005100B500F034
-S315080037501FF80148006800BDF000002400B500F01D
-S315080037600FF84FF0E02004494161002181610522EC
-S3150800377002610248016000BDFF520700F000002404
-S315080037804FF0E0200021016141618161704700002E
-S315080037904FF0E0200069C00303D502480168491CC0
-S315080037A001607047F000002410B501F0E7FD002025
-S315080037B010BD084610B501F061FD002010BD70B5BA
-S315080037C0054600242846812100F0BCFA0121284636
-S315080037D000F0B8FA204670BD0A21018000487047FB
-S315080037E0240000242021018000487047300000246E
-S315080037F0004870471801002470B50546002428467D
-S3150800380040230222812100F0C1FB402328460222E0
-S31508003810012100F0BBFB044A40230121284600F0A1
-S31508003820C1FB204670BD00001801002410B590F8B1
-S315080038309C02032801D101F0A1FD002010BD000063
-S3150800384070B51722174C0B7813F0600F22D14B78FE
-S31508003850062B04D00A2B11D00B2B1BD114E04B8856
-S315080038602125B5EB132F05D10E4C0934CA88172A22
-S3150800387000D91722214600F058F80BE00949012221
-S31508003880193900F052F805E04A8812F0FF0F03D004
-S3150800389000F034F8002070BD0249D0B2193908602A
-S315080038A0F8E700003900002410B5D0F8B4225268B1
-S315080038B09047002010BD90F89C22012A05D0022AC4
-S315080038C003D0032A01D000F019B84988012904D188
-S315080038D00021C0F8A41200F035B8704710B5134699
-S315080038E00A46002100F05EFB002010BD10B5134605
-S315080038F00A46002100F0FAFB002010BD10B5044668
-S315080039008021204600F0CFFB2046BDE8104000216C
-S3150800391000F0C9BB10B50521C0F8941200231A4659
-S31508003920194600F03FFB002010BD10B50223C0F871
-S315080039309432C261026213460A46002100F0D6FBA1
-S31508003940002010BD10B50421C0F8941200231A46B1
-S31508003950194600F0CBFB002010BD10B50446012027
-S3150800396084F89C02D4F8B40221794268204690472C
-S31508003970204600F0AAFB204600F09BFA002010BD66
-S3150800398010B5002806D007A00A46054900F08AF9AE
-S31508003990034810BD03A00A46014900F083F9F7E77A
-S315080039A06005002444656661756C74001220088001
-S315080039B000487047A800002410B5002806D007A0C4
-S315080039C00A46054900F06EF9034810BD03A00A46E9
-S315080039D0014900F067F9F7E76005002457696E5555
-S315080039E053422042756C6B20496E7465726661633A
-S315080039F0650000000420088000487047A4000024E1
-S31508003A0010B504A00A46024900F04CF9004810BD5A
-S31508003A10600500244F70656E424C542055736572DC
-S31508003A200000000010B5002806D007A00A46054980
-S31508003A3000F038F9034810BD03A00A46014900F012
-S31508003A4031F9F7E76005002457696E55534220425D
-S31508003A50756C6B20446576696365000010B51A209D
-S31508003A600880FDF7F1FA014810BD0000BC000024EB
-S31508003A700A46D188012902D01146FFF73FBF90F8C0
-S31508003A809C12012906D0022904D0032909D011461F
-S31508003A90FFF734BF00218160012200F10801FFF71A
-S31508003AA044BF0122011DFFF740BF2DE9F843044634
-S31508003AB00F4600200090002600257888010A08296C
-S31508003AC070D2DFE801F0AB040C22ABAB8B9AD4F8CA
-S31508003AD0B012207C0A68694690470646A3E0207C17
-S31508003AE04FF0020840B1D4F8B402C16A6846884764
-S31508003AF0064686F8018096E0D4F8B402816A6846DC
-S31508003B008847064686F801808DE0C0B206285FD24F
-S31508003B10DFE800F0031221303F4FD4F8B0024268C4
-S31508003B2022B1207C6946904706467CE03946204605
-S31508003B30FFF7E4FE012576E0D4F8B002826822B1E8
-S31508003B40207C6946904706466DE039462046FFF7D1
-S31508003B50D5FE012567E0D4F8B002C26822B1207C00
-S31508003B606946904706465EE039462046FFF7C6FE98
-S31508003B70012558E0D4F8B002026922B1207C6946D2
-S31508003B80904706464FE039462046FFF7B7FE01251F
-S31508003B9049E0D4F8B00242692AB1207C69469047C8
-S31508003BA0064640E03AE039462046FFF7A7FE0125DB
-S31508003BB039E0D4F8B002826922B1207C6946904780
-S31508003BC0064630E039462046FFF798FE01252AE0EA
-S31508003BD039462046FFF792FE012524E0207C28B1CD
-S31508003BE039462046FFF78AFE01251CE0D4F8B402C0
-S31508003BF0416B68468847064615E0207C28B1394659
-S31508003C002046FFF77BFE01250DE0D4F8B402016BD0
-S31508003C106846884706460721717004E039462046FB
-S31508003C20FFF76CFE0125002D12D1BDF8000048B142
-S31508003C30FA883AB1824200D90246009231462046B5
-S31508003C40FFF773FEF888002802D12046FFF77AFEB0
-S31508003C50BDE8F883002102E0491CC9B2401C02787D
-S31508003C60002AF9D1084670470A4690F89C1201299D
-S31508003C7006D0022904D0032902D01146FFF73EBE1A
-S31508003C80D188022902D01146FFF738BE0121C1604A
-S31508003C90D0F8A41209B10321C160022200F10C0177
-S31508003CA0FFF743BE70B504460D461646002C17D0DE
-S31508003CB02046FFF7CFFF022101EB40003080307825
-S31508003CC02870032102206970002306E0411C641C49
-S31508003CD02A54C9B2481CC0B26B542278002AF5D1BE
-S31508003CE070BD01460020002906D0012905D0022909
-S31508003CF005D0032905D0022070470220704701200D
-S31508003D0070470220704710B5002810D0D0F8B4329A
-S31508003D1013B10023C0F8B43209B1C0F8B0120121BA
-S31508003D2080F89C12027000F0DFF8002010BD022017
-S31508003D3010BD10B5D0F8C002FDF7D6FFBDE810409B
-S31508003D40FFF7CFBF10B5D0F8C002FDF7A9FFBDE851
-S31508003D501040FFF7C6BF70B504461346002909D0C0
-S31508003D60D4F8B40242691AB194F89C02032859D0CF
-S31508003D70022070BD04F11400D4F89412002502291B
-S31508003D8003D0042940D0F1B342E0D0E903218A42A6
-S31508003D900DD9511AC1608AB219462046FFF7A6FD09
-S31508003DA0002320461A46194600F0FCF830E08068E1
-S31508003DB0B0FBF1F201FB12029AB9884211D3D4F88A
-S31508003DC0981288420DD2002220461146FFF78EFD32
-S31508003DD0C4F8985200231A461946204600F0E2F81D
-S31508003DE016E0D4F8B402C16829B194F89C020328F5
-S31508003DF001D1204688478021204600F054F9204604
-S31508003E00FFF788FD04E0FFE78021204600F04BF924
-S31508003E1094F8A002012807D1204600F08DF984F80D
-S31508003E20A05201E020469047002070BD70B50446B8
-S31508003E3008461146002809D0D4F8B4128A691AB17E
-S31508003E4094F89C1203292FD0022070BD04F5AA709D
-S31508003E50D4F89432032B02D0052B1DD027E0D0E9E5
-S31508003E6003539D420AD9EB1AC3600069834200D303
-S31508003E70034620469AB2FFF731FD18E0D4F8B4029B
-S31508003E80016929B194F89C02032801D12046884784
-S31508003E902046FFF757FD0AE00020C4F894020021E7
-S31508003EA0204600F000F902E001462046904700202F
-S31508003EB070BD10B5D0F8C002FDF7A4FEBDE81040ED
-S31508003EC0FFF70FBF0020704710B5012180F89C123C
-S31508003ED0D0F8B422017952689047002010BDD0F876
-S31508003EE0C002FDF72DBF000010B5017800292BD1BF
-S31508003EF01649C1F80404C0F8C0121548086009201C
-S31508003F0048600222CA60002008618A610122CA61EB
-S31508003F10086248628862C86208630846FEF7DCF9E8
-S31508003F2020B10CA04FF49371FCF795FA074880214D
-S31508003F30FDF725FE054840220021FDF724FE03482B
-S31508003F4080220121FDF71FFE002010BD5801002424
-S31508003F50000008402E2E5C757362645F636F6E66A0
-S31508003F602E6300000A06D0F8C00201F07F01C1EBFB
-S31508003F70C10100EB810002D590F83E00704790F829
-S31508003F80FE017047002070470020704710B51446A0
-S31508003F901A46D0F8C0022346FDF7DBFEBDE81040FE
-S31508003FA0FFF79FBE10B5D0F8C002FDF700FFBDE8C9
-S31508003FB01040FFF796BE70B50446002220464023FF
-S31508003FC01146FFF7E3FF0125C4F858514026C4F807
-S31508003FD064614023204600228021FFF7D7FFA561B0
-S31508003FE0666284F89C520020C4F894026060C4F8A3
-S31508003FF0A402D4F8B80228B1D4F8B4020021426861
-S3150800400020469047002070BD90F89C12042903D1E1
-S3150800401090F89D1280F89C120020704710B590F811
-S315080040209C12032904D1D0F8B412C96901B1884792
-S31508004030002010BD01740020704710B5D0F8C002EA
-S31508004040FEF7F4F9BDE81040FFF74BBE70B504461D
-S3150800405004F52A70054600F052F80120C4F89402C7
-S31508004060B4F8AE02C4F8980294F8A82212F01F0019
-S315080040700AD001280DD0022810D002F0800120466F
-S3150800408000F011F8002070BD2946204600F001F91D
-S31508004090F8E72946204600F023FAF3E729462046A2
-S315080040A000F02CF9EEE710B5D0F8C002FDF7A0FE37
-S315080040B0BDE81040FFF715BE10B5D0F8C002FEF7F0
-S315080040C0D0F9BDE81040FFF70CBE10B5D0F8C00215
-S315080040D0FEF7E8F9BDE81040FFF703BE00F52770C4
-S315080040E001784170042101700020704710B5D0F89E
-S315080040F0C002FDF7B5FEBDE81040FFF7F2BD0A782D
-S3150800410002704A784270CB788A7802EB03224280A2
-S315080041104B790A7902EB032282808A79C97902EB04
-S315080041200121C180704702460020002902D0C2F84A
-S31508004130B4127047022070470020704770B50446D5
-S315080041408888002821D1C888F8B9488880281CD2D0
-S3150800415000F07F0594F89C0203280DD084F89E523F
-S3150800416029462046FFF769FF2046FFF7EBFB45B1D6
-S31508004170022084F89C0270BD2046BDE87040FFF717
-S31508004180BDBB012084F89C0270BD2046BDE8704086
-S31508004190FFF7B4BB10B50224D0F8B422002A03D026
-S315080041A01268904700B90024204610BD70B5044631
-S315080041B00E46304DB1782970012905D93146204679
-S315080041C0BDE87040FFF79ABB94F89C0202280BD012
-S315080041D0032823D031462046FFF790FB297820464E
-S315080041E0BDE87040FFF760BB99B16160032084F8B1
-S315080041F09C022046FFF7CEFF022804D02046BDE8E1
-S315080042007040FFF79FBB31462046BDE87040FFF778
-S3150800421075BB2046BDE87040FFF794BB91B1606856
-S31508004220884221D0C1B22046FFF73EFB297861605B
-S315080042302046FFF7AFFF022810D02046BDE87040A1
-S31508004240FFF780BB022084F89C0261602046FFF7D6
-S315080042502BFB2046BDE87040FFF774BB314620466D
-S31508004260BDE87040FFF74ABB2046BDE87040FFF73F
-S3150800427069BB0000080000244988012903D1C0F859
-S31508004280A412FFF75FBB704710B5FFF715FF0020B4
-S3150800429010BD10B500240A7812F060020CD0202A4E
-S315080042A005D0402A03D0FFF729FB204610BDD0F8D9
-S315080042B0B42292689047F8E74A780A2A1BD2DFE8C0
-S315080042C002F011171A141A08051A0E0BFFF7EDFB60
-S315080042D0EBE7FFF733FFE8E7FFF768FFE5E7FFF7E8
-S315080042E0C7FBE2E7FFF7C0FCDFE7FFF7C5FFDCE740
-S315080042F0FFF7E1FAD9E7FFF701FBD6E72DE9F04129
-S3150800430004460A4600261179137813F0600011D086
-S31508004310202808D0402806D011462046FFF7EEFA96
-S315080043203046BDE8F081D4F8B402114683682046C9
-S315080043309847F5E7C3F3411001280BD050780028B9
-S3150800434060D0012837D003280CD011462046FFF745
-S31508004350D5FAE5E7D4F8B402114683682046BDE8E5
-S31508004360F041184794F89C02022806D0032814D076
-S3150800437011462046FFF7C2FAD2E749B1802907D08D
-S315080043802046FFF790FE80212046FFF78CFEC7E700
-S3150800439011462046FFF7B2FAC2E7508838B931B15C
-S315080043A0802904D0D08810B92046FFF77CFE204625
-S315080043B0FFF7C8FAB4E794F89C02022806D0032847
-S315080043C014D011462046FFF799FAA9E749B1802982
-S315080043D007D02046FFF767FE80212046FFF763FED9
-S315080043E09EE711462046FFF789FA99E75088002884
-S315080043F096D1480602D02046FFF79BFC2046FFF7D9
-S31508004400A1FA8DE794F89C020027022806D0032813
-S3150800441024D011462046FFF771FA81E731B1802989
-S3150800442004D011462046FFF769FA79E7080607D54A
-S3150800443001F07F0000EB800004EB8001143107E0F7
-S3150800444001F07F0000EB800004EB800101F5AA7102
-S315080044500F6002222046FFF768FA61E708060CD5C6
-S3150800446001F00F0000EB800004EB8000806968B95A
-S3150800447011462046FFF742FA52E701F00F0000EB1B
-S31508004480800004EB8000D0F8580148B108060CD526
-S3150800449001F07F0000EB800004EB800514350CE08A
-S315080044A011462046FFF72AFA3AE701F07F0000EBAB
-S315080044B0800004EB800505F5AA7541B1802906D070
-S315080044C02046FFF74FFD20B10120286002E02F604B
-S315080044D000E02F60022229462046FFF726FA1FE74A
-S315080044E070B505460C46207810F0600209D0202ADF
-S315080044F007D0402A05D021462846FFF7FFF90020B5
-S3150800450070BD95F89C22012A08D0022A06D0032AF3
-S3150800451004D021462846FFF7F1F9F0E7207901286B
-S315080045200ED8D5F8B4022146826828469047E18815
-S315080045300029E4D10028E2D12846FFF703FADEE78E
-S3150800454021462846FFF7DAF9D9E7000070B50A7858
-S3150800455001234E7802F00F041C4DA340012E19D0FA
-S31508004560D0F81C4844EA0343C0F81C3800EB421054
-S31508004570D0F8002B12040BD4D0F8002B0B89C9787D
-S31508004580C3F30A031A4345EA81410A43C0F8002BDC
-S31508004590002070BDD0F81C489BB21C43C0F81C48CC
-S315080045A000EB4210D0F800391B04F1D4D0F80039DA
-S315080045B00C89C978C4F30A048904234341EA825161
-S315080045C00B432B43C0F80039E2E7000000800010D7
-S315080045D0D0F800196FF30A01C0F80019D0F80418CA
-S315080045E041F48071C0F80418002070470FB410B564
-S315080045F00446089801281AD0E06840F04000E060B8
-S31508004600204600F033F80C9941B3A16B21F48031B0
-S31508004610A1630699012907D1A16841F00601A160A5
-S31508004620A16841F02001A16010BC5DF814FBA06BE5
-S3150800463020F48030A063E0680B490840E060E06839
-S3150800464020F44010E0600F98012803D1E06840F498
-S315080046508010E060204600F009F8DAE7A16B41F423
-S315080046608031A163D5E70000BFFFBDFF00210C4ADA
-S31508004670491C914201D9032070470369002BF7DAD8
-S315080046800021036943F001030361491C914201D9E2
-S31508004690032070470369DB07F7D100207047000045
-S315080046A0400D030070B50B7801244E7803F00F0512
-S315080046B004FA05F2012E19D0D0F83C5825EA024230
-S315080046C0C0F83C28D0F81C28097801F00F018C4066
-S315080046D022EA0441C0F81C1800EB4310D0F8001B6E
-S315080046E00F4A1140C0F8001B002070BDD0F83C5896
-S315080046F092B29543C0F83C58D0F81C28097801F0C6
-S315080047000F018C40A1B28A43C0F81C2800EB431065
-S31508004710D0F80019034A1140C0F80019E4E7000070
-S315080047200078F3EF007833EC10B5D0F8041821F0D0
-S315080047300201C0F804180320FCF7CAFC002010BDCB
-S3150800474010B5D0F8041841F00201C0F80418032087
-S31508004750FCF7BEFC002010BD0FB4F0B504460026D9
-S315080047600020002504EB8001C1F80451401C0F28E5
-S31508004770F8D3109848B3A06B40F40011A163C4F8AD
-S31508004780005ED4F80018C4F800180B9801282FD03A
-S315080047900321204600F03EFB1021204600F0B2FA25
-S315080047A000B10126204600F09DFA00B10126C4F8A2
-S315080047B01058C4F81458C4F81C5800204FF000626A
-S315080047C04FF67F374FF0904333E0D4F8040840F0B3
-S315080047D00201C4F80418A06B20F40011A163206834
-S315080047E040F040012160206840F080012160C6E762
-S315080047F0089820B10121204600F00CFBCCE70021E7
-S31508004800204600F007FBC7E704EB4011D1F800C9C2
-S31508004810BCF1000F06DA10B1C1F8003904E0C4F89B
-S31508004820002901E0C1F80059C1F81059C1F8087902
-S31508004830401C06998142E7D8002014E004EB401199
-S31508004840D1F800CBBCF1000F06DA10B1C1F8003B75
-S3150800485004E0C4F8002B01E0C1F8005BC1F8105B66
-S31508004860C1F8087B401C06998142E7D8D4F810089D
-S3150800487020F48071C4F81018A5616FF0804060615B
-S31508004880099818B9A06940F01000A061A0690A4902
-S315080048900843A0610C9818B1A06940F00800A0610F
-S315080048A01098012803D1A06904490843A06130463D
-S315080048B0F0BC5DF814FB000000383C8004000040A2
-S315080048C0816821F0010181600020704770B50C787D
-S315080048D00B784E78414D012E00EB43131FD0D3F8C9
-S315080048E0100B6FF31200C3F8100BD3F8100B284007
-S315080048F0C3F8100B486908B188684861D3F8100BEB
-S3150800490040F40020C3F8100BD3F8100B8C68C4F3DE
-S3150800491012042043C3F8100B012A53D056E04E69FF
-S3150800492096B3D3F810696FF31206C3F81069D3F873
-S3150800493010692E40C3F810694E698D68AE4200D9D9
-S315080049404D6103F511631D6845F400251D601D685A
-S315080049504E69C6F3120635431D60012A23D000EBC3
-S315080049604412D2F8003943F00443C2F800394A69C0
-S315080049703AB3D0F83428097801F00F030121994099
-S315080049800A43C0F8342827E0FFE703F511631E68D9
-S315080049902E401E601D6845F400251D601D686FF3D6
-S315080049A012051D60D9E7096919B100EB4412C2F86E
-S315080049B0141900EB4410D0F8001941F00441C0F86E
-S315080049C0001909E0C86808B1C3F8140BD3F8000B3E
-S315080049D040F00440C3F8000B002070BDFFFF07E05D
-S315080049E010B5036C124CA34205D9D0F8003B002B36
-S315080049F001DA002010BD00F531600023036003686A
-S31508004A0043F400230360036843F018030360036854
-S31508004A1043F0C0430360A0F53160012906D100F5D3
-S31508004A2030604261016841F080210160002010BDBC
-S31508004A300A30544F0B784A78012A00EB43100BD002
-S31508004A40D0F8002B22F40012C0F8002BC9780329ED
-S31508004A5014D0022912D017E0D0F8002922F4001247
-S31508004A60C0F80029C978032901D002290CD1D0F849
-S31508004A70001941F08051C0F8001905E0D0F8001B74
-S31508004A8041F08051C0F8001B002070470A784B7827
-S31508004A900978012B00EB411012D0D0F8001B002931
-S31508004AA006DB2AB1D0F8001B21F08041C0F8001BB4
-S31508004AB0D0F8001B41F40011C0F8001B0020704715
-S31508004AC0D0F80019002906DB2AB1D0F8001921F020
-S31508004AD08041C0F80019D0F8001941F40011C0F857
-S31508004AE00019EBE7F8B50C786FF060460B784F784D
-S31508004AF0784D012F00EB431326D0D3F8104B6FF3F4
-S31508004B001204C3F8104BD3F8104B2C40C3F8104BC3
-S31508004B104C69002C7ED08D682C44641EB4FBF5F4D9
-S31508004B20A4B2D3F8105B06EAC4463543C3F8105B53
-S31508004B30D3F8105B8E686643C6F312042543C3F8A0
-S31508004B40105B012A67D0A9E04F69FFB103F511632D
-S31508004B501F686FF312071F601F682F401F604F6999
-S31508004B608D682F447F1EB7FBF5F506EAC5451E6816
-S31508004B7035431D601D684E69C6F3120635431D6030
-S31508004B80A3F51163CD78012D0ED017E003F5116357
-S31508004B901E682E401E601D6845F400251D601D68B0
-S31508004BA06FF312051D6009E003F511631D6825F012
-S31508004BB0C0451D601D6845F000551D60012A17D0C7
-S31508004BC000EB4413D3F8004944F00444C3F8004901
-S31508004BD0CC78012C36D04A699AB3D0F834280978AB
-S31508004BE001F00F03012199400A43C0F834286FE009
-S31508004BF00A691AB100EB4413C3F81429C9780129C4
-S31508004C0017D1D0F80818C9050BD400EB4411D1F810
-S31508004C10002901E02FE03DE042F00052C1F80029EA
-S31508004C2007E000EB4411D1F8002942F08052C1F8A0
-S31508004C30002900EB4410D0F8001941F00441C0F8EF
-S31508004C40001945E0D0F80848E40506D4D3F8004929
-S31508004C5044F00054C3F8004905E0D3F8004944F08D
-S31508004C608054C3F8004900928A8A93B20A78C968C0
-S31508004C7000F073F92CE0D3F8104B8D68C5F31205D4
-S31508004C802C43C3F8104BD3F8104B44F40024C3F854
-S31508004C90104B56E7CA680AB1C3F8142BC97801291C
-S31508004CA010D1D0F80808C00506D4D3F8000B40F098
-S31508004CB00050C3F8000B05E0D3F8000B40F0805015
-S31508004CC0C3F8000BD3F8000B40F00440C3F8000B00
-S31508004CD00020F8BDFFFF07E0816841F0010181600F
-S31508004CE000207047002110220261054A491C9142A2
-S31508004CF001D9032070470369DB06F7D40020704703
-S31508004D00400D03000022202343EA81110161054971
-S31508004D10521C8A4201D90320704703699B06F7D4BF
-S31508004D2000207047400D0300D0F8080800F0060080
-S31508004D30002805D0022805D0062803D00F20704782
-S31508004D400020704702207047406900F00100704754
-S31508004D50D0F81818D0F81C08084080B27047D0F868
-S31508004D601818D0F81C080840000C704710B5D0F881
-S31508004D701038D0F8342801F00F04E24002F001029E
-S31508004D8043EAC21200EB4110D0F80809104010BDE2
-S31508004D9000EB4111D1F8081BD0F8140808407047F9
-S31508004DA041698069084070470346084610B5D21C19
-S31508004DB09208002103F5805302E01C6810C0491CC4
-S31508004DC09142FAD310BD10B5C26822F0C042C26043
-S31508004DD0012902D031B1012010BDC16841F000514E
-S31508004DE0C16003E0C16841F08041C1603220FCF730
-S31508004DF06FF9002010BD00F50060026822F4FE621B
-S31508004E00026002684FF4FE6303EA01110A43026076
-S31508004E1000207047D0F800280A43C0F80028002070
-S31508004E2070470000022A0ED082B30921C26822F414
-S31508004E307052C260C2684FF4705303EA81210A4374
-S31508004E40C26000207047224A224B0A449A4201D285
-S31508004E500F21EBE7204A214B0A449A4201D20E2140
-S31508004E60E4E71F4A1F4B0A449A4201D20D21DDE7A7
-S31508004E701D4A1E4B0A449A4201D20C21D6E71C4A07
-S31508004E801C4B0A449A4202D20B21CFE71DE01A4A6C
-S31508004E901A4B0A449A4201D20A21C7E7184A194B03
-S31508004EA00A449A4201D20921C0E7174A174B0A4415
-S31508004EB09A4201D20821B9E7154A1144154A914286
-S31508004EC001D20721B2E70621B0E70921AEE70000C3
-S31508004ED0405327FF00350C00401E1BFF40420F00C1
-S31508004EE000DC0BFF804F1200808CF9FE20D61300E1
-S31508004EF060B6E5FE60E3160000D3CEFE40771B00E1
-S31508004F00C05BB3FEC091210000CA91FE207538002F
-S31508004F10E05459FEE09C410010B5044600214FF6C6
-S31508004F207F3304EB4112C2F80839C2F8083B491C22
-S31508004F300F29F6D30020C4F81008C4F81408C4F8DA
-S31508004F401C082046FFF7CEFE002805D12046BDE8FE
-S31508004F5010401021FFF7D6BE10BD10B5029C002CDC
-S31508004F600CD1DB1C9C08002300EB023000F58050B6
-S31508004F7002E004C902605B1CA342FAD3002010BDFC
-S31508004F807047704710B5094B5A68002A0CD0546907
-S31508004F905C6011749060D0600023537410600844FC
-S31508004FA0401E5060907C10BDFF2010BDF400002408
-S31508004FB0094800F11802002181744261183018323C
-S31508004FC0491CC9B20029F7D08174002141610349FF
-S31508004FD0014848607047000058110024F400002476
-S31508004FE070B504460D46022C04D34FF4F2710EA098
-S31508004FF0FBF731FA164B04EB440203EBC200417C83
-S3150800500081B1816809782970417C491E417481689B
-S31508005010491C81604468A14202D953F83210816064
-S31508005020012070BD002070BD2E2E5C2E2E5C2E2E0B
-S315080050305C2E2E5C536F757263655C41524D434D11
-S31508005040375F53544D333248375C7573622E6300AD
-S315080050505811002410B50446022C04D34FF40171EC
-S3150800506004A0FBF7F8F90D4904EB440001EBC00076
-S31508005070407C10BD2E2E5C2E2E5C2E2E5C2E2E5CB9
-S31508005080536F757263655C41524D434D375F535498
-S315080050904D333248375C7573622E6300581100240D
-S315080050A070B504460D46022C04D310A04FF4E171E6
-S315080050B0FBF7D1F9174B04EB440203EBC200417C22
-S315080050C0047CA14201D1002070BDC1680D70417CED
-S315080050D0491C4174C168491CC1604468A14202D98F
-S315080050E053F83210C160012070BD00002E2E5C2ED0
-S315080050F02E5C2E2E5C2E2E5C536F757263655C419A
-S31508005100524D434D375F53544D333248375C7573B0
-S31508005110622E63005811002410B50648D0F8C00264
-S31508005120FCF7A1FD0348FEF718FCBDE81040002077
-S31508005130FFF726BF0C12002470B5FFF739FF1E4C87
-S315080051404021601CFFF71EFF207004F14105402135
-S31508005150681CFFF717FF28702178FF2901D0FF2860
-S3150800516003D1842115A0FBF776F9134800221D49BF
-S315080051708430FEF7C8FD10481B498430FEF7D3FF7C
-S315080051800120FFF7FDFE0C488430FFF77DF8FDF798
-S31508005190C1F909488430D0F8C002FCF746FDFBF790
-S315080051A079F94FF4FA61884204D2BDE8704008469E
-S315080051B0FBF78EB970BD0000881100242E2E5C2ED8
-S315080051C02E5C2E2E5C2E2E5C536F757263655C41C9
-S315080051D0524D434D375F53544D333248375C7573E0
-S315080051E0622E6300880000245000002470470000E7
-S315080051F0014602480078FFF7F3BE0000C9110024F3
-S315080052002DE9F04180460F461948D0F8C002FCF750
-S3150800521048FE184C0026184D607838B12078284486
-S31508005220401CFFF7E5FF01280DD01EE01248FFF7E6
-S31508005230DFFF012819D12878401E3E2815D80120FD
-S315080052406070267011E02078401CC2B2227028785F
-S315080052502946904209D1491C4046FBF7FEFA66707A
-S31508005260207838700120BDE8F0810020FBE70000B7
-S315080052700C120024F4000024D81000242DE9F04173
-S315080052800446FEF7B5FA064611482146FEF727FEFC
-S3150800529085B200240E4F4FF4B578433F0BE0315DDD
-S315080052A03878FFF7FDFE012803D00AA04146FBF730
-S315080052B0D2F8641CA4B2AC42F1D3FEF799FABDE861
-S315080052C0F0414023024602480121FEF76BBE00006A
-S315080052D00C1200242E2E5C2E2E5C2E2E5C2E2E5C9E
-S315080052E0536F757263655C41524D434D375F535436
-S315080052F04D333248375C7573622E630001460248A7
-S315080053000078FFF7CDBE00008811002470B5054669
-S315080053100E463F2E03D9BB210EA0FBF79CF830465C
-S31508005320FFF7ECFF012803D0BF210AA0FBF793F88B
-S3150800533000240CE0FBF787FA285DFFF7DFFF01285A
-S3150800534003D0C82103A0FBF786F8641CA4B2B442B4
-S31508005350F0D370BD2E2E5C2E2E5C2E2E5C2E2E5C6F
-S31508005360536F757263655C41524D434D375F5354B5
-S315080053704D333248375C7573622E63002DE9F84366
-S31508005380154E3078FFF766FE0546280021D0402DD9
-S3150800539000D940250024104F4FF4A478703F0EE042
-S315080053A030786946FFF71CFE012803D00BA041465A
-S315080053B0FBF751F89DF800003855641CE4B2AC427E
-S315080053C0EED3054A81212B46703A02F1F400FEF726
-S315080053D08DFEBDE8F8830000881100242E2E5C2E71
-S315080053E02E5C2E2E5C2E2E5C536F757263655C41A7
-S315080053F0524D434D375F53544D333248375C7573BE
-S31508005400622E630010B5084CFF21E170E21D416869
-S31508005410A06C00F037F9207100206071A071082097
-S31508005420A4F8440010BD0000A007002470B500F0E1
-S31508005430C9F90E4C01252570FF20E07000201021C7
-S3150800544021716071FBF766F9A071FBF779F9E071D4
-S31508005450FBF776F9000A20726572A5720820A4F88F
-S315080054604400BDE87040FDF76FBE0000A0070024A9
-S3150800547010B5054C0020207000F0A4F9FF20E0705C
-S315080054800120A4F8440010BDA00700240748FF2106
-S31508005490C170074981640021017141718171072139
-S315080054A0C0F807100821A0F844107047A007002488
-S315080054B0D05800080648FF21C170002101714278C2
-S315080054C042718171C17101720621A0F844107047BA
-S315080054D0A007002470B50446FBF71CF96178801E06
-S315080054E0884204DABDE87040222000F071B9104DF8
-S315080054F0FF20E8700120A5F84400617849B1A86C3E
-S31508005500A21CFDF725FE68B16178A86C0844A8645A
-S3150800551070BDFDF70BFE0028FAD1BDE870403120BA
-S3150800552000F056B9BDE87040312000F051B90000CE
-S31508005530A007002410B5084C4168A06CFDF700FED2
-S3150800554028B1FF20E0700120A4F8440010BDBDE892
-S315080055501040312000F03CB9A007002470B505467C
-S31508005560FBF7D8F80B4C411E6A1CA06CFDF7F0FD42
-S3150800557058B1FF20E070FBF7CDF8A16C401E084437
-S31508005580A0640120A4F8440070BDBDE87040312035
-S3150800559000F01EB9A0070024312000F019B9000058
-S315080055A010B5FBF769F90348FF21C1700121A0F87E
-S315080055B0441010BDA007002470B5084CFF20E07009
-S315080055C0002525716571FBF7A5F8A071E5712572AF
-S315080055D065720720A4F8440070BD0000A0070024E7
-S315080055E00449FF22CA70406888640120A1F8440073
-S315080055F070470000A007002470B50446FBF78AF838
-S315080056006178401E884204DABDE87040222000F026
-S31508005610DFB8094D6168A9646278281DFBF71DF992
-S31508005620FF20E8706178A86C0844A8646078401C7C
-S31508005630A5F8440070BD0000A0070024002000F073
-S31508005640C7B8000070B50546FBF764F86A78401ECF
-S31508005650904204DABDE87040222000F0B9B8084C40
-S31508005660201DA16CFBF7F9F8FF20E0706978A06CA3
-S315080056700844A0646878401CA4F8440070BD000083
-S31508005680A00700242DE9F04104460E4617460025DA
-S3150800569005E014F8010B2844C5B2FBF7D4F8761ECA
-S315080056A0701CF6D13D600120BDE8F0810548002157
-S315080056B00170816480F84310A0F84410817041702D
-S315080056C070470000A007002403480078002801D08E
-S315080056D00120704700207047A007002410B5017804
-S315080056E0334CFF290FD02278012A60D1F42921D022
-S315080056F013DCD02936D009DCC92930D0CC293DD0D5
-S31508005700CF293ED137E0FFF791FE3DE0D1292FD0D2
-S31508005710D2292AD0F32934D112E0F5390A2930D210
-S31508005720DFE801F0050B2F2F2F112F14171AFFF79B
-S3150800573089FF29E0FFF760FF26E0FFF751FF23E026
-S31508005740FFF760FE20E0FFF7A1FE1DE0FFF776FFFA
-S315080057501AE0FFF7AFFE17E0FFF78AFE14E0FFF73F
-S31508005760FDFE11E0FFF7B6FE0EE0FFF725FF0BE0A2
-S31508005770FFF7E0FE08E0FFF713FF05E0FFF70CFF71
-S3150800578002E0202000F024F894F84300012802D112
-S31508005790102000F01DF8B4F94410002907DD012295
-S315080057A084F84320E01CBDE8104000F01BB810BD8B
-S315080057B0A00700240249002081F843007047000032
-S315080057C0A00700240149002048707047A00700245C
-S315080057D00349FE22CA7008710220A1F844007047E6
-S315080057E0A007002489B2FBF70BB80907090E0028A1
-S315080057F004DB00F1E02080F80014704700F00F0089
-S3150800580000F1E02080F8141D7047FCF79BFFFAF7BB
-S3150800581065FEFAF772FEFCE74FF04070E1EE100AFB
-S315080058207047000000000102030401020304060792
-S31508005830080900000001020304050607080C1014F5
-S3150800584018203040000000000000000000000000A2
-S315080058500000000000000000010000000200000037
-S31508005860030000000400000000000000050000001E
-S315080058700000000000000000000000000600000014
-S315080058800000000000000000000000000700000003
-S3150800589000000000010203040102030406070809C8
-S315080058A001000000020000000400000006000000DD
-S315080058B0080000000A0000000C00000010000000AC
-S315080058C020000000400000008000000000010000E9
-S315080058D04F70656E424C5400050206020603070324
-S315080058E00803090309040A040B040C040C050D0536
-S315080058F00E050F050F06100610071008000002080F
-S315080059000000020001010000000004080000020077
-S315080059100201000000000608000002000301000062
-S3150800592000000808000002000401000000000A0840
-S31508005930000002000501000000000C08000002003B
-S315080059400601000000000E08000002000701000022
-S315080059500000100800000200000200000000120803
-S315080059600000020001020000000014080000020006
-S3150800597002020000000016080000020003020000F0
-S3150800598000001808000002000402000000001A08BF
-S31508005990000002000502000000001C0800000200CA
-S315080059A00602000000001E080000020007020000B0
-S315080059B0D059000800000024FC000000D4020008AA
-S315080059C0CC5A0008FC000024341A0000F002000833
-S315080059D00090D0030090D0030000000001000000F2
-S315080059E01000000000000000000000000000000099
-S315080059F0000000000A060002000000400100000046
-S31508005A0009022000010100C0320904000002FF005B
-S31508005A100000070581024000FF070501024000FF5C
-S31508005A20F9370008BF3700084138000800000000B1
-S31508005A3000000000A9370008B33700082D38000811
-S31508005A40000000000000000000000000E537000824
-S31508005A5000000000D9370008AD390008F5390008FC
-S31508005A60013A0008253A00085D3A0008813900081D
-S31508005A70B9390008040309041201000200000040B5
-S31508005A80501DAC6000020102030100001A03000069
-S31508005A9000000000000000000000000000000000F8
-S31508005AA000000000000000000000000000000000E8
-S31508005AB000000000040000000000000000000000D4
-S31108005AC0000000000000000000000000CC
+S315080002B001D100F051F8AFF2090EBAE80F0013F0B9
+S315080002C0010F18BFFB1A43F0010318477C580000BA
+S315080002D09C5800000A444FF0000C10F8013B13F03C
+S315080002E0070408BF10F8014B1D1108BF10F8015B81
+S315080002F0641E05D010F8016B641E01F8016BF9D174
+S3150800030013F0080F1EBF10F8014BAD1C0C1B09D1CA
+S315080003106D1E58BF01F801CBFAD505E014F8016B3C
+S3150800032001F8016B6D1EF9D59142D6D370470000CE
+S315080003300023002400250026103A28BF78C1FBD8E0
+S31508000340520728BF30C148BF0B6070471FB505F07C
+S315080003502FFB1FBD10B510BD00F063F81146FFF75F
+S31508000360F5FF05F01EFB00F081F803B4FFF7F2FF76
+S3150800037003BC00F089F8000009488047094800478F
+S31508000380FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE737
+S31508000390FEE7FEE704480549054A064B7047000094
+S315080003A07D37000899020008C0160024C01C0024E6
+S315080003B0C0180024C018002410B5203AC0F00B80DD
+S315080003C0B1E81850203AA0E81850B1E81850A0E84B
+S315080003D01850BFF4F5AF5FEA027C24BFB1E81850A5
+S315080003E0A0E8185044BF18C918C0BDE810405FEA15
+S315080003F0827C24BF51F8043B40F8043B08BF704791
+S31508000400D20728BF31F8023B48BF11F8012B28BF95
+S3150800041020F8023B48BF00F8012B70477047704729
+S315080004207047754600F02CF8AE46050069465346F7
+S3150800043020F00700854618B020B5FFF7ABFFBDE8EA
+S3150800044020404FF000064FF000074FF000084FF02D
+S31508000450000B21F00701AC46ACE8C009ACE8C009BE
+S31508000460ACE8C009ACE8C0098D46704710B504462B
+S31508000470AFF300802046BDE81040FFF776BF0000C6
+S31508000480004870475C16002401491820ABBEFEE7F9
+S3150800049026000200704700F0F6F9FCE710B500F0F8
+S315080004A099F9012812D00A4C207801280ED103F0B8
+S315080004B0B1F9D4E90112114401F5FA71884205D35C
+S315080004C000202070BDE8104000F0F6B910BD00000D
+S315080004D0A00100240148406870470000A0010024DC
+S315080004E010B504490120087000F006F8BDE8104070
+S315080004F0FFF7D4BFA001002410B5044C20780128CA
+S3150800050002D103F087F9A06010BD0000A001002405
+S315080005100149486070470000A001002410B500F0AA
+S31508000520B6F900F0ABF903F07DF902F071FE00F0C0
+S315080005303DF9BDE81040FFF7D3BF10B500F0A3F9A9
+S3150800054003F08AF900F04EF9BDE81040FFF7A6BFA0
+S315080005502DE9F041184C256825F0405525604FF4E3
+S31508000560FA560024154F4FF4007C07EB440817F899
+S31508000570145098F8018045446D1C4543B6FBF5F8C0
+S3150800058005FB1868B8F1000F10D1B6FBF5F5ADB24A
+S315080005900D806D1E654509D217F81400107007EB1B
+S315080005A04400407818700120BDE8F081641CE4B26C
+S315080005B0122CDAD30020F7E750440258705A000884
+S315080005C070B58CB000250B950A95099540F26766BB
+S315080005D009AB0AAA0BA94FF4FA70FFF7B9FF18B9C5
+S315080005E0B82121A0FFF757FF2A48294901608560ED
+S315080005F0C5600124047445748574BDF82C104161E6
+S3150800060084619DF82810C1619DF824100162446236
+S315080006108462C462046345638463C5630464042115
+S3150800062041648564C164056541658565C46505667B
+S315080006304566816600F02EFF0195029503940494A1
+S3150800064005960696079501A9124800F0EAFD0222CA
+S31508000650104801231146009400F027FE0D4801F0CA
+S3150800066057F80CB070BD00002E2E5C2E2E5C2E2E78
+S315080006705C2E2E5C536F757263655C41524D434D1B
+S31508000680375F53544D333248375C63616E2E6300CF
+S3150800069000A00040380900242DE9F0418AB08046C0
+S315080006A00F46002440F2676601250E48402100F0F7
+S315080006B024FE30B10B48402143466A4600F02AFE24
+S315080006C0054655B90098B04202D1019800B90124EF
+S315080006D0012C02D10398000C38700AB02046BDE8F8
+S315080006E0F08100003809002410B58AB040F2E173A1
+S315080006F00193002302930393090404910593069337
+S315080007000793089352210991012301A902460F482C
+S3150800071000F054FD002816D10C48012100F0DDFD3B
+S31508000720002810D103F076F800F1320405E000F055
+S31508000730AAF803F06FF8A04205D80448012100F092
+S31508000740DDFF0028F3D10AB010BD000038090024E7
+S3150800075004F070BD09480078002807D0012807D0A2
+S31508000760022807D0032807D08120704781207047C8
+S31508000770082070473F20704700207047AC010024CE
+S3150800078009480078002807D0012807D0022807D092
+S31508000790032807D0812070478120704708207047BA
+S315080007A03F20704700207047AC01002410B505F0C3
+S315080007B03BF8FFF705FF064C0120207002F066FEA5
+S315080007C00020207004F046FD0220207010BD0000B5
+S315080007D0AC01002410B5002405F034F800B101245A
+S315080007E0204610BD38B514486946FFF755FF134C27
+S315080007F0012805D120709DF800100F4805F02EF845
+S315080008000D48694602F070FE012806D100202070C6
+S315080008109DF80010084805F021F80748694604F0D5
+S315080008207DFD012806D1022020709DF8001002489F
+S3150800083005F014F838BD000028080024AC0100248F
+S3150800084070B506460C460C4D2878012803D130466B
+S31508000850E1B2FFF749FF287818B93046E1B202F04D
+S3150800086099FE2878022803D13046E1B204F0DCFD6F
+S31508000870BDE8704005F060B8AC010024AFF3008015
+S31508000880642002F093BCAFF3008002F095BCAFF38E
+S31508000890008072B6704762B6704770B505460C465A
+S315080008A0164605E014F8010B05F8010BFFF7EBFFF8
+S315080008B0761EB6B2F6D270BD10B502F0ABFC0028B3
+S315080008C018D000F01DF8002814D0FFF741FF00F0FB
+S315080008D03BFC02F0B9FF02F099FC074908400749BA
+S315080008E0086002F093FC4468FFF7D5FFA446BDE80C
+S315080008F01040604710BD000080FFFF1F08ED00E0B4
+S3150800090010B54FF4005007490969884303D0002001
+S3150800091018B1002010BD0120FAE702F03FFC0120C3
+S3150800092010BD00000008025830B5426B036853F842
+S31508000930844F4FF6FC718C4344EA82041C600368BA
+S3150800094053F8844F058F24F47F0444EA05441C6059
+S31508000950836B1A44036853F8884F8C4344EA82042D
+S315080009601C60036853F8884F858F24F4FE0444EA14
+S3150800097005441C60C36B02EB4302036853F8A04F9F
+S315080009808C4344EA82041C60036853F8A04FB0F80D
+S31508000990405024F4FE0444EA05441C60D0E91034AF
+S315080009A003FB0422036853F8B04F8C4344EA8204DD
+S315080009B01C60036853F8B04FB0F8485024F4FE049E
+S315080009C044EA05441C60D0E9123403FB0422036898
+S315080009D053F8AC4F8C4344EA82041C60D0E91434C3
+S315080009E003FB0422036853F8F04F8C4344EA82045D
+S315080009F01C60036853F8F04FB0F8585024F47C1480
+S31508000A0044EA05441C60836D02EB4303026852F80E
+S31508000A10C04F8C4344EA83011160016851F8C02F26
+S31508000A20B0F85C3022F47C1242EA03420A6001689C
+S31508000A3051F8C02F90F8603022F07C5242EA0362E7
+S31508000A400A60416B224A02EB8101C166826B01EBA7
+S31508000A5082020267C36B02EBC3024267D0E9103415
+S31508000A60634302EB83028267D0E91234634302EBE5
+S31508000A708302C267D0E91434634302EB8302C0F8E9
+S31508000A808020836D02EBC302C0F88420C46D836E98
+S31508000A905C4302EB8402C0F88820046E5C4302EBD8
+S31508000AA08402C0F890200B4B9A4208D998304168C6
+S31508000AB041F02001416003210170012030BD002270
+S31508000AC000E004C1D0F890308B42FAD8002030BD3F
+S31508000AD000AC0040FCD30040F0B5D1E901650C69D3
+S31508000AE02C430D68002E19D045F080452C4391F80B
+S31508000AF02070D1E9066535434E6946EA07663543EF
+S31508000B00CE683543D0F88460806E584306EB800380
+S31508000B101C605D60083300200C4E0FE044EA8544F3
+S31508000B20E5E71418155CE77845EA0765A778647859
+S31508000B303F0447EA0424254320C3001DCC6806EB7E
+S31508000B40144424788442ECD8F0BD0000CC5900083F
+S31508000B5030B50E4B4FF08404CD0744EA002007D089
+S31508000B60DC6824F4E664DC60DC6814430443DC6077
+S31508000B70890709D503F58673196821F4E6611960B2
+S31508000B80196811430143196030BD00000020005266
+S31508000B90CA4393071A4A1CD0CB070AD0D36823F056
+S31508000BA03003D360D3680343D360D36843F0880324
+S31508000BB0D36089070CD502F58672116821F03001D9
+S31508000BC01160116801431160106840F088001060D8
+S31508000BD07047D16821F03001D160D2F80C1121F0AC
+S31508000BE03001C2F80C11D1680143D160D2F80C115A
+S31508000BF00143C2F80C11906940F0100090617047EB
+S31508000C00002000522DE9F04705460F4600F0C0FEC9
+S31508000C108246012F06D0294CDFF8A490294E04EA13
+S31508000C2009080AE00424F7E7681C06D000F0B0FEBD
+S31508000C30A0EB0A00A84224D81DB3B8F1000F22D0B1
+S31508000C40D6F8100124EA00004000EDD0012F1FD08D
+S31508000C50D6F810011C49084040F0004030F0024127
+S31508000C601AD01A4A91690143916110EA090F01D114
+S31508000C70706103E020F00040C6F814010120BDE8C9
+S31508000C80F0870320FBE7306934EA0000CCD0DDE7C3
+S31508000C9030690F490840E1E7012F4FF4803007D04B
+S31508000CA0D6F81011C90301D5C6F814010020E6E7E5
+S31508000CB03169C903FAD57061F8E7000004000080BD
+S31508000CC0F0FF10E0002000520000EE97C401002457
+S31508000CD00000EE172DE9F04704460D4616469846DD
+S31508000CE001274FEA952A4FEA8A2A2068401C05D12F
+S31508000CF05146204600F02CF900B90027012F09D1EA
+S31508000D002068504506D05146204600F031F9044681
+S31508000D1004B90027012F1DD12068281A05192D1D91
+S31508000D204FF480690AF5806AFFF7ADFD281B001F9E
+S31508000D30484506D35146204600F01AF9044664B1E0
+S31508000D40251D16F8010B05F8010BA8F10108B8F1E5
+S31508000D50000FE9D13846BDE8F0870027FAE700001A
+S31508000D6010B501240A480068401C04D0084800F061
+S31508000D7077F900B90024012C08D106480068401C00
+S31508000D8004D0044800F06CF900B90024204610BDD0
+S31508000D90DC0D0024D80900242DE9F0410127124969
+S31508000DA000EB400051F8205001EB80004668A80788
+S31508000DB050EA867004D00DA040F22B31FFF76BFB8A
+S31508000DC000240BE014F0FF0F01D1FFF75CFD286843
+S31508000DD0401C01D0002704E02D1D641CB4EB960FBF
+S31508000DE0F0D33846BDE8F081945A00082E2E5C2EC2
+S31508000DF02E5C2E2E5C2E2E5C536F757263655C41DD
+S31508000E00524D434D375F53544D333248375C666C09
+S31508000E106173682E630000002DE9F04107460D4610
+S31508000E200124FF26FF210F48C21B681E824200D2FA
+S31508000E300024012C0DD1384600F05CF806467819D6
+S31508000E40401E00F057F80146FF2E01D0FF2900D1B9
+S31508000E500024012C03D1304600F006F8044620464B
+S31508000E60BDE8F081FFFF1F082DE9F04186B0044672
+S31508000E700E46012500270097B44200D90025012D0A
+S31508000E8002D10E2E00D90025012D2CD100F05EFDD1
+S31508000E90DFF85C8023E02046FFF77EFFE8B9FFF71E
+S31508000EA0F2FC04EB440058F8201008EB8000426876
+S31508000EB0491C10D07AB1019720210591417A0291F7
+S31508000EC0007A03900120049001A8694600F038FCD6
+S31508000ED018B1002505E0002503E0641CE4B2B4421D
+S31508000EE0D9D900F0BBFC06B02846BDE8F081000061
+S31508000EF0945A00082DE9F0410546FF2600240C4FB8
+S31508000F00FFF7C1FC04EB440057F82010A94207D8A4
+S31508000F1007EB800040680844A84201D9264603E04A
+S31508000F20641CE4B20F2CEBD33046BDE8F081000018
+S31508000F30945A0008004870470000020803494FF019
+S31508000F40FF30086001F2044108607047D8090024A0
+S31508000F5010B501248A0500D00024012C06D10268A8
+S31508000F608A4203D002C0A202FFF797FC204610BDB2
+S31508000F7070B505460E460E48854203D1A0F20445D3
+S31508000F802C460CE00B48864203D1094D06462C46F2
+S31508000F9005E02C46284600F063F800B900242CB179
+S31508000FA031462846FFF7D4FF00B90024204670BD15
+S31508000FB0DC0D00240000020801200A490A684B6873
+S31508000FC01A448B681A44CB681A440B691A444B694D
+S31508000FD01A448B691A44D1F898121144002900D092
+S31508000FE000207047000002082DE9F04105460E462C
+S31508000FF0174601241648411B701E814200D2002460
+S31508001000012C0BD12846FFF775FFFF2805D0A81934
+S31508001010401EFFF76FFFFF2800D10024012C13D1D3
+S31508001020A80A80020B49884207D10B4833463A463C
+S315080010302946FFF74FFE044606E0084833463A4677
+S315080010402946FFF747FE04462046BDE8F081000022
+S31508001050FFFF1F0800000208DC0D0024D809002441
+S315080010602DE9F041074601253868FFF743FFFF28B9
+S3150800107000D10025012D25D100F068FC0024386830
+S3150800108000EB441607EB441808F10408FFF7FBFBCE
+S3150800109001204246314600F0FBFB08B100250FE06F
+S315080010A00023F05C18F80310884201D0002503E0FD
+S315080010B05B1CDBB2202BF4D315B1641C202CDED3C9
+S315080010C000F0CCFB2846BDE8F081000008B50120F9
+S315080010D0002100910C490A68521C14D048688A6895
+S315080010E01044CA6810440A6910444A6910448A6957
+S315080010F01044C9690844C043401C009003480421B1
+S315080011006A46FFF771FF08BDDC0D00249802020845
+S3150800111010B50B480168001D0468001D00680844E6
+S3150800112000280BD00749082201F077FB054904225D
+S315080011302046BDE81040103101F06FBB10BD00001D
+S3150800114000E8F11F8601002410B512496FF000402F
+S31508001150086000200860411E0E4A121D11601060CA
+S31508001160121D11601060121D11601060121D1160B1
+S315080011701060121D11601060121D11601060121DA2
+S3150800118011601060121D1160106000F057FC0020FD
+S3150800119010BD00007C44025870B5044600F0F8FB08
+S315080011A00546601C02D004480078044400F0F0FBB1
+S315080011B0401BA042FAD370BD0C00002470B590F80D
+S315080011C09840012C08D0022C06D050F89C1F41F0FC
+S315080011D002010160012070BD0468D4F8C05093FA7A
+S315080011E0A3F6B6FA86F6C5F30545B54206D850F80D
+S315080011F09C1F41F020010160012070BDD4F8CC404D
+S315080012001C4206D050F89C1F41F0400101600120A5
+S3150800121070BD93FAA3F3B3FA83F3FFF75DFC0020DE
+S3150800122070BD10B590F89820012A08D0022A06D079
+S3150800123050F89C1F41F002010160012010BDCA68E8
+S315080012400B688BB1072A0B6943EA42732BD00C7AD9
+S315080012504A6942EA84724968006F00EBC10003607C
+S3150800126042604FF0000010BD072A10D00C7A4FEAF2
+S31508001270C2624B6943EA84730C8A42EA044243EA2F
+S3150800128002034968C06E00EB81000360E9E70B8A38
+S315080012904FF060548A6942EA0343CA6944EA022263
+S315080012A043EA0203EDE78A69D5E730B5039C90F86F
+S315080012B09850012D06D050F89C1F41F0040101609A
+S315080012C0012030BD0068090141EA820141EA430173
+S315080012D02143C0F88010002030BD90F89820022ADB
+S315080012E006D050F89C1F41F00801016001207047A4
+S315080012F00068C0F8D010002070470068402904D064
+S31508001300D0F8B40000F07F007047D0F8A40000F0D1
+S315080013107F007047F0B5002690F89840022C06D05A
+S3150800132050F89C1F41F0080101600120F0BD4029DA
+S315080013300BD041292BD0046D8C424AD850F89C1FFB
+S3150800134041F0200101600120F0BD0468D4F8A050E6
+S3150800135015F4FE0F0DD0D4F8A4506D0610D0D4F8AD
+S31508001360A440C4F30526446C456F744305EB840515
+S3150800137034E050F89C1F41F0200101600120F0BDC7
+S3150800138050F89C1F41F4807101600120F0BD04688B
+S31508001390D4F8B05015F4FE0F0DD0D4F8B4506D063D
+S315080013A010D0D4F8B440C4F30526C46C856F7443D2
+S315080013B005EB840512E050F89C1F41F020010160FE
+S315080013C00120F0BD50F89C1F41F480710160012096
+S315080013D0F0BD446DC56F4C4305EB84052C6804F0DD
+S315080013E0804454602CB32C6824F0604414602C6844
+S315080013F004F0005494602C6804F000441461AC882E
+S31508001400A4B2D4616C6804F47024D4606C6804F4E3
+S31508001410801454616C6804F4001494616C68C4F315
+S31508001420066414626C680835E40F54620024184F89
+S3150800143009E02C68C4F38A441460D8E715F804C098
+S3150800144003F804C0641CD2F80CC007EB1C4C9CF8CB
+S3150800145000C0A445F2D8402909D041290BD0012261
+S3150800146020290CD200688A40C0F898200DE0006850
+S31508001470C0F8A86009E00068C0F8B86005E0006830
+S3150800148001F01F018A40C0F89C200020F0BD000032
+S31508001490CC5900082DE9F04393B004464C229549EF
+S315080014A06846FEF789FF6CB1934F2068B84202D1AF
+S315080014B000F5807060604FF4407994F89800002633
+S315080014C020B108E0012013B0BDE8F08384F89960E4
+S315080014D0204600F01CF92068816921F0100181611D
+S315080014E000F056FA05464FF003080DE000F050FAF2
+S315080014F0401B0A2808D954F89C0F40F001002060C8
+S3150800150004F8048C0120DEE7206880690007EDD422
+S315080015102068816941F00101816100F039FA0546C8
+S315080015200DE000F035FA401B0A2808D954F89C0F3C
+S3150800153040F00100206004F8048C0120C3E720680D
+S315080015408069C007EDD02068816941F00201816198
+S31508001550207C012839D02068816941F040018161E9
+S31508001560607C012837D02068816921F48041816137
+S31508001570A07C012835D02068816941F480518161B9
+S3150800158020688169A26821F440711143816120684D
+S31508001590816921F0A40181612068016921F01001A7
+S315080015A00161E068012822D030B302282BD02068D8
+S315080015B0816941F0800181612068016941F010016B
+S315080015C00161E068032818D022E02068816921F0CB
+S315080015D040018161C4E72068816941F480418161E5
+S315080015E0C6E72068816921F480518161C8E72068CF
+S315080015F0816941F0040181610AE02068816941F04E
+S315080016002001816104E02068816941F0200181613F
+S31508001610207E401E4106E069401E41EA0020216AFC
+S31508001620491E0843A18A491E40EA01402168C8614B
+S31508001630A06848450FD1E16AA06A491E401E40EAE3
+S315080016400121206B401E41EA0011A08C401E41EA90
+S3150800165000402168C860206E28B1206850F8C01F75
+S31508001660626E11430160D4E91701C842694609D080
+S31508001670206850F8C82FA36E22F0070251F82330CD
+S315080016801A430260206C48B1206850F8BC2F636C7E
+S3150800169022F0070251F823301A430260A06C50B1B9
+S315080016A0206850F8BC2FE36C22F0700251F8233002
+S315080016B042EA03120260206D50B1206850F8BC2F30
+S315080016C0636D22F4E06251F8231042EA01210160B9
+S315080016D02068B84204D16068816821F003018160FE
+S315080016E044F8946FA66001202071943C2046FFF7C9
+S315080016F01BF9E8E6DC59000800A000400068D0F8AD
+S31508001700CC00084201D1002070470120704770477D
+S3150800171090F89810012906D050F89C1F41F0040152
+S31508001720016001207047022180F8981001688A69D3
+S3150800173022F001028A610021C0F89C10002070473F
+S315080017402DE9F05F044689460025DFF808A19AF8D6
+S31508001750140001281CD001208AF814004FF0000B51
+S31508001760CAF818B02079C00706D001214CF25030CB
+S31508001770FFF748FA00B101252079800706D502212E
+S315080017804CF25030FFF73EFA00B101251DB15CE07E
+S315080017900220BDE8F09F20682F4F012807D04FF0A0
+S315080017A0FF30C9F80000A66840F2047848E061688E
+S315080017B02069FFF7EDF92079C0070AD001214CF21C
+S315080017C05030FFF71FFA00B10125F86820F008002D
+S315080017D0F8602079800738D502214CF25030FFF79F
+S315080017E011FA00B10125D7F80C0120F00800C7F856
+S315080017F00C012AE0226930466168FFF7A9F92079C9
+S31508001800C00709D001214CF25030FFF7FBF9054615
+S31508001810F86820EA0800F860207980070BD50221CD
+S315080018204CF25030FFF7EEF90546D7F80C0120EADE
+S315080018300800C7F80C0115B1C9F8006005E0761C68
+S31508001840D4E902100844B042D4D88AF814B028461D
+S315080018509FE70000C4010024002000520B48C1681D
+S3150800186041F00101C160C168C9070AD000F5867058
+S31508001870016841F0010101600068C00703D000203B
+S315080018807047012070470120704700000020005271
+S315080018902DE9F05F15460C460826DFF8A89099F85A
+S315080018A01400012809D0012089F81400A1F100616B
+S315080018B0B1F5801F04D2012703E00220BDE8F09F9E
+S315080018C002274FF0000AC9F818A04CF2503B3946D7
+S315080018D05846FFF797F918BBDFF86C80012F22D01E
+S315080018E0D8F80C0140F00200C8F80C01BFF36F8F5E
+S315080018F0BFF34F8F01CD01C4761EF6B2002EF9D183
+S31508001900BFF36F8FBFF34F8F39465846FFF77AF903
+S31508001910012F0FD0D8F80C1121F00201C8F80C11CC
+S3150800192089F814A0CAE7D8F80C0040F00200C8F8F5
+S315080019300C00DBE7D8F80C1021F00201C8F80C10EF
+S31508001940EEE70000C4010024002000520D48C168DB
+S315080019500E4ACB070C4906D041604260C368DB07D4
+S3150800196001D001207047D0F80C31DB0708D000F50C
+S315080019708270016002608068C00701D0012070474C
+S31508001980002070470020005223016745AB89EFCD40
+S3150800199001F040BF10B5032000F02EF900F048FE14
+S315080019A00F490A68C2F303230E4AD35C03F01F03E8
+S315080019B0D840096801F00F01515C0B4A01F01F017C
+S315080019C020FA01F1116009490860002000F010F8BA
+S315080019D008B1012010BD00F071F8002010BD00000C
+S315080019E018440258BA5900080400002400000024CC
+S315080019F070B504460F4D2A78002A0CD04FF47A7039
+S31508001A000D49B0FBF2F00968B1FBF0F000F0EAFE10
+S31508001A1018B1012070BD012070BD102C07D200221C
+S31508001A202146501E00F0C8F86C60002070BD0120E9
+S31508001A3070BD00000C0000240000002410B501F061
+S31508001A404DF8194C4FF40001A161184800F026FF23
+S31508001A50174800F023FF204600F020FF154800F045
+S31508001A601DFF1548016821F0006101601248143015
+S31508001A70016821F480710160001F016821F480214A
+S31508001A800160082000F0E6FE042000F0E3FE0220D4
+S31508001A9000F0E0FE012000F0DDFE07481C3001687A
+S31508001AA021F00201016010BD00040258000C025822
+S31508001AB00008025800000258D8440258F0B587B00A
+S31508001AC03848016841F002010160006800F0020030
+S31508001AD00090012000F0C6FE022000F0C3FE04209C
+S31508001AE000F0C0FE082000F0BDFE2E480C38016844
+S31508001AF041F480210160006800F4802000902948A4
+S31508001B000838016841F480710160006800F480704B
+S31508001B1000908020019001200290002403940494F0
+S31508001B20059401A9204F384600F048FF4FF40050AD
+S31508001B3001900294059401A91C4800F03FFF4FF458
+S31508001B40407601960225029503940494059407208D
+S31508001B50069001A9164800F031FF019602950395F3
+S31508001B60049405940920069001A9384600F026FF3A
+S31508001B70F0000190029503200390049405940A202E
+S31508001B80069001A90B4800F019FF06481C380168A1
+S31508001B9041F000610160006800F00060009007B045
+S31508001BA0F0BD0000F4440258000402580008025828
+S31508001BB0000C025800000258F0B40D460D4B1B6885
+S31508001BC0C3F30223C3F10704042C00D90424191D06
+S31508001BD0072901D2002300E0DB1E012606FA04F1DC
+S31508001BE0491E294099409E40761E16403143F0BC56
+S31508001BF003F0C7BE0CED00E000F00701054A1068C7
+S31508001C004FF6FF03184040EA0120034908431060D5
+S31508001C10704700000CED00E00000FA05016801229B
+S31508001C20C0F8FC23002280F8F423886940F000609D
+S31508001C308861486D024A10434865002070470000D5
+S31508001C40030000107047006841620020704770B5B5
+S31508001C500368586A002907D09C6A00EB14440020E0
+S31508001C60491E4FF482750AE040EA024098620DE088
+S31508001C7005EB80069E5904EB1644401CC0B2884208
+S31508001C80F6D305EB810144EA02405850002070BDA6
+S31508001C9010B50446012003F001FAD4F80404BDE89F
+S31508001CA0104002F09DB9C1EBC10200EB8202D0F8E8
+S31508001CB00404926C02F0DDB8C1EBC10200EB8202AB
+S31508001CC0D0F80404D2F8082202F03EB910B504464A
+S31508001CD0002C0CD0032084F8BD03204600F046FCF7
+S31508001CE0204600F0D5FB002084F8BD0310BD012076
+S31508001CF010BD10B50446206894F8BC13012906D017
+S31508001D00012184F8BC13A16A012902D008E0022047
+S31508001D1010BDA169012903D0816B41F4803181632B
+S31508001D20206802F08FFD002084F8BC0310BD10B5B2
+S31508001D30044694F8BC03012809D0012084F8BC03A2
+S31508001D40206802F08BFD002084F8BC0310BD022039
+S31508001D5010BD10B50446002003F0A0F9D4F8040419
+S31508001D60BDE8104002F03EB970B504464FF00102D6
+S31508001D7001F00F004FF000050B06C0EBC00104EBA5
+S31508001D80810102D53C314A7002E001F5FE714D70C1
+S31508001D90087094F8BC03012808D084F8BC2320688E
+S31508001DA002F00EFD84F8BC53002070BD022070BD01
+S31508001DB070B5044601F00F006268904201D901200F
+S31508001DC070BD0B064FF0010201F00F014FF0000540
+S31508001DD0C1EBC10104EB810102D53C314A7002E036
+S31508001DE001F5FE714D708D70087094F8BC030128DA
+S31508001DF008D084F8BC23206802F0AAFE84F8BC53F5
+S31508001E00002070BD022070BD01F00F01C1EBC101B9
+S31508001E1000EB8100D0F8140270472DE9F041044622
+S31508001E204FF0010601F00F004FF000050F06C0EB5A
+S31508001E30C00104EB810102D53C314E7002E001F588
+S31508001E40FE714D7008708A60CB704A7802B1C880FE
+S31508001E50022B00D10D7194F8BC03012809D084F82F
+S31508001E60BC63206802F000FC284684F8BC53BDE831
+S31508001E70F0810220FBE770B50D4605F00F04C4EBB0
+S31508001E80C40100EB810101F5FE71CA604B610023B4
+S31508001E908B614B700C700369012B00D10A612A070C
+S31508001EA005D0027C006802F0ABFE002070BD027C03
+S31508001EB0006802F099FDF8E770B504460D4605F08E
+S31508001EC00F006168884201D9012070BD29064FF0CC
+S31508001ED000064FF0010206D5C0EBC00104EB8101F4
+S31508001EE03C314A7006E0C5EBC50104EB810101F5FA
+S31508001EF0FE714E708A70087094F8BC03012807D0EA
+S31508001F0084F8BC23206802F04FFE280702D007E0B9
+S31508001F10022070BD217C04F57172206802F0EEFD86
+S31508001F2084F8BC63002070BD70B50D4605F00F043B
+S31508001F30C4EBC40100EB81013C31CA604B6100234C
+S31508001F408B6101234B700C700369012B00D10A6168
+S31508001F502A0705D0027C006802F052FE002070BDF8
+S31508001F60027C006802F040FDF8E72DE9F84F0446C8
+S31508001F702568284602F076FF00287ED1206802F000
+S31508001F809DFF002879D0206802F098FF800704D5C5
+S31508001F902068416901F002014161206802F08EFF64
+S31508001FA0C10604F57170009035D52068816921F065
+S31508001FB0100181612F6A07F00F00C0EBC00004EB27
+S31508001FC0800606F5FE76C7F34340022802D00628A7
+S31508001FD012D01BE047F6F070074217D0C7F30A1273
+S31508001FE0F1681746284602F06DFFF0683844F0603D
+S31508001FF0B0693844B06109E000990822284602F021
+S3150800200061FFB069C7F30A110844B06120688169A5
+S3150800201041F010018161206802F050FF00034FF083
+S3150800202001084FF008094FF0100A3ED5002620682F
+S3150800203002F023FF834635E05FEACB702FD0206895
+S31508002040F1B202F033FF0746F80707D005EB461052
+S31508002050C0F8088B3146204601F004F9380707D541
+S3150800206005EB4610C0F8089B3146204601F0D6F825
+S31508002070F80605D505EB461000E087E1C0F808AB81
+S31508002080B80604D505EB46112020C1F8080BB8049C
+S3150800209005D505EB46114FF40050C1F8080B761C20
+S315080020A04FEA5B0BBBF1000FC6D1206802F006FFB2
+S315080020B0400359D5206802F0D9FE8346002650E031
+S315080020C05FEACB704AD02068F1B202F0DDFE07461F
+S315080020D0F80723D006F00F0108FA01F0D5F83418EE
+S315080020E08143C5F8341805EB4610C0F808892069FD
+S315080020F001280FD1C6EBC60004EB8000D0E91121F8
+S315080021001144816436B9206D20B920680121009AEE
+S3150800211002F0F4FC2046F1B2FFF7C5FD380703D5F7
+S3150800212005EB4610C0F80899F80603D505EB4610E6
+S31508002130C0F808A9780604D505EB46114020C1F871
+S315080021400809B80704D505EB46110220C1F80809A5
+S31508002150380603D53146204601F0F6F8761C4FEAD4
+S315080021605B0BBBF1000FABD1206802F0A7FE00287D
+S3150800217011DAD5F8040820F00100C5F8040894F827
+S31508002180F403012839D0204600F0A6F920684169F1
+S3150800219001F000414161206802F090FE00050BD570
+S315080021A0D5F80808C00702D0204600F0FDF92068D7
+S315080021B0416901F400614161206802F07FFE000177
+S315080021C00AD52068416901F00061416194F8F40379
+S315080021D0D8B1204600F0E8F9206802F06FFEC00486
+S315080021E073D5D5F8040820F00100C5F8040820685E
+S315080021F0102102F015FE002132E0002084F8F403D5
+S3150800220000212046FFF71EFDC0E784F8F483206806
+S31508002210406DC0F38300C4F8F80301212046FFF798
+S3150800222011FDD9E705EB41104FF67F3200F5106036
+S315080022308260036823F400130360036843F00063B5
+S315080022400360C0F80822D0F8002222F40012C0F871
+S315080022500022D0F8002242F00062C0F80022491C91
+S3150800226060688842DED8D5F81C0840F00110C5F829
+S315080022701C08206B60B1D5F8840840F00B00C5F83F
+S315080022808408D5F8440840F00B00C5F844080CE06B
+S31508002290D5F8140842F22B010843C5F81408D5F8F6
+S315080022A0100840F00B00C5F81008D5F8000820F40F
+S315080022B0FE60C5F80008217C2068009A02F01EFC22
+S315080022C02068416901F480514161206802F0F6FDF9
+S315080022D0800415D5206802F009FA206802F0B2FDDC
+S315080022E0E06000F083F9227B0146206802F028FEB0
+S315080022F0204600F0CFF82068416901F40051416199
+S31508002300206802F0DBFD000707D5204600F0EEF84E
+S315080023102068416901F008014161206802F0CEFD9C
+S31508002320C00208D50021204600F032F8206841692D
+S3150800233001F480114161206802F0C0FD800208D5D1
+S315080023400021204600F028F82068416901F40011B0
+S315080023504161206802F0B2FD400007D52046FFF72C
+S3150800236097FC2068416901F080414161206802F0CC
+S31508002370A5FD40070AD520684568680702D52046A6
+S31508002380FFF7E7FC2068416829434160BDE8F88FFC
+S31508002390D0F8040401F084BED0F8040401F082BE2B
+S315080023A02DE9F0418AB00446002C05D0266894F839
+S315080023B0BD03002520B108E001200AB0BDE8F08180
+S315080023C084F8BC53204600F064F8032084F8BD0363
+S315080023D0F06BC00500D42561206802F0FFFA04F10D
+S315080023E01001684628228846FDF7E6FF94E80F00A4
+S315080023F002F08AF9022718B184F8BD730120DCE7D8
+S315080024002068002102F06DFD002101260DE0C1EBD8
+S31508002410C10004EB80003C3046700170C180C57075
+S315080024208560C5604561491CC9B260688842EED8B6
+S3150800243000210DE0C1EBC10004EB800000F5FE7041
+S3150800244045700170C5708560C5604561491CC9B293
+S3150800245060688842EED8282241466846FDF7ACFFF8
+S3150800246094E80F0002F006FA18B184F8BD7301204B
+S31508002470A3E784F8385084F8BD63606A012802D15E
+S315080024802046FFF7CBFB206802F0E8F9002094E726
+S315080024907047704770B504460125E068002810D0DB
+S315080024A0022803D0912108A0FDF7F5FFD4F804040B
+S315080024B0294601F04DFED4F80404BDE8704001F049
+S315080024C008BE0025F2E700002E2E5C757362645F75
+S315080024D0636F6E662E63000010B5044602F014FFA3
+S315080024E0D4F80404BDE8104001F01CBED0F804047A
+S315080024F001F022BE10B5044694F8BC0301280BD09F
+S31508002500012084F8BC0384F83810206802F001FD25
+S31508002510002084F8BC0310BD022010BDD0F80424A6
+S3150800252000F57171104601F01FBE10B5044620680B
+S3150800253094F8BC13012906D0012184F8BC13A16ABA
+S31508002540012902D008E0022010BDA169012903D0A3
+S31508002550816B41F480318163206802F073F9206849
+S3150800256002F048FC002084F8BC0310BD70B5044690
+S3150800257094F8BC0301280ED0012084F8BC03206817
+S3150800258002F02CFA206802F055FD002528B184F8DF
+S31508002590BC53012070BD022070BD206802F05EF9B0
+S315080025A084F8BC53002070BD10B50446D4F8040462
+S315080025B001F022FE2068D0F8001E41F00101C0F8A3
+S315080025C0001E206A20B10448016841F00601016036
+S315080025D0BDE8104002F063BD10ED00E00248016856
+S315080025E041F08071016070470C48025800B500F050
+S315080025F01FF80B490A68C2F303230A4AD35C03F09F
+S315080026001F03D840096801F00F01515C064A01F022
+S315080026101F0120FA01F11160044A1060084600BD46
+S3150800262018440258BA59000804000024000000247F
+S3150800263030B564480068654C10F03801624808D027
+S31508002640021108290DD010290DD018290DD01046D1
+S3150800265030BD21688906FBD52168C1F3C101C84090
+S3150800266030BD104630BD5A4830BD564918310A6843
+S3150800267002F003020968C1F30511524B1C331B68AB
+S3150800268003F001034F4D24352D68C5F3CC0515FB22
+S3150800269003F300EE103AB8EE400A002977D0DFEDD2
+S315080026A04D0A484BB7EE001A20333AB39FED4A2A33
+S315080026B0012A58D0022A6CD001EE901A1868F8EE52
+S315080026C0611AC2EE212AC0F3080001EE900AF8EE5C
+S315080026D0611A40EE201A31EE810A22EE800A186845
+S315080026E0C0F34620401C00EE900AF8EE600A80EE21
+S315080026F0201ABCEEC10A10EE100A30BD22689206F6
+S315080027001BD52268C2F3C102D04001EE900A1868B0
+S31508002710F8EE612A01EE901AF8EE611A82EEA12A05
+S31508002720C0F3080001EE900AF8EE611A40EE201A8E
+S3150800273031EE810A22EE000AD1E701EE901ADFEDAA
+S31508002740272A1868F8EE611A82EEA12AC0F3080053
+S3150800275001EE900AF8EE611A40EE201A31EE810A6F
+S3150800276022EE000ABBE701EE901A1868F8EE611A25
+S31508002770C2EE212AC0F3080001EE900AF8EE611AAB
+S3150800278040EE201A31EE810A22EE800AA7E716E00B
+S31508002790FFE701EE901ADFED122A1868F8EE611AC3
+S315080027A082EEA12AC0F3080001EE900AF8EE611A3B
+S315080027B040EE201A31EE810A22EE000A8FE7002049
+S315080027C030BD0000104402580090D003004402585F
+S315080027D000127A00000000390024744A0024744C60
+S315080027E00024F44A10B5401EB0F1807F01D30120C1
+S315080027F010BD4FF0E02460610F21601703F0C1F8A7
+S315080028000020A06107202061002010BD10B5FFF749
+S31508002810C1F8BDE8104000F0EDBEF0B500230A256A
+S3150800282030263727002412E0B5EB107F04D906EBD3
+S31508002830107C01F813C003E007EB107C01F813C005
+S31508002840000101EB430C8CF801405B1CDBB29342A0
+S31508002850EAD3F0BD02490A6882430A60704700005D
+S31508002860E044025808B504490A6802430A60096840
+S315080028700140009108BD0000E044025802490A6878
+S3150800288002430A60704700008844025802490A68F1
+S3150800289082430A60704700008844025870B50024D5
+S315080028A03B49884206D10120FFF7E8FF0120FFF7E0
+S315080028B0EDFF6AE03749884206D10220FFF7DEFFBE
+S315080028C00220FFF7E3FF60E03349884206D104207F
+S315080028D0FFF7D4FF0420FFF7D9FF56E02F498842B7
+S315080028E006D10820FFF7CAFF0820FFF7CFFF4CE004
+S315080028F02B49884206D11020FFF7C0FF1020FFF7AA
+S31508002900C5FF42E02749884206D12020FFF7B6FFD7
+S315080029102020FFF7BBFF38E02349884206D1402034
+S31508002920FFF7ACFF4020FFF7B1FF2EE01F498842B2
+S3150800293006D18020FFF7A2FF8020FFF7A7FF24E03B
+S315080029401B49884208D14FF480752846FFF796FF41
+S315080029502846FFF79BFF18E01649884208D14FF42E
+S3150800296000752846FFF78AFF2846FFF78FFF0CE019
+S315080029701149884208D14FF480652846FFF77EFF43
+S315080029802846FFF783FF00E00124204670BD0000BB
+S31508002990000002580004025800080258000C0258A9
+S315080029A0001002580014025800180258001C025859
+S315080029B0002002580024025800280258F0B50A6878
+S315080029C092FAA2F2B2FA82F453E00123A3401A4023
+S315080029D0CAB34B68012B01D0022B10D18D68134660
+S315080029E086685B4303EB43076B43BE431E4386601F
+S315080029F0CD680B6846689E436B431E4346600D6967
+S31508002A001346D0F80CC05B431E4603EB43076B43E3
+S31508002A102CEA070C4CEA030CC0F80CC04B68022BD6
+S31508002A2020D1FF2A10D84D69D0F820C006FB02F342
+S31508002A305343C3EB03126B432CEA020C4CEA030C18
+S31508002A40C0F820C00EE013E04B69150A05FB05F235
+S31508002A506A436A43456AC2EB021C5A4325EA0C05D7
+S31508002A60154345624A6803685643BB4333430360CC
+S31508002A70641C0A6832FA04F3A7D10020F0BD0000EE
+S31508002A8002480068C0F3002070470000004402585E
+S31508002A90DDED000A00EE100A9FED0F2AB8EE401A87
+S31508002AA000EE101AB8EE400AC1EE001A00EE102A1F
+S31508002AB0B8EE401A00EE103AB8EE400A00EE021AD6
+S31508002AC021EE810AB8EE601AC0EE010ABCEEE00AF1
+S31508002AD010EE100A704700000000003970B5264D48
+S31508002AE0286840F00100286000F078FA0028FBD03A
+S31508002AF021480024103004602868204908402860CE
+S31508002B0000F07CFA0028FBD100F080FA0028FBD1FF
+S31508002B1000F084FA0028FBD1174818300460001D1D
+S31508002B200460001D04601449154828310860091D11
+S31508002B3014480860091D14480860091D0C60091D21
+S31508002B400860091D0C60091D0860081D04602868D6
+S31508002B5020F4802028600848603004600648683001
+S31508002B60016840F2FF72114301600348D0300168E2
+S31508002B7041F48031016070BD0044025845EDF6EA23
+S31508002B80000202020000FF0180020101064AC1B2EA
+S31508002B901144030E0A68C0F304218B401A40CA4048
+S31508002BA040EA0240704700004C4402582DE9F84FAD
+S31508002BB0044600250027374E306800F00300002839
+S31508002BC004D001280BD0022812D10DE000F006FA35
+S31508002BD070B100F0FBF9304DC008C54008E0FFF7BA
+S31508002BE04FFF28B12D4D03E000F0E8F900B12C4D58
+S31508002BF0002020606060A0603068C0F30518254E8C
+S31508002C0008363068C0F3080909F10109A6F1040A73
+S31508002C10DAF80000C0F3000018B1301D0068C0F3F0
+S31508002C20CC07B8F1000F33D0DAF80000C0F3004043
+S31508002C3058B13068C0F34620401C3B464A464146D8
+S31508002C4000902846FFF724FF2060DAF80000C0F35A
+S31508002C50404058B13068C0F30640401C3B464A46DF
+S31508002C60414600902846FFF713FF6060DAF8000037
+S31508002C70C0F3804000280BD03068C0F30660401CC3
+S31508002C803B464A46414600902846FFF701FFA060AA
+S31508002C90BDE8F88F284402580090D00300093D008B
+S31508002CA000127A002DE9F84F044600250027384E11
+S31508002CB0306800F00300002804D001280BD0022851
+S31508002CC012D10DE000F08AF970B100F07FF9314DAC
+S31508002CD0C008C54008E0FFF7D3FE28B12E4D03E033
+S31508002CE000F06CF900B12D4D002020606060A060F6
+S31508002CF03068C0F30538264E10363068C0F3080928
+S31508002D0009F10109DFF888A00AF1040ADAF80000D7
+S31508002D10C0F3001018B1301D0068C0F3CC07B8F135
+S31508002D20000F33D0DAF80000C0F3C04058B130685D
+S31508002D30C0F34620401C3B464A464146009028467A
+S31508002D40FFF7A6FE2060DAF80000C0F3005058B17D
+S31508002D503068C0F30640401C3B464A464146009050
+S31508002D602846FFF795FE6060DAF80000C0F3405089
+S31508002D7000280BD03068C0F30660401C3B464A4624
+S31508002D80414600902846FFF783FEA060BDE8F88F0D
+S31508002D90284402580090D00300093D0000127A002A
+S31508002DA02DE9F84F044600250027394E306800F013
+S31508002DB00300002804D001280BD0022812D10DE008
+S31508002DC000F00CF970B100F001F9324DC008C540A9
+S31508002DD008E0FFF755FE28B12F4D03E000F0EEF8A6
+S31508002DE000B12E4D002020606060A0603068C0F3FE
+S31508002DF00558274E18363068C0F3080909F1010945
+S31508002E00DFF88CA00AF1040ADAF80000C0F3002003
+S31508002E1018B1301D0068C0F3CC07B8F1000F35D0E3
+S31508002E20002D33D0DAF80000C0F3805058B130686E
+S31508002E30C0F34620401C3B464A4641460090284679
+S31508002E40FFF726FE2060DAF80000C0F3C05058B13C
+S31508002E503068C0F30640401C3B464A46414600904F
+S31508002E602846FFF715FE6060DAF80000C0F3006038
+S31508002E7000280BD03068C0F30660401C3B464A4623
+S31508002E80414600902846FFF703FEA060BDE8F88F8C
+S31508002E90284402580090D00300093D0000127A0029
+S31508002EA00248006800F47060704700001844025831
+S31508002EB0FEB50024FFF76AFE3A4A4FF440764FF40F
+S31508002EC08033811A90424FF47D4560D022DC364A21
+S31508002ED09042A0EB020109D010DC344DA0F1E0606D
+S31508002EE0083842D0B0422ED098422AD100F08EF847
+S31508002EF038B36846FFF7D6FE019C22E0A94201D006
+S31508002F0099421ED100F08AF8D8B16846FFF748FF03
+S31508002F10019C16E0264A881A914204D008DCB14280
+S31508002F2035D099420DD1FFF7ABFD50B1214C08E0E1
+S31508002F30A84201D0984204D100F058F808B14FF4DD
+S31508002F4000442046FEBD00F07BFA0446FFF7A8FFC2
+S31508002F50C0F30320285C00F01F0024FA00F000F0FC
+S31508002F6041FA00F05DFA0446EBE700F069FA044618
+S31508002F70FFF796FFC0F30320285C00F01F0024FA31
+S31508002F8000F000F02FFA00F03BFA0446D9E700F00B
+S31508002F9025F80028D5D000F019F8074CC008C44019
+S31508002FA0CFE700000800030708030107285A0008AE
+S31508002FB00003010000093D000090D00302480068A4
+S31508002FC0C0F34040704700000044025802480068B9
+S31508002FD000F01800704700000044025802480068D4
+S31508002FE0C0F3800070470000004402580248006899
+S31508002FF0C0F3400070470000704402580248006859
+S31508003000C0F3406070470000004402580248006858
+S31508003010C0F3C060704700000044025802480068C8
+S31508003020C0F34070704700000044025803490A681C
+S3150800303022F00F0202430A60704700001844025843
+S315080030400149086070470000000000242DE9F0419E
+S3150800305004460D46012600202168C1F30001002917
+S315080030606ED12A69A968EB6911436A691A43114343
+S3150800307022683E4B1A4011432160E968626822F4CF
+S3150800308040520A436260A969A26822F440720A4360
+S31508003090A2603749374B8C4203D11846FFF708FF21
+S315080030A030E0354A3549944203D10846FFF700FF18
+S315080030B028E0334A944203D10846FFF7F9FE21E097
+S315080030C0304A944203D10846FFF7F2FE1AE02E4A28
+S315080030D0944203D10846FFF7EBFE13E02B4A9442CD
+S315080030E003D11846FFF7E4FE0CE0294A944203D1BF
+S315080030F00846FFF7DDFE05E0264A944202D1084657
+S31508003100FFF7D6FEA8B1696899B10026EB692A6867
+S315080031100B2A0ED8204FB3F5004F14D0D2B257F869
+S315080031202220B0FBF2F000EB5100B0FBF1F080B2C8
+S31508003130E0602888E16A80B221F00F010143E1626C
+S315080031403046BDE8F081D2B257F82220B0FBF2F043
+S31508003150400000EB5100B0FBF1F080B24FF6F07181
+S315080031600140C0F342000143E160E2E7F369FFEF83
+S31508003170001001400803000700440040080000074B
+S3150800318000480040004C0040005000400014014038
+S3150800319000780040007C0040385A000802494FF485
+S315080031A00000886170470000000402580149488001
+S315080031B0704700001800002410B500F02BFB0B4CDC
+S315080031C0616888420CD32078094950B100202070E4
+S315080031D04FF40000886100F01DFB618808446060B8
+S315080031E010BD0120207080208861F4E718000024B3
+S315080031F00004025810B5FDF769FF18B1BDE8104084
+S31508003200FDF7AEBD002010BDFDF706BEFDF792BE68
+S31508003210FDF794BEFDF7D0BEFDF7E6BE70B50446D1
+S315080032202068056C00EB4110D0F8081B0C4EB5421F
+S3150800323005D9090403D54FF40041C0F8081B2046F8
+S31508003240FFF76CF9B54208D92069012805D120682D
+S31508003250012104F5717201F051FC002070BD0000D7
+S315080032600A30544F2DE9F04104460D462668316C64
+S3150800327006EB4510D0F8083B4FF40047D4F8108009
+S3150800328004F571724FF0200CB8F1010F08D0DFF881
+S31508003290B080414545D119043AD5C0F8087B4CE0C1
+S315080032A0284E5FEA037806D5B14246D9190444D5B3
+S315080032B0C0F8087B41E05FEA836802D5C0F808CB0E
+S315080032C03BE013F0280F38D1B14204D9190402D5CE
+S315080032D0C0F8087B31E0C5EBC501D0F8100B04EB4C
+S315080032E0810101F501710B68C0F31200181A086113
+S315080032F048681844486035B9D4F8100218B92068E7
+S31508003300012101F0FBFB2046E9B2FEF7D5FC14E0EB
+S31508003310990601D5C0F808CB2046E9B2FEF7CCFCE1
+S315080033200BE035B9D4F8100218B90021304601F07F
+S31508003330E5FB2046E9B2FEF7BFFC0020BDE8F081B8
+S315080033400A31544F0A30544F2DE9F84F80460E463D
+S31508003350D8F80070C6EBC60008EB80043C34D4E904
+S315080033600510884202D90120BDE8F88F081AA1681D
+S31508003370814200D20846C01C4FEA900A07EB46195C
+S3150800338016E0151AA268AA4200D21546E81C4FEAAA
+S31508003390900A98F810000090ABB2E1683846F2B28D
+S315080033A001F069FEE0682844E060A0692844A0614D
+S315080033B0D9F8180980B2504505D3D4E905209042BA
+S315080033C001D2002ADDD1D4E90501884208D80120B6
+S315080033D006F00F018840D7F834188143C7F8341827
+S315080033E00020C1E70449096801F00F01034A515C4E
+S315080033F001F01F01C840704718440258285A0008AF
+S315080034000549096801F07001044A0909515C01F08F
+S315080034101F01C840704700001C440258285A00087B
+S315080034200549096801F4E061044A090A515C01F09A
+S315080034301F01C840704700001C440258285A00085B
+S315080034400EB500200D49096801F0380100290AD097
+S3150800345008290ED010290ED0182903D16846FFF77F
+S31508003460A5FB00980EBDFFF7B1FDC1080448C8408A
+S315080034700EBD04480EBD04480EBD00001044025897
+S315080034800090D00300093D0000127A0010B588B0FC
+S315080034900D4C206820F001002060002100914FF4B7
+S315080034A0614001900291039104910C2005900691C8
+S315080034B0079169462046FFF7C9FD206840F00100DC
+S315080034C0206008B010BD00000048004002460020F9
+S315080034D00449CB69C3F34013002B02D0486A107025
+S315080034E001207047004800402DE9F04180460F460C
+S315080034F01B4C00251B4E6078002810D020783044DD
+S31508003500401CFFF7E3FF012819D000F083F9616832
+S31508003510C831884200D965700020BDE8F08111489D
+S31508003520FFF7D4FF0128F7D13078401E8028F3D85A
+S3150800353000F070F96060257001206070ECE7207873
+S31508003540401CC2B22270307831469042E4D1491C00
+S315080035504046FDF7A2F96570207838700120DCE74F
+S31508003560B0010024E011002470B5094DA86200F0EE
+S3150800357051F900F10A0405E0FDF785F900F04AF96A
+S31508003580A04204D8E869C0F3C0100028F4D070BD82
+S315080035900048004070B505460E46812E03D98421A1
+S315080035A008A0FCF778FF3046FFF7DEFF002406E0A8
+S315080035B0FDF769F9285DFFF7D7FF641CA4B2B4428A
+S315080035C0F6D370BD2E2E5C2E2E5C2E2E5C2E2E5C17
+S315080035D0536F757263655C41524D434D375F535463
+S315080035E04D333248375C72733233322E6300000033
+S315080035F07047000010B55A48016821F00F0141F0E4
+S3150800360004010160006800F00F00042803D0672158
+S3150800361054A0FCF740FF5648016821F0070141F025
+S315080036200201016052480C30016841F440410160D2
+S315080036305049086840F480200860086840F48030E3
+S3150800364008600868C0F340400028FAD0494A283282
+S31508003650106820F0030040F002001060101D036897
+S3150800366043F480330360036843F40033036003685C
+S3150800367023F00C0343F004030360036823F00203FA
+S315080036800360106820F47C7040F0400010603948F0
+S315080036903030026840F2DF136FF308021A43026003
+S315080036A0026822F47E4242F400720260026822F442
+S315080036B0FE0242F498120260026822F0FE4242F0CC
+S315080036C080720260086840F0807008600868C0F37D
+S315080036D040600028FAD00820FFF7A8FC25481030DB
+S315080036E0016821F0070141F003010160214C1834FB
+S315080036F0206820F4706020600820FFF797FC201DE2
+S31508003700016821F0700141F040010160016821F46F
+S31508003710E06141F480610160206820F0700040F0AB
+S315080037204000206013482030016821F0700141F004
+S31508003730400101600F485430016821F0070101601B
+S31508003740011F0A6822F040520A60016821F44011FC
+S3150800375041F480110160BDE810400748FFF770BCCE
+S31508003760002000522E2E5C6D61696E2E63000000EB
+S315080037700C4802580044025800389C1C204801682E
+S3150800378041F4700101601F49086840F001000860B3
+S315080037901C4A0020103210600A681B4B1A400A6047
+S315080037A0184A18321060121D1060121D1060154A52
+S315080037B028321060121D1060121D1060121D106054
+S315080037C0121D1060121D1060121D1060121D10606F
+S315080037D00A6822F480220A600A49603108600B48A8
+S315080037E000686FF30F00B0F1005F02D208490120AC
+S315080037F008604FF000600249803908607047000091
+S3150800380088ED00E0004402587FEDF6EA0010005CFF
+S315080038100881005100B500F01FF80148006800BD96
+S31508003820B801002400B500F00FF84FF0E020044975
+S31508003830416100218161052202610248016000BDE3
+S31508003840FF520700B80100244FF0E0200021016173
+S3150800385041618161704700004FF0E0200069C003B4
+S3150800386003D502480168491C01607047B801002465
+S3150800387010B501F011FE002010BD084610B501F084
+S315080038808BFD002010BD70B5054600242846812111
+S3150800389000F0E6FA0121284600F0E2FA204670BD5B
+S315080038A00A21018000487047240000242021018055
+S315080038B0004870473000002400487047E0010024A3
+S315080038C070B505460024284640230222812100F0CF
+S315080038D0EBFB402328460222012100F0E5FB044ABF
+S315080038E040230121284600F0EBFB204670BD00006E
+S315080038F0E001002410B590F89C02032801D101F0DC
+S31508003900CBFD002010BD000070B517221E4C0B78A9
+S3150800391013F060030DD0402B2ED14A78012A2BD103
+S315080039208988072928D104F117019E2200F06FF82B
+S3150800393022E04B78062B04D00A2B11D00B2B1BD177
+S3150800394014E04B882125B5EB132F05D10E4C09340D
+S31508003950CA88172A00D91722214600F058F80BE022
+S3150800396009490122193900F052F805E04A8812F08F
+S31508003970FF0F03D000F034F8002070BD0249D0B222
+S3150800398019390860F8E700003900002410B5D0F8A6
+S31508003990B42252689047002010BD90F89C22012A54
+S315080039A005D0022A03D0032A01D000F019B84988A5
+S315080039B0012904D10021C0F8A41200F035B87047D7
+S315080039C010B513460A46002100F07AFB002010BD08
+S315080039D010B513460A46002100F016FC002010BD5B
+S315080039E010B504468021204600F0EBFB2046BDE8D2
+S315080039F01040002100F0E5BB10B50521C0F894126F
+S31508003A0000231A46194600F05BFB002010BD10B5CE
+S31508003A100223C0F89432C261026213460A460021A4
+S31508003A2000F0F2FB002010BD10B50421C0F8941276
+S31508003A3000231A46194600F0E7FB002010BD10B512
+S31508003A400446012084F89C02D4F8B402217942681D
+S31508003A5020469047204600F0C6FB204600F0B7FAFD
+S31508003A60002010BD10B5002806D007A00A46054953
+S31508003A7000F0A6F9034810BD03A00A46014900F064
+S31508003A809FF9F7E72806002444656661756C74009B
+S31508003A9012200880004870474C01002410B5002801
+S31508003AA006D007A00A46054900F08AF9034810BD62
+S31508003AB003A00A46014900F083F9F7E7280600241F
+S31508003AC057696E5553422042756C6B20496E746572
+S31508003AD0726661636500000004200880004870472C
+S31508003AE04801002410B504A00A46024900F068F906
+S31508003AF0004810BD280600244F70656E424C5420BD
+S31508003B00557365720000000010B5002806D007A09E
+S31508003B100A46054900F054F9034810BD03A00A46B1
+S31508003B20014900F04DF9F7E72806002457696E5554
+S31508003B3053422042756C6B204465766963650000C4
+S31508003B4010B51A200880FDF7E3FA014810BD0000F9
+S31508003B508401002421200880004870476001002461
+S31508003B600A46D188012902D01146FFF739BF90F8D5
+S31508003B709C12012906D0022904D0032909D011462E
+S31508003B80FFF72EBF00218160012200F10801FFF72F
+S31508003B903EBF0122011DFFF73ABF2DE9F84304464F
+S31508003BA00F4600200090002600257988080A062876
+S31508003BB074D006DC012833D0022839D0032804D172
+S31508003BC04CE007286BD00F281BD039462046FFF754
+S31508003BD007FF0125002D12D1BDF8000048B1FA886B
+S31508003BE03AB1824200D90246009231462046FFF792
+S31508003BF00EFFF888002802D12046FFF715FFBDE81A
+S31508003C00F883D4F8B002C26922B1207C694690478D
+S31508003C100646DFE739462046FFF7E2FE0125D9E7E3
+S31508003C20D4F8B012207C0A68694690470646D1E760
+S31508003C30207C4FF0020840B1D4F8B402C16A684645
+S31508003C408847064686F80180C4E7D4F8B402816A34
+S31508003C5068468847064686F80180BBE7C8B2062844
+S31508003C6060D2DFE800F0031223324150D4F8B002E4
+S31508003C70426822B1207C694690470646AAE739463B
+S31508003C802046FFF7ADFE0125A4E7D4F8B002826806
+S31508003C9032B1207C6946904706469BE748E056E0E5
+S31508003CA039462046FFF79CFE012593E7D4F8B00273
+S31508003CB0C26822B1207C6946904706468AE739469B
+S31508003CC02046FFF78DFE012584E7D4F8B002026985
+S31508003CD022B1207C6946904706467BE7394620464E
+S31508003CE0FFF77EFE012575E7D4F8B002426922B1D6
+S31508003CF0207C6946904706466CE739462046FFF71A
+S31508003D006FFE012566E7D4F8B002826922B1207CED
+S31508003D106946904706465DE739462046FFF760FE46
+S31508003D20012557E739462046FFF75AFE012551E790
+S31508003D30207C28B139462046FFF752FE012549E77F
+S31508003D40D4F8B402416B68468847064642E7207CA9
+S31508003D5028B139462046FFF743FE01253AE7D4F84D
+S31508003D60B402016B6846884706460721717031E739
+S31508003D70002102E0491CC9B2401C0278002AF9D188
+S31508003D80084670470A4690F89C12012906D002296F
+S31508003D9004D0032902D01146FFF722BED188022992
+S31508003DA002D01146FFF71CBE0121C160D0F8A4124B
+S31508003DB009B10321C160022200F10C01FFF727BEF9
+S31508003DC070B504460D461646002C17D02046FFF758
+S31508003DD0CFFF022101EB40003080307828700321A4
+S31508003DE002206970002306E0411C641C2A54C9B2EB
+S31508003DF0481CC0B26B542278002AF5D170BD014622
+S31508003E000020002906D0012905D0022905D003295A
+S31508003E1005D0022070470220704701207047022013
+S31508003E20704710B5002810D0D0F8B43213B100236B
+S31508003E30C0F8B43209B1C0F8B012012180F89C125A
+S31508003E40027000F0DFF8002010BD022010BD10B58A
+S31508003E50D0F8C002FDF7ACFFBDE81040FFF7CFBFB2
+S31508003E6010B5D0F8C002FDF77FFFBDE81040FFF798
+S31508003E70C6BF70B504461346002909D0D4F8B40263
+S31508003E8042691AB194F89C02032859D0022070BDE1
+S31508003E9004F11400D4F894120025022903D0042949
+S31508003EA040D0F1B342E0D0E903218A420DD9511A34
+S31508003EB0C1608AB219462046FFF78AFD00232046CC
+S31508003EC01A46194600F0FCF830E08068B0FBF1F2BB
+S31508003ED001FB12029AB9884211D3D4F89812884283
+S31508003EE00DD2002220461146FFF772FDC4F89852FB
+S31508003EF000231A461946204600F0E2F816E0D4F8E0
+S31508003F00B402C16829B194F89C02032801D120465D
+S31508003F1088478021204600F054F92046FFF76CFDBB
+S31508003F2004E0FFE78021204600F04BF994F8A00250
+S31508003F30012807D1204600F08DF984F8A05201E047
+S31508003F4020469047002070BD70B5044608461146C5
+S31508003F50002809D0D4F8B4128A691AB194F89C12C8
+S31508003F6003292FD0022070BD04F5AA70D4F8943224
+S31508003F70032B02D0052B1DD027E0D0E903539D4221
+S31508003F800AD9EB1AC3600069834200D30346204668
+S31508003F909AB2FFF715FD18E0D4F8B402016929B101
+S31508003FA094F89C02032801D1204688472046FFF74B
+S31508003FB03BFD0AE00020C4F894020021204600F0E8
+S31508003FC000F902E0014620469047002070BD10B572
+S31508003FD0D0F8C002FDF77AFEBDE81040FFF70FBF24
+S31508003FE00020704710B5012180F89C12D0F8B42241
+S31508003FF0017952689047002010BDD0F8C002FDF73D
+S3150800400003BF000010B5017800292BD11649C1F865
+S315080040100404C0F8C0121548086009204860022246
+S31508004020CA60002008618A610122CA610862486282
+S315080040308862C86208630846FEF7B2F920B10CA088
+S315080040404FF49371FCF727FA07488021FDF7FBFD2B
+S31508004050054840220021FDF7FAFD03488022012188
+S31508004060FDF7F5FD002010BD2002002400000840E1
+S315080040702E2E5C757362645F636F6E662E63000036
+S315080040800A06D0F8C00201F07F01C1EBC10100EBBE
+S31508004090810002D590F83E00704790F8FE017047FF
+S315080040A0002070470020704710B514461A46D0F80D
+S315080040B0C0022346FDF7B1FEBDE81040FFF79FBEDC
+S315080040C010B5D0F8C002FDF7D6FEBDE81040FFF7E0
+S315080040D096BE70B504460022204640231146FFF7D7
+S315080040E0E3FF0125C4F858514026C4F8646140230B
+S315080040F0204600228021FFF7D7FFA561666284F873
+S315080041009C520020C4F894026060C4F8A402D4F853
+S31508004110B80228B1D4F8B402002142682046904774
+S31508004120002070BD90F89C12042903D190F89D12C6
+S3150800413080F89C120020704710B590F89C1203294D
+S3150800414004D1D0F8B412C96901B18847002010BD5E
+S3150800415001740020704710B5D0F8C002FEF7CAF9FE
+S31508004160BDE81040FFF74BBE70B5044604F52A704B
+S31508004170054600F052F80120C4F89402B4F8AE02DD
+S31508004180C4F8980294F8A82212F01F000AD0012851
+S315080041900DD0022810D002F08001204600F011F858
+S315080041A0002070BD2946204600F001F9F8E72946A7
+S315080041B0204600F023FAF3E72946204600F02CF9BA
+S315080041C0EEE710B5D0F8C002FDF776FEBDE8104060
+S315080041D0FFF715BE10B5D0F8C002FEF7A6F9BDE880
+S315080041E01040FFF70CBE10B5D0F8C002FEF7BEF9B6
+S315080041F0BDE81040FFF703BE00F52770017841704F
+S31508004200042101700020704710B5D0F8C002FDF7F0
+S315080042108BFEBDE81040FFF7F2BD0A7802704A78B7
+S315080042204270CB788A7802EB032242804B790A796E
+S3150800423002EB032282808A79C97902EB0121C180C7
+S31508004240704702460020002902D0C2F8B41270470F
+S31508004250022070470020704770B5044688880028F9
+S3150800426021D1C888F8B9488880281CD200F07F0573
+S3150800427094F89C0203280DD084F89E5229462046BD
+S31508004280FFF769FF2046FFF7CFFB45B1022084F808
+S315080042909C0270BD2046BDE87040FFF7A1BB012017
+S315080042A084F89C0270BD2046BDE87040FFF798BBB5
+S315080042B010B50224D0F8B422002A03D01268904719
+S315080042C000B90024204610BD70B504460E46304D90
+S315080042D0B1782970012905D931462046BDE87040D4
+S315080042E0FFF77EBB94F89C0202280BD0032823D044
+S315080042F031462046FFF774FB29782046BDE8704012
+S31508004300FFF744BB99B16160032084F89C022046FC
+S31508004310FFF7CEFF022804D02046BDE87040FFF71D
+S3150800432083BB31462046BDE87040FFF759BB20469F
+S31508004330BDE87040FFF778BB91B16068884221D02C
+S31508004340C1B22046FFF722FB297861602046FFF7B5
+S31508004350AFFF022810D02046BDE87040FFF764BBC7
+S31508004360022084F89C0261602046FFF70FFB204676
+S31508004370BDE87040FFF758BB31462046BDE870409F
+S31508004380FFF72EBB2046BDE87040FFF74DBB000087
+S31508004390080000244988012903D1C0F8A412FFF7B0
+S315080043A043BB704710B5FFF715FF002010BD10B5C9
+S315080043B000240A7812F060020CD0202A05D0402A80
+S315080043C003D0FFF70DFB204610BDD0F8B422926843
+S315080043D09047F8E74A780A2A1BD2DFE802F0111755
+S315080043E01A141A08051A0E0BFFF7D7FBEBE7FFF7A7
+S315080043F033FFE8E7FFF768FFE5E7FFF7B1FBE2E71A
+S31508004400FFF7C0FCDFE7FFF7C5FFDCE7FFF7C5FAF4
+S31508004410D9E7FFF7E5FAD6E72DE9F04104460A465B
+S3150800442000261179137813F0600011D0202808D0DF
+S31508004430402806D011462046FFF7D2FA3046BDE896
+S31508004440F081D4F8B4021146836820469847F5E708
+S31508004450C3F3411001280BD05078002860D00128FA
+S3150800446037D003280CD011462046FFF7B9FAE5E7FE
+S31508004470D4F8B402114683682046BDE8F0411847CF
+S3150800448094F89C02022806D0032814D01146204628
+S31508004490FFF7A6FAD2E749B1802907D02046FFF7E9
+S315080044A090FE80212046FFF78CFEC7E7114620467E
+S315080044B0FFF796FAC2E7508838B931B1802904D097
+S315080044C0D08810B92046FFF77CFE2046FFF7ACFAE5
+S315080044D0B4E794F89C02022806D0032814D01146A3
+S315080044E02046FFF77DFAA9E749B1802907D020467B
+S315080044F0FFF767FE80212046FFF763FE9EE7114619
+S315080045002046FFF76DFA99E75088002896D14806A5
+S3150800451002D02046FFF79BFC2046FFF785FA8DE779
+S3150800452094F89C020027022806D0032824D01146B6
+S315080045302046FFF755FA81E731B1802904D01146A4
+S315080045402046FFF74DFA79E7080607D501F07F0000
+S3150800455000EB800004EB8001143107E001F07F00D6
+S3150800456000EB800004EB800101F5AA710F600222BE
+S315080045702046FFF74CFA61E708060CD501F00F0054
+S3150800458000EB800004EB8000806968B9114620467C
+S31508004590FFF726FA52E701F00F0000EB800004EB64
+S315080045A08000D0F8580148B108060CD501F07F0004
+S315080045B000EB800004EB800514350CE0114620461C
+S315080045C0FFF70EFA3AE701F07F0000EB800004EBF4
+S315080045D0800505F5AA7541B1802906D02046FFF762
+S315080045E04FFD20B10120286002E02F6000E02F6017
+S315080045F0022229462046FFF70AFA1FE770B5054644
+S315080046000C46207810F0600209D0202A07D0402AEC
+S3150800461005D021462846FFF7E3F9002070BD95F836
+S315080046209C22012A08D0022A06D0032A04D0214651
+S315080046302846FFF7D5F9F0E7207901280ED8D5F8EE
+S31508004640B4022146826828469047E1880029E4D1C9
+S315080046500028E2D12846FFF7E7F9DEE72146284693
+S31508004660FFF7BEF9D9E7000070B50A7801234E783E
+S3150800467002F00F041C4DA340012E19D0D0F81C4897
+S3150800468044EA0343C0F81C3800EB4210D0F8002B6C
+S3150800469012040BD4D0F8002B0B89C978C3F30A038C
+S315080046A01A4345EA81410A43C0F8002B002070BD31
+S315080046B0D0F81C489BB21C43C0F81C4800EB4210BB
+S315080046C0D0F800391B04F1D4D0F800390C89C97820
+S315080046D0C4F30A048904234341EA82510B432B435A
+S315080046E0C0F80039E2E7000000800010D0F8001991
+S315080046F06FF30A01C0F80019D0F8041841F4807164
+S31508004700C0F80418002070470FB410B5044608987E
+S3150800471001281AD0E06840F04000E060204600F02A
+S3150800472033F80C9941B3A16B21F48031A163069942
+S31508004730012907D1A16841F00601A160A16841F0ED
+S315080047402001A16010BC5DF814FBA06B20F480303A
+S31508004750A063E0680B490840E060E06820F4401078
+S31508004760E0600F98012803D1E06840F48010E0600B
+S31508004770204600F009F8DAE7A16B41F48031A1631D
+S31508004780D5E70000BFFFBDFF00210C4A491C914236
+S3150800479001D9032070470369002BF7DA0021036962
+S315080047A043F001030361491C914201D90320704774
+S315080047B00369DB07F7D1002070470000400D0300AE
+S315080047C070B50B7801244E7803F00F0504FA05F24C
+S315080047D0012E19D0D0F83C5825EA0242C0F83C28E8
+S315080047E0D0F81C28097801F00F018C4022EA044110
+S315080047F0C0F81C1800EB4310D0F8001B0F4A1140F4
+S31508004800C0F8001B002070BDD0F83C5892B2954302
+S31508004810C0F83C58D0F81C28097801F00F018C40E4
+S31508004820A1B28A43C0F81C2800EB4310D0F800193F
+S31508004830034A1140C0F80019E4E700000078F3EFD6
+S31508004840007833EC10B5D0F8041821F00201C0F84E
+S3150800485004180320FCF7A0FC002010BD10B5D0F802
+S31508004860041841F00201C0F804180320FCF794FC70
+S31508004870002010BD0FB4F0B5044600260020002520
+S3150800488004EB8001C1F80451401C0F28F8D3109896
+S3150800489048B3A06B40F40011A163C4F8005ED4F8D5
+S315080048A00018C4F800180B9801282FD003212046B9
+S315080048B000F03EFB1021204600F0B2FA00B10126B6
+S315080048C0204600F09DFA00B10126C4F81058C4F835
+S315080048D01458C4F81C5800204FF000624FF67F3772
+S315080048E04FF0904333E0D4F8040840F00201C4F8CE
+S315080048F00418A06B20F40011A163206840F0400161
+S315080049002160206840F080012160C6E7089820B140
+S315080049100121204600F00CFBCCE70021204600F0E0
+S3150800492007FBC7E704EB4011D1F800C9BCF1000F3B
+S3150800493006DA10B1C1F8003904E0C4F8002901E02C
+S31508004940C1F80059C1F81059C1F80879401C0699F0
+S315080049508142E7D8002014E004EB4011D1F800CBDF
+S31508004960BCF1000F06DA10B1C1F8003B04E0C4F848
+S31508004970002B01E0C1F8005BC1F8105BC1F8087BA9
+S31508004980401C06998142E7D8D4F8100820F48071B3
+S31508004990C4F81018A5616FF080406061099818B9CD
+S315080049A0A06940F01000A061A0690A490843A06107
+S315080049B00C9818B1A06940F00800A0611098012869
+S315080049C003D1A06904490843A0613046F0BC5DF8EC
+S315080049D014FB000000383C8004000040816821F088
+S315080049E0010181600020704770B50C780B784E780D
+S315080049F0414D012E00EB43131FD0D3F8100B6FF374
+S31508004A001200C3F8100BD3F8100B2840C3F8100B8C
+S31508004A10486908B188684861D3F8100B40F400204B
+S31508004A20C3F8100BD3F8100B8C68C4F31204204398
+S31508004A30C3F8100B012A53D056E04E6996B3D3F843
+S31508004A4010696FF31206C3F81069D3F810692E407F
+S31508004A50C3F810694E698D68AE4200D94D6103F5F9
+S31508004A6011631D6845F400251D601D684E69C6F36F
+S31508004A70120635431D60012A23D000EB4412D2F8F2
+S31508004A80003943F00443C2F800394A693AB3D0F80A
+S31508004A903428097801F00F03012199400A43C0F828
+S31508004AA0342827E0FFE703F511631E682E401E60D1
+S31508004AB01D6845F400251D601D686FF312051D600D
+S31508004AC0D9E7096919B100EB4412C2F8141900EBC9
+S31508004AD04410D0F8001941F00441C0F8001909E063
+S31508004AE0C86808B1C3F8140BD3F8000B40F00440AB
+S31508004AF0C3F8000B002070BDFFFF07E010B5036C7C
+S31508004B00124CA34205D9D0F8003B002B01DA00204D
+S31508004B1010BD00F5316000230360036843F40023E9
+S31508004B200360036843F018030360036843F0C04357
+S31508004B300360A0F53160012906D100F530604261B5
+S31508004B40016841F080210160002010BD0A30544FF1
+S31508004B500B784A78012A00EB43100BD0D0F8002BCB
+S31508004B6022F40012C0F8002BC978032914D00229B0
+S31508004B7012D017E0D0F8002922F40012C0F8002954
+S31508004B80C978032901D002290CD1D0F8001941F0BF
+S31508004B908051C0F8001905E0D0F8001B41F080519B
+S31508004BA0C0F8001B002070470A784B780978012B5B
+S31508004BB000EB411012D0D0F8001B002906DB2AB101
+S31508004BC0D0F8001B21F08041C0F8001BD0F8001B6C
+S31508004BD041F40011C0F8001B00207047D0F80019F6
+S31508004BE0002906DB2AB1D0F8001921F08041C0F867
+S31508004BF00019D0F8001941F40011C0F80019EBE7C4
+S31508004C00F8B50C786FF060460B784F78784D012F21
+S31508004C1000EB431326D0D3F8104B6FF31204C3F8F6
+S31508004C20104BD3F8104B2C40C3F8104B4C69002C92
+S31508004C307ED08D682C44641EB4FBF5F4A4B2D3F878
+S31508004C40105B06EAC4463543C3F8105BD3F8105B1D
+S31508004C508E686643C6F312042543C3F8105B012A1F
+S31508004C6067D0A9E04F69FFB103F511631F686FF3B9
+S31508004C7012071F601F682F401F604F698D682F44F9
+S31508004C807F1EB7FBF5F506EAC5451E6835431D6068
+S31508004C901D684E69C6F3120635431D60A3F51163F8
+S31508004CA0CD78012D0ED017E003F511631E682E404E
+S31508004CB01E601D6845F400251D601D686FF312050A
+S31508004CC01D6009E003F511631D6825F0C0451D60E8
+S31508004CD01D6845F000551D60012A17D000EB4413E6
+S31508004CE0D3F8004944F00444C3F80049CC78012CB1
+S31508004CF036D04A699AB3D0F83428097801F00F03F8
+S31508004D00012199400A43C0F834286FE00A691AB1AC
+S31508004D1000EB4413C3F81429C978012917D1D0F830
+S31508004D200818C9050BD400EB4411D1F8002901E095
+S31508004D302FE03DE042F00052C1F8002907E000EB01
+S31508004D404411D1F8002942F08052C1F8002900EB3D
+S31508004D504410D0F8001941F00441C0F8001945E0A4
+S31508004D60D0F80848E40506D4D3F8004944F00054BE
+S31508004D70C3F8004905E0D3F8004944F08054C3F865
+S31508004D80004900928A8A93B20A78C96800F073F9D2
+S31508004D902CE0D3F8104B8D68C5F312052C43C3F8E5
+S31508004DA0104BD3F8104B44F40024C3F8104B56E7C5
+S31508004DB0CA680AB1C3F8142BC978012910D1D0F8EA
+S31508004DC00808C00506D4D3F8000B40F00050C3F815
+S31508004DD0000B05E0D3F8000B40F08050C3F8000B39
+S31508004DE0D3F8000B40F00440C3F8000B0020F8BDD0
+S31508004DF0FFFF07E0816841F00101816000207047EC
+S31508004E00002110220261054A491C914201D903205A
+S31508004E1070470369DB06F7D400207047400D03008E
+S31508004E200022202343EA811101610549521C8A4266
+S31508004E3001D90320704703699B06F7D40020704701
+S31508004E40400D0300D0F8080800F00600002805D039
+S31508004E50022805D0062803D00F2070470020704787
+S31508004E6002207047406900F001007047D0F8181812
+S31508004E70D0F81C08084080B27047D0F81818D0F847
+S31508004E801C080840000C704710B5D0F81038D0F848
+S31508004E90342801F00F04E24002F0010243EAC2128C
+S31508004EA000EB4110D0F80809104010BD00EB411185
+S31508004EB0D1F8081BD0F81408084070474169806982
+S31508004EC0084070470346084610B5D21C92080021D0
+S31508004ED003F5805302E01C6810C0491C9142FAD3BE
+S31508004EE010BD10B5C26822F0C042C260012902D0C6
+S31508004EF031B1012010BDC16841F00051C16003E025
+S31508004F00C16841F08041C1603220FCF745F90020B4
+S31508004F1010BD00F50060026822F4FE6202600268B5
+S31508004F204FF4FE6303EA01110A430260002070474A
+S31508004F30D0F800280A43C0F800280020704700006F
+S31508004F40022A0ED082B30921C26822F47052C260C6
+S31508004F50C2684FF4705303EA81210A43C2600020F5
+S31508004F607047224A224B0A449A4201D20F21EBE7A4
+S31508004F70204A214B0A449A4201D20E21E4E71F4AED
+S31508004F801F4B0A449A4201D20D21DDE71D4A1E4BEA
+S31508004F900A449A4201D20C21D6E71C4A1C4B0A4401
+S31508004FA09A4202D20B21CFE71DE01A4A1A4B0A444D
+S31508004FB09A4201D20A21C7E7184A194B0A449A426B
+S31508004FC001D20921C0E7174A174B0A449A4201D26F
+S31508004FD00821B9E7154A1144154A914201D2072119
+S31508004FE0B2E70621B0E70921AEE70000405327FFE4
+S31508004FF000350C00401E1BFF40420F0000DC0BFF73
+S31508005000804F1200808CF9FE20D6130060B6E5FEAC
+S3150800501060E3160000D3CEFE40771B00C05BB3FEEC
+S31508005020C091210000CA91FE20753800E05459FE4F
+S31508005030E09C410010B5044600214FF67F3304EB8F
+S315080050404112C2F80839C2F8083B491C0F29F6D3A1
+S315080050500020C4F81008C4F81408C4F81C08204630
+S31508005060FFF7CEFE002805D12046BDE810401021E6
+S31508005070FFF7D6BE10BD10B5029C002C0CD1DB1C68
+S315080050809C08002300EB023000F5805002E004C9BA
+S3150800509002605B1CA342FAD3002010BD704770471C
+S315080050A010B5094B5A68002A0CD054695C60117413
+S315080050B09060D0600023537410600844401E50600E
+S315080050C0907C10BDFF2010BDBC010024094800F1EA
+S315080050D0180200218174426118301832491CC9B27D
+S315080050E00029F7D0817400214161034901484860CD
+S315080050F070470000E4120024BC01002470B5044681
+S315080051000D46022C04D34FF4F2710EA0FBF7C3F937
+S31508005110164B04EB440203EBC200417C81B1816863
+S3150800512009782970417C491E41748168491C81604F
+S315080051304468A14202D953F832108160012070BD3B
+S31508005140002070BD2E2E5C2E2E5C2E2E5C2E2E5C24
+S31508005150536F757263655C41524D434D375F5354C7
+S315080051604D333248375C7573622E6300E4120024AF
+S3150800517010B50446022C04D34FF4017104A0FBF7C2
+S315080051808AF90D4904EB440001EBC000407C10BDD0
+S315080051902E2E5C2E2E5C2E2E5C2E2E5C536F757278
+S315080051A063655C41524D434D375F53544D33324826
+S315080051B0375C7573622E6300E412002470B50446EA
+S315080051C00D46022C04D310A04FF4E171FBF763F9E6
+S315080051D0174B04EB440203EBC200417C047CA1425A
+S315080051E001D1002070BDC1680D70417C491C417415
+S315080051F0C168491CC1604468A14202D953F83210FB
+S31508005200C160012070BD00002E2E5C2E2E5C2E2E55
+S315080052105C2E2E5C536F757263655C41524D434D2F
+S31508005220375F53544D333248375C7573622E6300CB
+S31508005230E412002410B50648D0F8C002FCF777FD42
+S315080052400348FEF7FCFBBDE810400020FFF726BF29
+S315080052509813002470B5FFF739FF1E4C4021601CD7
+S31508005260FFF71EFF207004F141054021681CFFF777
+S3150800527017FF28702178FF2901D0FF2803D1842140
+S3150800528015A0FBF708F9134800221D498430FEF7DC
+S31508005290C8FD10481B498430FEF7D3FF0120FFF7ED
+S315080052A0FDFE0C488430FFF77DF8FDF797F90948AD
+S315080052B08430D0F8C002FCF71CFDFBF70BF94FF45D
+S315080052C0FA61884204D2BDE870400846FBF720B967
+S315080052D070BD0000141300242E2E5C2E2E5C2E2E7C
+S315080052E05C2E2E5C536F757263655C41524D434D5F
+S315080052F0375F53544D333248375C7573622E6300FB
+S3150800530028010024F00000247047000001460248E6
+S315080053100078FFF7F3BE0000551300242DE9F0418D
+S3150800532080460F461948D0F8C002FCF71EFE184CF6
+S315080053300026184D607838B120782844401CFFF7BD
+S31508005340E5FF01280DD01EE01248FFF7DFFF012810
+S3150800535019D12878401E3E2815D80120607026707D
+S3150800536011E02078401CC2B2227028782946904263
+S3150800537009D1491C4046FBF790FA667020783870C8
+S315080053800120BDE8F0810020FBE700009813002407
+S31508005390BC010024641200242DE9F0410446FEF7FE
+S315080053A08BFA064611482146FEF727FE85B20024E9
+S315080053B00E4F4FF4B578433F0BE0315D3878FFF771
+S315080053C0FDFE012803D00AA04146FBF764F8641CD9
+S315080053D0A4B2AC42F1D3FEF76FFABDE8F041402320
+S315080053E0024602480121FEF76BBE0000981300240E
+S315080053F02E2E5C2E2E5C2E2E5C2E2E5C536F757216
+S3150800540063655C41524D434D375F53544D333248C3
+S31508005410375C7573622E6300014602480078FFF711
+S31508005420CDBE00001413002470B505460E463F2E67
+S3150800543003D9BB210EA0FBF72EF83046FFF7ECFF89
+S31508005440012803D0BF210AA0FBF725F800240CE0A9
+S31508005450FBF719FA285DFFF7DFFF012803D0C821FB
+S3150800546003A0FBF718F8641CA4B2B442F0D370BDCD
+S315080054702E2E5C2E2E5C2E2E5C2E2E5C536F757295
+S3150800548063655C41524D434D375F53544D33324843
+S31508005490375C7573622E63002DE9F843154E307834
+S315080054A0FFF766FE0546280021D0402D00D9402585
+S315080054B00024104F4FF4A478703F0EE03078694608
+S315080054C0FFF71CFE012803D00BA04146FAF7E3FFBD
+S315080054D09DF800003855641CE4B2AC42EED3054A88
+S315080054E081212B46703A02F1F400FEF78DFEBDE8E5
+S315080054F0F8830000141300242E2E5C2E2E5C2E2E0C
+S315080055005C2E2E5C536F757263655C41524D434D3C
+S31508005510375F53544D333248375C7573622E6300D8
+S3150800552038B500250095FF210A4C2170001D00F0B2
+S315080055306FF90146D4F888006A4600F055F960709C
+S31508005540211D009800F012FAA570E5700820A4F84D
+S31508005550860038BDAC08002470B500F0F5F90E4C8D
+S31508005560012584F88150FF202070002010216170E9
+S31508005570A070FBF7EFF8E070FBF702F92071FBF774
+S31508005580FFF8000A6071A571E5710820A4F8860085
+S31508005590BDE87040FDF73CBEAC08002410B5064CCB
+S315080055A0002084F8810000F0CFF9FF202070012048
+S315080055B0A4F8860010BD0000AC08002410B5094CFC
+S315080055C0FF2020700848C4F8880000206070A0708A
+S315080055D0E0700720211D00F0C9F90820A4F886000C
+S315080055E010BD0000AC080024685A00080748FF21CF
+S315080055F001700021417090F882208270C17001719B
+S3150800560041710621A0F8861070470000AC080024F6
+S3150800561070B50446FBF79EF86178801E884204DA66
+S31508005620BDE87040222000F097B9114DFF20287080
+S315080056300120A5F88600617859B1D5F88800A21C22
+S31508005640FDF7EAFD70B155F8880F617808442860BF
+S3150800565070BDFDF7CFFD0028FAD1BDE870403120B6
+S3150800566000F07AB9BDE87040312000F075B9000045
+S31508005670AC08002470B50B4DD5F88840001D00F025
+S31508005680C7F801462046FDF7BFFD28B1FF20287060
+S315080056900120A5F8860070BDBDE87040312000F0F5
+S315080056A05BB90000AC08002470B50546FBF752F854
+S315080056B00C4C411E6A1CD4F88800FDF7ADFD60B19C
+S315080056C04834FF2004F8480CFBF744F8216C401EC8
+S315080056D0084420640120E08770BDBDE87040312091
+S315080056E000F03AB9AC080024312000F035B90000C2
+S315080056F010B5FBF7E1F80348FF2101700121A0F876
+S31508005700861010BDAC08002470B5084CFF20207028
+S3150800571000256570A570FBF71DF8E07025716571A9
+S31508005720A5710720A4F8860070BD0000AC08002407
+S3150800573010B5064CFF212170001D00F069F8C4F869
+S3150800574088000120A4F8860010BD0000AC080024DB
+S3150800575070B50446FAF7FEFF6178401E884204DAFF
+S31508005760BDE87040222000F0F7B8201D00F050F880
+S315080057700A4DC5F8880062786B1C01461846FBF787
+S315080057808CF8FF20483505F8480C6178286C0844E1
+S3150800579028646078401CE88770BD0000AC080024C7
+S315080057A0002000F0D9B8000070B50546FAF7D2FF18
+S315080057B06A78401E904204DABDE87040222000F064
+S315080057C0CBB8084C601C4834216CFBF766F8FF2000
+S315080057D004F8480C6978206C084420646878401CF2
+S315080057E0E08770BDAC0800242DE9F04104460E465A
+S315080057F01746002505E014F8010B2844C5B2FBF747
+S3150800580042F8761E701CF6D13D600120BDE8F08195
+S315080058100178427841EA0221827841EA0241C07859
+S3150800582041EA006070470000054800210170C0F891
+S315080058300710C170A0F8051081704170704700000C
+S315080058402D090024044890F88100002801D0012081
+S315080058507047002070470000AC08002410B5017896
+S31508005860344CFF2910D094F88120012A60D1F429FC
+S3150800587021D013DCD02936D009DCC92930D0CC296F
+S315080058803DD0CF293ED137E0FFF766FE3DE0D1296E
+S315080058902FD0D2292AD0F32934D112E0F5390A2992
+S315080058A030D2DFE801F0050B2F2F2F112F14171A0E
+S315080058B0FFF77AFF29E0FFF74BFF26E0FFF738FFEF
+S315080058C023E0FFF72DFE20E0FFF778FE1DE0FFF747
+S315080058D067FF1AE0FFF78AFE17E0FFF75FFE14E09E
+S315080058E0FFF7E2FE11E0FFF793FE0EE0FFF70CFF6D
+S315080058F00BE0FFF7BFFE08E0FFF7FAFE05E0FFF74B
+S31508005900F3FE02E0202000F027F894F8840001282E
+S3150800591002D1102000F020F8B4F98610002907DD1E
+S31508005920012084F88400BDE81040024800F026B83B
+S3150800593010BD0000AC0800240249002081F884004C
+S3150800594070470000AC0800240249002081F8820054
+S3150800595070470000AC0800240349FE220A7048700C
+S315080059600220A1F886007047AC0800240870020AD5
+S315080059704A70020C8A70000EC870704789B2FAF72E
+S315080059805FBF0907090E002804DB00F1E02080F854
+S315080059900014704700F00F0000F1E02080F8141D95
+S315080059A07047FCF733FFFAF7B9FDFAF7C6FDFCE7CF
+S315080059B04FF04070E1EE100A704700000000010247
+S315080059C00304010203040607080900000001020394
+S315080059D004050607080C10141820304000000000C3
+S315080059E000000000000000000000000000000000A9
+S315080059F0010000000200000003000000040000008F
+S31508005A000000000005000000000000000000000083
+S31508005A100000000006000000000000000000000072
+S31508005A200000000007000000000000000102030457
+S31508005A30010203040607080901000000020000002D
+S31508005A400400000006000000080000000A0000002C
+S31508005A500C000000100000002000000040000000BC
+S31508005A6080000000000100004F70656E424C540033
+S31508005A7005020602060307030803090309040A04C4
+S31508005A800B040C040C050D050E050F050F06100674
+S31508005A9010071008000002080000020001010000BB
+S31508005AA000000408000002000201000000000608C9
+S31508005AB000000200030100000000080800000200C0
+S31508005AC00401000000000A080000020005010000A9
+S31508005AD000000C08000002000601000000000E0885
+S31508005AE00000020007010000000010080000020084
+S31508005AF00002000000001208000002000102000077
+S31508005B000000140800000200020200000000160847
+S31508005B10000002000302000000001808000002004E
+S31508005B200402000000001A08000002000502000036
+S31508005B3000001C08000002000602000000001E0803
+S31508005B400000020007020000685B0008000000244D
+S31508005B50C4010000D4020008845C0008C4010024C3
+S31508005B60FC1A000030030008113C90D003043132BF
+S31508005B70010213102C0A06101B2A400514090220DC
+S31508005B8013010125C03209043302FF1607058102F5
+S31508005B90402DFF07050107520A1403069E12141228
+S31508005BA003A757494E55534212801A046612281203
+S31508005BB0441265127612691A63081249126E1A742B
+S31508005BC008127212663A611212471A5516324412B0
+S31508005BD04E127B1238123012373A390212431233F8
+S31508005BE0122D12451A34041A300A1A340612451AA6
+S31508005BF0410A12381A31043A38141A38141238126B
+S31508005C003512321A420612343A460A527D13C13800
+S31508005C101B08870413093982081A71101A7B041A9B
+S31508005C20F504C15AAD101AA10813913A1B08D904F4
+S31508005C301AE50413093B1B0841041A650C1A9D044E
+S31508005C401A550C30090403090412010102164050C2
+S31508005C501DAC60190C23030114050F2115011C1036
+S31508005C60052011DF60DDD88945C74C9CD2659D9E0D
+S31508005C70648A9F1403069E19222103261A03021713
+S30908005C80040000000E
S7050800029957
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.c
index 0a6a001c5..133560f92 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.c
@@ -101,8 +101,8 @@ __ALIGN_BEGIN static uint8_t USBD_Bulk_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER
{
USB_LEN_DEV_QUALIFIER_DESC,
USB_DESC_TYPE_DEVICE_QUALIFIER,
- 0x00,
- 0x02,
+ 0x10,
+ 0x01,
0x00,
0x00,
0x00,
@@ -192,6 +192,62 @@ __ALIGN_BEGIN uint8_t USBD_Bulk_CfgFSDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END
} ;
+#if (USBD_WINUSB_ENABLED == 1)
+/* USB Bulk device Microsoft OS 2.0 Descriptor Set. */
+#define USB_LEN_MSOS20_DESC (0x9E)
+
+__ALIGN_BEGIN uint8_t USBD_Bulk_MSOS20Desc[USB_LEN_MSOS20_DESC] __ALIGN_END =
+{
+ 0x0A, 0x00, /* Descriptor size (10 bytes) */
+ 0x00, 0x00, /* MS OS 2.0 descriptor set header */
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+
+ /* Microsoft OS 2.0 compatible ID descriptor */
+ 0x14, 0x00, /* Descriptor size (20 bytes) */
+ 0x03, 0x00, /* MS OS 2.0 compatible ID descriptor */
+ 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, /* WINUSB string */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Sub-compatible ID */
+
+ /* Registry property descriptor */
+ 0x80, 0x00, /* Descriptor size (130 bytes) */
+ 0x04, 0x00, /* Registry Property descriptor */
+ 0x01, 0x00, /* Strings are null-terminated Unicode */
+ 0x28, 0x00, /* Size of Property Name (40 bytes) */
+
+ /* Property Name ("DeviceInterfaceGUID") */
+ 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, 0x00,
+ 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00, 0x49, 0x00,
+ 0x44, 0x00, 0x00, 0x00,
+
+ 0x4E, 0x00, /* Size of Property Data (78 bytes) */
+
+ /* Vendor-defined Property Data: "{807999C3-E4E0-40EA-8188-48E852B54F2B}\0" */
+ 0x7B, 0x00, 0x38, 0x00, /* {8 */
+ 0x30, 0x00, 0x37, 0x00, /* 07 */
+ 0x39, 0x00, 0x39, 0x00, /* 99 */
+ 0x39, 0x00, 0x43, 0x00, /* 9C */
+ 0x33, 0x00, 0x2D, 0x00, /* 3- */
+ 0x45, 0x00, 0x34, 0x00, /* E4 */
+ 0x45, 0x00, 0x30, 0x00, /* E0 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x30, 0x00, 0x45, 0x00, /* 0E */
+ 0x41, 0x00, 0x2D, 0x00, /* A- */
+ 0x38, 0x00, 0x31, 0x00, /* 81 */
+ 0x38, 0x00, 0x38, 0x00, /* 88 */
+ 0x2D, 0x00, 0x34, 0x00, /* -4 */
+ 0x38, 0x00, 0x45, 0x00, /* 8E */
+ 0x38, 0x00, 0x35, 0x00, /* 85 */
+ 0x32, 0x00, 0x42, 0x00, /* 2B */
+ 0x35, 0x00, 0x34, 0x00, /* 54 */
+ 0x46, 0x00, 0x32, 0x00, /* F2 */
+ 0x42, 0x00, 0x7D, 0x00, /* B} */
+ 0x00, 0x00 /* \0 */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
+
/**
* @}
*/
@@ -269,6 +325,25 @@ static uint8_t USBD_Bulk_Setup (USBD_HandleTypeDef *pdev,
switch (req->bmRequest & USB_REQ_TYPE_MASK)
{
+#if (USBD_WINUSB_ENABLED == 1)
+ case USB_REQ_TYPE_VENDOR:
+ switch (req->bRequest)
+ {
+ case USB_BULK_MS_VENDORCODE: /* bMS_VendorCode */
+ if (req->wIndex == 7) /*This is defined by the MS spec (Table 6)*/
+ {
+ pbuf = USBD_Bulk_MSOS20Desc;
+ len = USB_LEN_MSOS20_DESC;
+ USBD_CtlSendData(pdev, pbuf, len);
+ break;
+ }
+
+ default:
+ break;
+ }
+ break;
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
case USB_REQ_TYPE_STANDARD:
switch (req->bRequest)
{
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.h
index ee1d83dee..7bf798c15 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_bulk.h
@@ -51,6 +51,8 @@
#define USB_BULK_CONFIG_DESC_SIZ 32
#define USB_BULK_DESC_SIZ (32-9)
+#define USB_BULK_MS_VENDORCODE 0x01 /* bMS_VendorCode */
+
#define BULK_DESCRIPTOR_TYPE 0x21
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_conf.h
index cee15fdcd..7a48424b8 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_conf.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_conf.h
@@ -70,9 +70,13 @@
/*---------- -----------*/
#define USBD_DEBUG_LEVEL 0U
/*---------- -----------*/
-#define USBD_LPM_ENABLED 0U
-/*---------- -----------*/
#define USBD_SELF_POWERED 1U
+/*---------- -----------*/
+/* Enable/disable the loading of the WinUSB GUID through MS OS 2.0 descriptors. This
+ * makes it possible to automatically install WinUSB devices without having to provide
+ * a device specific INF file.
+ */
+#define USBD_WINUSB_ENABLED 1U
/****************************************/
/* #define for FS and HS identification */
@@ -91,19 +95,26 @@
* @{
*/
+#if (USBD_WINUSB_ENABLED == 1)
+/* Reading out the MS OS 2.0 descriptors, requires support for BOS descriptors. This
+ * is currently enabled in the ST USB stack by enabled the USBD_LPM_ENABLED feature.
+ */
+#define USBD_LPM_ENABLED 1U
+#endif
+
/* Memory management macros */
/** Alias for memory allocation. */
-#define USBD_malloc malloc
+#define USBD_malloc /* Not used */
/** Alias for memory release. */
-#define USBD_free free
+#define USBD_free /* Not used */
/** Alias for memory set. */
-#define USBD_memset memset
+#define USBD_memset /* Not used */
/** Alias for memory copy. */
-#define USBD_memcpy memcpy
+#define USBD_memcpy /* Not used */
/** Alias for delay. */
#define USBD_Delay HAL_Delay
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.c
index 464ac5cc0..8f3d3b391 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.c
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.c
@@ -23,6 +23,7 @@
#include "usbd_core.h"
#include "usbd_desc.h"
#include "usbd_conf.h"
+#include "usbd_bulk.h"
/* USER CODE BEGIN INCLUDE */
@@ -68,9 +69,12 @@
#define USBD_MANUFACTURER_STRING "OpenBLT User"
#define USBD_PID_FS 0x60ac
#define USBD_PRODUCT_STRING_FS "WinUSB Bulk Device"
+#define USBD_SERIALNUMBER_STRING_FS "00000000050C"
#define USBD_CONFIGURATION_STRING_FS "Default"
#define USBD_INTERFACE_STRING_FS "WinUSB Bulk Interface"
+#define USB_SIZ_BOS_DESC 0x21
+
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
@@ -121,6 +125,9 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length
uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#if (USBD_WINUSB_ENABLED == 1)
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
+#endif
/**
* @}
@@ -140,6 +147,9 @@ USBD_DescriptorsTypeDef FS_Desc =
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
+#if (USBD_WINUSB_ENABLED == 1)
+, USBD_FS_USR_BOSDescriptor
+#endif /* (USBD_LPM_ENABLED == 1) */
};
#if defined ( __ICCARM__ ) /* IAR Compiler */
@@ -150,7 +160,12 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
+#if (USBD_WINUSB_ENABLED == 1)
+ 0x01, /*bcdUSB changed to USB version 2.01 to enable BOS */
+ /*descriptor for reading the MS OS 2.0 descriptors. */
+#else
0x00, /*bcdUSB */
+#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
@@ -160,8 +175,8 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idProduct*/
HIBYTE(USBD_PID_FS), /*idProduct*/
- 0x00, /*bcdDevice rel. 2.00*/
- 0x02,
+ 0x00, /*bcdDevice rel. 1.00*/
+ 0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
@@ -169,6 +184,37 @@ __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
};
/* USB_DeviceDescriptor */
+/** BOS descriptor. */
+#if (USBD_WINUSB_ENABLED == 1)
+#if defined ( __ICCARM__ ) /* IAR Compiler */
+ #pragma data_alignment=4
+#endif /* defined ( __ICCARM__ ) */
+__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
+{
+ 0x05, /* Descriptor size (5 bytes) */
+ USB_DESC_TYPE_BOS, /* Descriptor type (BOS) */
+ 0x21, 0x00, /* Length of this + subordinate descriptors (33 bytes) */
+ 0x01, /* Number of subordinate descriptors */
+
+ /* Microsoft OS 2.0 Platform Capability Descriptor */
+ 0x1C, /* Descriptor size (28 bytes) */
+ USB_DEVICE_CAPABITY_TYPE, /* Descriptor type (Device Capability) */
+ 0x05, /* Capability type (Platform) */
+ 0x00, /* Reserved */
+
+ /* MS OS 2.0 Platform Capability ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F) */
+ 0xDF, 0x60, 0xDD, 0xD8,
+ 0x89, 0x45,
+ 0xC7, 0x4C,
+ 0x9C, 0xD2,
+ 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
+
+ 0x00, 0x00, 0x03, 0x06, /* Windows version (8.1) (0x06030000) */
+ 0x9E, 0x00, /* Size, MS OS 2.0 descriptor set (158 bytes) */
+ USB_BULK_MS_VENDORCODE, /* Vendor-assigned bMS_VendorCode */
+ 0x00 /* Doesn’t support alternate enumeration */
+};
+#endif /* (USBD_WINUSB_ENABLED == 1) */
/**
* @}
@@ -331,6 +377,21 @@ uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *leng
return USBD_StrDesc;
}
+#if (USBD_WINUSB_ENABLED == 1)
+/**
+ * @brief Return the BOS descriptor
+ * @param speed : Current device speed
+ * @param length : Pointer to data length variable
+ * @retval Pointer to descriptor buffer
+ */
+uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
+{
+ UNUSED(speed);
+ *length = sizeof(USBD_FS_BOSDesc);
+ return (uint8_t*)USBD_FS_BOSDesc;
+}
+#endif /* (USBD_WINUSB_ENABLED == 1) */
+
/**
* @brief Create the serial number string descriptor
* @param None
diff --git a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.h b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.h
index 0c6619fd1..1e24daf17 100644
--- a/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.h
+++ b/Target/Demo/ARMCM7_STM32H7_Nucleo_H743ZI_Keil/Boot/usbd_desc.h
@@ -19,8 +19,8 @@
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_DESC__C__
-#define __USBD_DESC__C__
+#ifndef __USBD_DESC__H__
+#define __USBD_DESC__H__
#ifdef __cplusplus
extern "C" {
@@ -140,6 +140,6 @@ extern USBD_DescriptorsTypeDef FS_Desc;
}
#endif
-#endif /* __USBD_DESC__C__ */
+#endif /* __USBD_DESC__H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Target/Source/ARMCM4_TM4C/usb.c b/Target/Source/ARMCM4_TM4C/usb.c
index 894116913..cf44bee97 100644
--- a/Target/Source/ARMCM4_TM4C/usb.c
+++ b/Target/Source/ARMCM4_TM4C/usb.c
@@ -29,15 +29,10 @@
/****************************************************************************************
* Include files
****************************************************************************************/
-#include "boot.h" /* bootloader generic header */
+#include "boot.h" /* bootloader generic header */
#if (BOOT_COM_USB_ENABLE > 0)
-#include
-#include
-#include "usb.h"
-#include "usblib.h"
-#include "usbdevice.h"
-#include "usbdbulk.h"
-#include "usb_bulk_structs.h"
+#include "usb.h" /* USB bootloader driver */
+#include "tusb.h" /* TinyUSB stack */
/****************************************************************************************
@@ -58,67 +53,20 @@
/****************************************************************************************
-* Macro definitions
+* Configuration check
****************************************************************************************/
-/** \brief Total number of fifo buffers. */
-#define FIFO_MAX_BUFFERS (2)
-/** \brief Invalid value for a fifo buffer handle. */
-#define FIFO_ERR_INVALID_HANDLE (255)
-/** \brief Number of bytes that fit in the fifo pipe. */
-#define FIFO_PIPE_SIZE (64)
-
-
-/****************************************************************************************
-* Type definitions
-****************************************************************************************/
-/** \brief Structure type for fifo control. */
-typedef struct t_fifo_ctrl
-{
- blt_int8u *startptr; /**< pointer to start of buffer */
- blt_int8u *endptr; /**< pointer to end of buffer */
- blt_int8u *readptr; /**< pointer to next read location */
- blt_int8u *writeptr; /**< pointer to next free location */
- blt_int8u length; /**< number of buffer elements */
- blt_int8u entries; /**< # of full buffer elements */
- blt_int8u handle; /**< handle of the buffer */
- struct t_fifo_ctrl *fifoctrlptr; /**< pointer to free buffer control */
-} tFifoCtrl;
-
-/** \brief Structure type for a fifo pipe. */
-typedef struct
-{
- blt_int8u handle; /**< fifo handle */
- blt_int8u data[FIFO_PIPE_SIZE]; /**< fifo data buffer */
-} tFifoPipe; /**< USB pipe fifo type */
+/* The TinyUSB port was modified to support polling mode operation, needed by the
+ * bootloader. Verify that polling mode was actually enabled in the configuration header.
+ */
+#if (CFG_TUSB_POLLING_ENABLED <= 0)
+#error "CFG_TUSB_POLLING_ENABLED must be > 0"
+#endif
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static blt_bool UsbReceiveByte(blt_int8u *data);
-static blt_bool UsbTransmitByte(blt_int8u data);
-static void UsbTransmitPipeBulkIN(void);
-static void UsbReceivePipeBulkOUT(blt_int8u *data, blt_int32u len);
-static void UsbFifoMgrInit(void);
-static blt_int8u UsbFifoMgrCreate(blt_int8u *buffer, blt_int8u length);
-static blt_bool UsbFifoMgrWrite(blt_int8u handle, blt_int8u data);
-static blt_bool UsbFifoMgrRead(blt_int8u handle, blt_int8u *data);
-static blt_int8u UsbFifoMgrScan(blt_int8u handle);
-
-
-/****************************************************************************************
-* Local data declarations
-****************************************************************************************/
-/** \brief Local variable that holds the fifo control structures. */
-static tFifoCtrl fifoCtrl[FIFO_MAX_BUFFERS];
-/** \brief Local pointer that points to the next free fifo control structure. */
-static tFifoCtrl *fifoCtrlFree;
-/** \brief Fifo pipe used for the bulk in endpoint. */
-static tFifoPipe fifoPipeBulkIN;
-/** \brief Fifo pipe used for the bulk out endpoint. */
-static tFifoPipe fifoPipeBulkOUT;
-/** \brief Holds a handle to the bulk device instance. */
-static tBulkInstance *instanceHandle;
/************************************************************************************//**
@@ -128,20 +76,8 @@ static tBulkInstance *instanceHandle;
****************************************************************************************/
void UsbInit(void)
{
- /* initialize the FIFO manager */
- UsbFifoMgrInit();
- /* place 2 buffers under FIFO management */
- fifoPipeBulkIN.handle = UsbFifoMgrCreate(fifoPipeBulkIN.data, FIFO_PIPE_SIZE);
- fifoPipeBulkOUT.handle = UsbFifoMgrCreate(fifoPipeBulkOUT.data, FIFO_PIPE_SIZE);
- /* validate fifo handles */
- ASSERT_RT((fifoPipeBulkIN.handle != FIFO_ERR_INVALID_HANDLE) && \
- (fifoPipeBulkOUT.handle != FIFO_ERR_INVALID_HANDLE));
- /* initialize the transmit and receive buffers */
- USBBufferInit(&g_sTxBuffer);
- USBBufferInit(&g_sRxBuffer);
- /* pass our device information to the USB library and place the device on the bus */
- instanceHandle = USBDBulkInit(0, &g_sBulkDevice);
- ASSERT_RT(instanceHandle != BLT_NULL);
+ /* initialize the TinyUSB device stack on the configured roothub port */
+ tud_init(BOARD_TUD_RHPORT);
/* extend the time that the backdoor is open in case the default timed backdoor
* mechanism is used.
*/
@@ -161,10 +97,8 @@ void UsbInit(void)
****************************************************************************************/
void UsbFree(void)
{
- /* shut down the bulk device */
- USBDBulkTerm(instanceHandle);
- /* disconnect the USB device from the USB host */
- UsbConnectHook(BLT_FALSE);
+ /* disconnect the TinyUSB device stack.*/
+ tud_disconnect();
} /*** end of UsbFree ***/
@@ -177,28 +111,19 @@ void UsbFree(void)
****************************************************************************************/
void UsbTransmitPacket(blt_int8u *data, blt_int8u len)
{
- blt_int16u data_index;
- blt_bool result;
+ blt_int32u result;
- /* verify validity of the len-parameter */
+ /* verify validity of the len-paramenter */
ASSERT_RT(len <= BOOT_COM_USB_TX_MAX_DATA);
/* first transmit the length of the packet */
- result = UsbTransmitByte(len);
- ASSERT_RT(result == BLT_TRUE);
-
- /* transmit all the packet bytes one-by-one */
- for (data_index = 0; data_index < len; data_index++)
- {
- /* keep the watchdog happy */
- CopService();
- /* write byte */
- result = UsbTransmitByte(data[data_index]);
- ASSERT_RT(result == BLT_TRUE);
- }
-
- /* start the transmission */
- UsbTransmitPipeBulkIN();
+ result = tud_vendor_write(&len, 1);
+ ASSERT_RT(result == 1);
+ /* next transmit the actual packet bytes */
+ result = tud_vendor_write(data, len);
+ ASSERT_RT(result == len);
+ /* make sure the transmission starts, even if the endpoint buffer is not yet full */
+ tud_vendor_flush();
} /*** end of UsbTransmitPacket ***/
@@ -215,8 +140,11 @@ blt_bool UsbReceivePacket(blt_int8u *data, blt_int8u *len)
static blt_int8u xcpCtoRxLength;
static blt_bool xcpCtoRxInProgress = BLT_FALSE;
- /* poll for USB events */
- USB0DeviceIntHandler();
+ /* poll for USB interrupt flags to process USB releated event and run the USB device
+ * stack task.
+ */
+ tud_int_handler(BOARD_TUD_RHPORT);
+ tud_task();
/* start of cto packet received? */
if (xcpCtoRxInProgress == BLT_FALSE)
@@ -269,346 +197,71 @@ blt_bool UsbReceivePacket(blt_int8u *data, blt_int8u *len)
****************************************************************************************/
static blt_bool UsbReceiveByte(blt_int8u *data)
{
- blt_bool result;
-
- /* obtain data from the fifo */
- result = UsbFifoMgrRead(fifoPipeBulkOUT.handle, data);
- return result;
-} /*** end of UsbReceiveByte ***/
-
-
-/************************************************************************************//**
-** \brief Transmits a communication interface byte.
-** \param data Value of byte that is to be transmitted.
-** \return BLT_TRUE if the byte was transmitted, BLT_FALSE otherwise.
-**
-****************************************************************************************/
-static blt_bool UsbTransmitByte(blt_int8u data)
-{
- blt_bool result;
-
- /* write data from to fifo */
- result = UsbFifoMgrWrite(fifoPipeBulkIN.handle, data);
- return result;
-} /*** end of UsbTransmitByte ***/
-
-
-/************************************************************************************//**
-** \brief Checks if there is still data left to transmit and if so submits it
-** for transmission with the USB endpoint.
-** \return none.
-**
-****************************************************************************************/
-static void UsbTransmitPipeBulkIN(void)
-{
- tUSBRingBufObject txRing;
- blt_int32u txSpace;
- blt_int32u txWriteIdx;
- blt_int8u nr_of_bytes_for_tx_endpoint;
- blt_int8u byte_counter;
- blt_int8u byte_value;
- blt_bool result;
-
- /* read how many bytes should be transmitted */
- nr_of_bytes_for_tx_endpoint = UsbFifoMgrScan(fifoPipeBulkIN.handle);
- /* only continue if there is actually data left to transmit */
- if (nr_of_bytes_for_tx_endpoint == 0)
- {
- return;
- }
- /* get information about the USB transmit buffer */
- USBBufferInfoGet(&g_sTxBuffer, &txRing);
- /* determine how many bytes will still fit in the tx buffer */
- txSpace = USBBufferSpaceAvailable(&g_sTxBuffer);
- /* only transmit the amount of bytes that will fit in the tx buffer */
- if (nr_of_bytes_for_tx_endpoint > txSpace)
- {
- nr_of_bytes_for_tx_endpoint = txSpace;
- }
- /* determine write index for the tx buffer */
- txWriteIdx = txRing.ui32WriteIndex;
-
- /* copy the transmit data to the transmit buffer */
- for (byte_counter=0; byte_counter < nr_of_bytes_for_tx_endpoint; byte_counter++)
- {
- /* obtain data from the fifo */
- result = UsbFifoMgrRead(fifoPipeBulkIN.handle, &byte_value);
- ASSERT_RT(result == BLT_TRUE);
- /* store it in the transmit buffer */
- g_pui8USBTxBuffer[txWriteIdx] = byte_value;
- /* increment index with wrapping */
- txWriteIdx++;
- if (txWriteIdx >= BULK_BUFFER_SIZE)
- {
- txWriteIdx = 0;
- }
- }
- /* inform the usb library that new data are ready for transmission */
- USBBufferDataWritten(&g_sTxBuffer, nr_of_bytes_for_tx_endpoint);
-} /*** end of UsbTransmitPipeBulkIN ***/
-
-
-/************************************************************************************//**
-** \brief Stores data that was received on the Bulk OUT pipe in the fifo.
-** \param data Pointer to buffer with the newly received data
-** \param len Number of received data bytes.
-** \return none.
-**
-****************************************************************************************/
-static void UsbReceivePipeBulkOUT(blt_int8u *data, blt_int32u len)
-{
- blt_int32u byte_counter;
- blt_bool result;
- blt_int32u rxReadIdx;
-
-
- /* determine read index for the rx buffer */
- rxReadIdx = (uint32_t)(data - g_pui8USBRxBuffer);
-
- /* store the received data in the reception fifo */
- for (byte_counter=0; byte_counter= BULK_BUFFER_SIZE)
- {
- rxReadIdx = 0;
- }
- }
-} /*** end of UsbReceivePipeBulkOUT ***/
-
-
-/************************************************************************************//**
-** \brief Handles bulk driver notifications related to the transmit channel (data to
-** the USB host).
-** \param pvCBData is the client-supplied callback pointer for this channel.
-** \param ui32Event identifies the event we are being notified about.
-** \param ui32MsgValue is an event-specific value.
-** \param pvMsgData is an event-specific pointer.
-** \return The return value is event-specific.
-**
-****************************************************************************************/
-uint32_t UsbBulkTxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, void *pvMsgData)
-{
- if (ui32Event == USB_EVENT_TX_COMPLETE)
- {
- /* check if more data is waiting to be transmitted */
- UsbTransmitPipeBulkIN();
- }
- return 0;
-} /*** end of UsbBulkTxHandler ***/
-
+ blt_bool result = BLT_FALSE;
+ blt_int32u count;
-/************************************************************************************//**
-** \brief Handles bulk driver notifications related to the receive channel (data from
-** the USB host).
-** \param pvCBData is the client-supplied callback pointer for this channel.
-** \param ui32Event identifies the event we are being notified about.
-** \param ui32MsgValue is an event-specific value.
-** \param pvMsgData is an event-specific pointer.
-** \return The return value is event-specific.
-**
-****************************************************************************************/
-uint32_t UsbBulkRxHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, void *pvMsgData)
-{
- /* which event are we being sent? */
- switch (ui32Event)
+ /* USB received data available? */
+ if (tud_vendor_available())
{
- /* we are connected to a host and communication is now possible */
- case USB_EVENT_CONNECTED:
- {
- /* flush our buffers */
- USBBufferFlush(&g_sTxBuffer);
- USBBufferFlush(&g_sRxBuffer);
- break;
- }
-
- /* the host has disconnected */
- case USB_EVENT_DISCONNECTED:
+ /* read the next byte from the internal USB reception buffer */
+ count = tud_vendor_read(data, 1);
+ /* check read result */
+ if (count == 1)
{
- break;
+ result = BLT_TRUE;
}
-
- /* a new packet has been received */
- case USB_EVENT_RX_AVAILABLE:
- {
- /* handle all newly received bytes */
- UsbReceivePipeBulkOUT(pvMsgData, ui32MsgValue);
- return ui32MsgValue;
- }
-
- /* ignore SUSPEND and RESUME for now */
- case USB_EVENT_SUSPEND:
- /* power-off system clocks and power */
- UsbEnterLowPowerModeHook();
- break;
-
- case USB_EVENT_RESUME:
- /* restore power and system clocks */
- UsbLeaveLowPowerModeHook();
- break;
-
- /* ignore all other events and return 0 */
- default:
- break;
}
-
- return 0;
-} /*** end of UsbBulkRxHandler ***/
+ /* give the result back to the caller */
+ return result;
+} /*** end of UsbReceiveByte ***/
/************************************************************************************//**
-** \brief Initializes the fifo manager. Each controlled fifo is assigned a
-** unique handle, which is the same as its index into fifoCtrl[]. Each
-** controlled fifo holds a pointer to the next free fifo control.
-** For the last fifo in fifoCtrl[] this one is set to a null-pointer as
-** an out of fifo control indicator. Function should be called once
-** before any of the other fifo management functions are called.
-** \return none.
+** \brief TinyUSB stack callback invoked then the USB device is mounted.
**
****************************************************************************************/
-static void UsbFifoMgrInit(void)
+void tud_mount_cb(void)
{
- blt_int8u i;
- tFifoCtrl *pbc1, *pbc2;
-
- pbc1 = &fifoCtrl[0];
- pbc2 = &fifoCtrl[1];
- /* assign fifo handles and pointer to next free fifo */
- for (i = 0; i < (FIFO_MAX_BUFFERS - 1); i++)
- {
- pbc1->handle = i;
- pbc1->fifoctrlptr = pbc2;
- pbc1++;
- pbc2++;
- }
- /* initialize handle for the last one and use null-pointer for the next free fifo */
- pbc1->handle = i;
- pbc1->fifoctrlptr = (tFifoCtrl *)0;
- fifoCtrlFree = &fifoCtrl[0];
-} /*** end of UsbFifoMgrInit ***/
+ /* inform application about the connect event */
+ UsbConnectHook(BLT_TRUE);
+} /*** end of tud_mount_cb ***/
/************************************************************************************//**
-** \brief Places a data storage array under fifo management control. A handle
-** for identifying the fifo in subsequent fifo management function
-** calls is returned, if successful.
-** \param buffer Pointer to the first element in the data storage fifo.
-** \param length Maximum number of data elements that can be stored in the fifo.
-** \return Fifo handle if successfull, or FIFO_ERR_INVALID_HANDLE.
+** \brief TinyUSB stack callback invoked then the USB device is unmounted.
**
****************************************************************************************/
-static blt_int8u UsbFifoMgrCreate(blt_int8u *buffer, blt_int8u length)
+void tud_umount_cb(void)
{
- tFifoCtrl *pbc;
-
- /* first determine if these is still a free fifo control available */
- if (fifoCtrlFree == (tFifoCtrl *)0)
- {
- return FIFO_ERR_INVALID_HANDLE;
- }
- /* store pointer to free fifo and update pointer to next free one */
- pbc = fifoCtrlFree;
- fifoCtrlFree = pbc->fifoctrlptr;
-
- /* initialize the buffer control */
- pbc->length = length;
- pbc->readptr = buffer;
- pbc->writeptr = buffer;
- pbc->entries = 0;
- pbc->startptr = buffer;
- pbc->endptr = (blt_int8u *)(buffer + length - 1);
-
- /* return the handle to the successfully created fifo control */
- return pbc->handle;
-} /*** end of UsbFifoMgrCreate ***/
+ /* inform application about the disconnect event */
+ UsbConnectHook(BLT_FALSE);
+} /*** end of tud_mount_cb ***/
/************************************************************************************//**
-** \brief Stores data in the fifo.
-** \param handle Identifies the fifo to write data to.
-** \param data Pointer to the data that is to be written to the fifo.
-** \return BLT_TRUE if the data was successfully stored in the fifo, BLT_FALSE
-** otherwise.
+** \brief TinyUSB stack callback invoked then the USB bus is suspended. Within 7ms
+** the device must draw an average of current less than 2.5 mA from the bus.
+** \param remote_wakeup_en True if the host allows us to perform a remote wakeup.
**
****************************************************************************************/
-static blt_bool UsbFifoMgrWrite(blt_int8u handle, blt_int8u data)
+void tud_suspend_cb(bool remote_wakeup_en)
{
- /* check the validity of the handle parameter */
- ASSERT_RT(handle < FIFO_MAX_BUFFERS);
- /* check if fifo is full */
- if (fifoCtrl[handle].entries == fifoCtrl[handle].length)
- {
- return BLT_FALSE;
- }
- /* copy data to fifo */
- *fifoCtrl[handle].writeptr = data;
- /* data written so update number of entries */
- fifoCtrl[handle].entries++;
- /* update write pointer */
- fifoCtrl[handle].writeptr++;
- /* check end of fifo */
- if (fifoCtrl[handle].writeptr > fifoCtrl[handle].endptr)
- {
- /* set write pointer to start of the cyclic fifo */
- fifoCtrl[handle].writeptr = fifoCtrl[handle].startptr;
- }
- /* still here so all is okay */
- return BLT_TRUE;
-} /*** end of UsbFifoMgrWrite ***/
+ (void) remote_wakeup_en;
-
-/************************************************************************************//**
-** \brief Retrieves data from the fifo.
-** \param handle Identifies the fifo to read data from.
-** \param data Pointer to where the read data is to be stored.
-** \return BLT_TRUE if the data was successfully read from the fifo, BLT_FALSE
-** otherwise.
-**
-****************************************************************************************/
-static blt_bool UsbFifoMgrRead(blt_int8u handle, blt_int8u *data)
-{
- /* check the validity of the handle parameter */
- ASSERT_RT(handle < FIFO_MAX_BUFFERS);
- /* check if fifo is empty */
- if (fifoCtrl[handle].entries == 0)
- {
- return BLT_FALSE;
- }
- /* read the data */
- *data = *fifoCtrl[handle].readptr;
- /* data read so update number of entries */
- fifoCtrl[handle].entries--;
- /* update read pointer */
- fifoCtrl[handle].readptr++;
- /* check end of fifo */
- if (fifoCtrl[handle].readptr > fifoCtrl[handle].endptr)
- {
- /* set read pointer to start of the cyclic fifo */
- fifoCtrl[handle].readptr = fifoCtrl[handle].startptr;
- }
- /* still here so all is good */
- return BLT_TRUE;
-} /*** end of UsbFifoMgrRead ***/
+ /* Inform application that the USB entered low power mode. */
+ UsbEnterLowPowerModeHook();
+} /*** end of tud_suspend_cb ***/
/************************************************************************************//**
-** \brief Returns the number of data entries currently present in the fifo.
-** \param handle Identifies the fifo that is to be scanned.
-** \return Number of data entries in the fifo if successful, otherwise 0.
+** \brief TinyUSB stack callback invoked then the USB bus is resumed.
**
****************************************************************************************/
-static blt_int8u UsbFifoMgrScan(blt_int8u handle)
+void tud_resume_cb(void)
{
- /* check the validity of the handle parameter */
- ASSERT_RT(handle < FIFO_MAX_BUFFERS);
- /* read and return the number of data entries */
- return fifoCtrl[handle].entries;
-} /*** end of UsbFifoMgrScan ***/
+ /* Inform application that the USB left low power mode. */
+ UsbLeaveLowPowerModeHook();
+} /*** end of tud_resume_cb ***/
#endif /* BOOT_COM_USB_ENABLE > 0 */